blob: ec23e55064dcda2b54ad92e49e7941aa3c4aa11d [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_WEB_INIT_WEB_MAIN_LOOP_H_
#define IOS_WEB_INIT_WEB_MAIN_LOOP_H_
#include <memory>
#include "base/functional/callback_helpers.h"
namespace web {
class CookieNotificationBridge;
class WebMainParts;
class WebThreadImpl;
class WebSubThread;
// Implements the main web loop stages called from WebMainRunner.
// See comments in web_main_parts.h for additional info.
class WebMainLoop {
public:
explicit WebMainLoop();
WebMainLoop(const WebMainLoop&) = delete;
WebMainLoop& operator=(const WebMainLoop&) = delete;
virtual ~WebMainLoop();
void Init();
void EarlyInitialization();
void CreateMainMessageLoop();
// Creates and starts running the tasks needed to complete startup.
void CreateStartupTasks();
// Performs the shutdown sequence, starting with PostMainMessageLoopRun
// through stopping threads to PostDestroyThreads.
void ShutdownThreadsAndCleanUp();
int GetResultCode() const { return result_code_; }
private:
void InitializeMainThread();
// Called just before creating the threads
int PreCreateThreads();
// Creates all secondary threads.
int CreateThreads();
// Called after creating the threads
int PostCreateThreads();
// Called right after the web threads have been started.
int WebThreadsStarted();
// Called just before attaching to the main message loop.
int PreMainMessageLoopRun();
// Members initialized on construction ---------------------------------------
int result_code_;
// True if the non-UI threads were created.
bool created_threads_;
// Members initialized in `CreateMainMessageLoop()` --------------------------
// The SingleThreadTaskExecutor and NetworkChangeNotifier are not owned by the
// WebMainLoop but still need to be destroyed in correct order so use
// ScopedClosureRunner.
base::ScopedClosureRunner destroy_task_executor_;
base::ScopedClosureRunner destroy_network_change_notifier_;
// Destroy parts_ before main_message_loop_ (required) and before other
// classes constructed in web (but after main_thread_).
std::unique_ptr<WebMainParts> parts_;
// Members initialized in `InitializeMainThread()` ---------------------------
// This must get destroyed after other threads that are created in parts_.
std::unique_ptr<WebThreadImpl> main_thread_;
// Members initialized in `CreateThreads()` ------------------------
std::unique_ptr<WebSubThread> io_thread_;
// Members initialized in `WebThreadsStarted()` --------------------------
std::unique_ptr<CookieNotificationBridge> cookie_notification_bridge_;
};
} // namespace web
#endif // IOS_WEB_INIT_WEB_MAIN_LOOP_H_