| Index: content/browser/browser_main_loop.cc
|
| diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
|
| index 0ae6be228c791384f600f7aed3aaa07f8d0dfb0d..2059d2a040107f26c1a5b6e2d2c5e0515554db80 100644
|
| --- a/content/browser/browser_main_loop.cc
|
| +++ b/content/browser/browser_main_loop.cc
|
| @@ -158,9 +158,10 @@ BrowserMainLoop::BrowserMainLoop(const content::MainFunctionParams& parameters)
|
| }
|
|
|
| BrowserMainLoop::~BrowserMainLoop() {
|
| - // Release/destroy parts here, before OleUninitialize() and before other
|
| - // members are destroyed (in particular main_message_loop_).
|
| - parts_.reset();
|
| + // Destroy added parts in reverse order.
|
| + for (int i = static_cast<int>(parts_list_.size())-1; i >= 0; --i)
|
| + delete parts_list_[i];
|
| + parts_list_.clear();
|
|
|
| #if defined(OS_WIN)
|
| OleUninitialize();
|
| @@ -168,15 +169,15 @@ BrowserMainLoop::~BrowserMainLoop() {
|
| }
|
|
|
| void BrowserMainLoop::Init() {
|
| - parts_.reset(
|
| - GetContentClient()->browser()->CreateBrowserMainParts(parameters_));
|
| + GetContentClient()->browser()->CreateBrowserMainParts(
|
| + parameters_, &parts_list_);
|
| }
|
|
|
| // BrowserMainLoop stages ==================================================
|
|
|
| void BrowserMainLoop::EarlyInitialization() {
|
| - if (parts_.get())
|
| - parts_->PreEarlyInitialization();
|
| + for (size_t i = 0; i < parts_list_.size(); ++i)
|
| + parts_list_[i]->PreEarlyInitialization();
|
|
|
| #if defined(OS_WIN)
|
| net::EnsureWinsockInit();
|
| @@ -222,13 +223,13 @@ void BrowserMainLoop::EarlyInitialization() {
|
| if (parsed_command_line_.HasSwitch(switches::kEnableTcpFastOpen))
|
| net::set_tcp_fastopen_enabled(true);
|
|
|
| - if (parts_.get())
|
| - parts_->PostEarlyInitialization();
|
| + for (size_t i = 0; i < parts_list_.size(); ++i)
|
| + parts_list_[i]->PostEarlyInitialization();
|
| }
|
|
|
| void BrowserMainLoop::MainMessageLoopStart() {
|
| - if (parts_.get())
|
| - parts_->PreMainMessageLoopStart();
|
| + for (size_t i = 0; i < parts_list_.size(); ++i)
|
| + parts_list_[i]->PreMainMessageLoopStart();
|
|
|
| #if defined(OS_WIN)
|
| // If we're running tests (ui_task is non-null), then the ResourceBundle
|
| @@ -259,24 +260,31 @@ void BrowserMainLoop::MainMessageLoopStart() {
|
| system_message_window_.reset(new SystemMessageWindowWin);
|
| #endif
|
|
|
| - if (parts_.get())
|
| - parts_->PostMainMessageLoopStart();
|
| + for (size_t i = 0; i < parts_list_.size(); ++i)
|
| + parts_list_[i]->PostMainMessageLoopStart();
|
| }
|
|
|
| void BrowserMainLoop::RunMainMessageLoopParts(
|
| bool* completed_main_message_loop) {
|
| - if (parts_.get())
|
| - parts_->PreMainMessageLoopRun();
|
| + for (size_t i = 0; i < parts_list_.size(); ++i)
|
| + parts_list_[i]->PreMainMessageLoopRun();
|
|
|
| TRACE_EVENT_BEGIN_ETW("BrowserMain:MESSAGE_LOOP", 0, "");
|
| // If the UI thread blocks, the whole UI is unresponsive.
|
| // Do not allow disk IO from the UI thread.
|
| base::ThreadRestrictions::SetIOAllowed(false);
|
|
|
| + // Iterate through each of the parts. If any of them ran the main
|
| + // message loop then they should return |true|. Otherwise
|
| + // BrowserMainLoop::MainMessageLoopRun loop will be run.
|
| bool ran_main_loop = false;
|
| - if (parts_.get())
|
| - ran_main_loop = parts_->MainMessageLoopRun(&result_code_);
|
| -
|
| + for (size_t i = 0; i < parts_list_.size(); ++i) {
|
| + int result_code = result_code_;
|
| + if (parts_list_[i]->MainMessageLoopRun(&result_code)) {
|
| + ran_main_loop = true;
|
| + result_code_ = result_code;
|
| + }
|
| + }
|
| if (!ran_main_loop)
|
| MainMessageLoopRun();
|
|
|
| @@ -285,8 +293,8 @@ void BrowserMainLoop::RunMainMessageLoopParts(
|
| if (completed_main_message_loop)
|
| *completed_main_message_loop = true;
|
|
|
| - if (parts_.get())
|
| - parts_->PostMainMessageLoopRun();
|
| + for (size_t i = 0; i < parts_list_.size(); ++i)
|
| + parts_list_[i]->PostMainMessageLoopRun();
|
| }
|
|
|
| void BrowserMainLoop::InitializeMainThread() {
|
| @@ -335,8 +343,8 @@ void BrowserMainLoop::InitializeToolkit() {
|
| LOG_GETLASTERROR(FATAL);
|
| #endif
|
|
|
| - if (parts_.get())
|
| - parts_->ToolkitInitialized();
|
| + for (size_t i = 0; i < parts_list_.size(); ++i)
|
| + parts_list_[i]->ToolkitInitialized();
|
| }
|
|
|
| void BrowserMainLoop::MainMessageLoopRun() {
|
|
|