| Index: content/browser/browser_main_runner.cc
|
| diff --git a/content/browser/browser_main_runner.cc b/content/browser/browser_main_runner.cc
|
| index cca1466d9bbe9b191748203a2b4182e43fcb20cf..f97318a690657892c4676b1b1d454f9dd75f8a1b 100644
|
| --- a/content/browser/browser_main_runner.cc
|
| +++ b/content/browser/browser_main_runner.cc
|
| @@ -29,75 +29,82 @@ namespace content {
|
|
|
| class BrowserMainRunnerImpl : public BrowserMainRunner {
|
| public:
|
| - BrowserMainRunnerImpl() : is_initialized_(false), is_shutdown_(false) {}
|
| + BrowserMainRunnerImpl()
|
| + : initialization_started_(false), is_shutdown_(false) {}
|
|
|
| virtual ~BrowserMainRunnerImpl() {
|
| - if (is_initialized_ && !is_shutdown_)
|
| + if (initialization_started_ && !is_shutdown_)
|
| Shutdown();
|
| }
|
|
|
| - virtual int Initialize(const MainFunctionParams& parameters)
|
| - OVERRIDE {
|
| - TRACE_EVENT0("startup", "BrowserMainRunnerImpl::Initialize")
|
| - is_initialized_ = true;
|
| + virtual int Initialize(const MainFunctionParams& parameters) OVERRIDE {
|
| + TRACE_EVENT0("startup", "BrowserMainRunnerImpl::Initialize");
|
| + // On Android we normally initialize the browser in a series of UI thread
|
| + // tasks. While this is happening a second request can come from the OS or
|
| + // another application to start the browser. If this happens then we must
|
| + // not run these parts of initialization twice.
|
| + if (!initialization_started_) {
|
| + initialization_started_ = true;
|
|
|
| #if !defined(OS_IOS)
|
| - if (parameters.command_line.HasSwitch(switches::kWaitForDebugger))
|
| - base::debug::WaitForDebugger(60, true);
|
| + if (parameters.command_line.HasSwitch(switches::kWaitForDebugger))
|
| + base::debug::WaitForDebugger(60, true);
|
| #endif
|
|
|
| #if defined(OS_WIN)
|
| - if (parameters.command_line.HasSwitch(
|
| - switches::kEnableTextServicesFramework)) {
|
| - base::win::SetForceToUseTSF();
|
| - } else if (base::win::GetVersion() < base::win::VERSION_VISTA) {
|
| - // When "Extend support of advanced text services to all programs"
|
| - // (a.k.a. Cicero Unaware Application Support; CUAS) is enabled on
|
| - // Windows XP and handwriting modules shipped with Office 2003 are
|
| - // installed, "penjpn.dll" and "skchui.dll" will be loaded and then crash
|
| - // unless a user installs Office 2003 SP3. To prevent these modules from
|
| - // being loaded, disable TSF entirely. crbug/160914.
|
| - // TODO(yukawa): Add a high-level wrapper for this instead of calling
|
| - // Win32 API here directly.
|
| - ImmDisableTextFrameService(static_cast<DWORD>(-1));
|
| - }
|
| + if (parameters.command_line.HasSwitch(
|
| + switches::kEnableTextServicesFramework)) {
|
| + base::win::SetForceToUseTSF();
|
| + } else if (base::win::GetVersion() < base::win::VERSION_VISTA) {
|
| + // When "Extend support of advanced text services to all programs"
|
| + // (a.k.a. Cicero Unaware Application Support; CUAS) is enabled on
|
| + // Windows XP and handwriting modules shipped with Office 2003 are
|
| + // installed, "penjpn.dll" and "skchui.dll" will be loaded and then
|
| + // crash
|
| + // unless a user installs Office 2003 SP3. To prevent these modules from
|
| + // being loaded, disable TSF entirely. crbug/160914.
|
| + // TODO(yukawa): Add a high-level wrapper for this instead of calling
|
| + // Win32 API here directly.
|
| + ImmDisableTextFrameService(static_cast<DWORD>(-1));
|
| + }
|
| #endif // OS_WIN
|
|
|
| - base::StatisticsRecorder::Initialize();
|
| + base::StatisticsRecorder::Initialize();
|
|
|
| - notification_service_.reset(new NotificationServiceImpl);
|
| + notification_service_.reset(new NotificationServiceImpl);
|
|
|
| #if defined(OS_WIN)
|
| - // Ole must be initialized before starting message pump, so that TSF
|
| - // (Text Services Framework) module can interact with the message pump
|
| - // on Windows 8 Metro mode.
|
| - ole_initializer_.reset(new ui::ScopedOleInitializer);
|
| + // Ole must be initialized before starting message pump, so that TSF
|
| + // (Text Services Framework) module can interact with the message pump
|
| + // on Windows 8 Metro mode.
|
| + ole_initializer_.reset(new ui::ScopedOleInitializer);
|
| #endif // OS_WIN
|
|
|
| - main_loop_.reset(new BrowserMainLoop(parameters));
|
| + main_loop_.reset(new BrowserMainLoop(parameters));
|
|
|
| - main_loop_->Init();
|
| + main_loop_->Init();
|
|
|
| - main_loop_->EarlyInitialization();
|
| + main_loop_->EarlyInitialization();
|
|
|
| - // Must happen before we try to use a message loop or display any UI.
|
| - main_loop_->InitializeToolkit();
|
| + // Must happen before we try to use a message loop or display any UI.
|
| + main_loop_->InitializeToolkit();
|
|
|
| - main_loop_->MainMessageLoopStart();
|
| + main_loop_->MainMessageLoopStart();
|
|
|
| - // WARNING: If we get a WM_ENDSESSION, objects created on the stack here
|
| - // are NOT deleted. If you need something to run during WM_ENDSESSION add it
|
| - // to browser_shutdown::Shutdown or BrowserProcess::EndSession.
|
| +// WARNING: If we get a WM_ENDSESSION, objects created on the stack here
|
| +// are NOT deleted. If you need something to run during WM_ENDSESSION add it
|
| +// to browser_shutdown::Shutdown or BrowserProcess::EndSession.
|
|
|
| #if defined(OS_WIN) && !defined(NO_TCMALLOC)
|
| - // When linking shared libraries, NO_TCMALLOC is defined, and dynamic
|
| - // allocator selection is not supported.
|
| + // When linking shared libraries, NO_TCMALLOC is defined, and dynamic
|
| + // allocator selection is not supported.
|
|
|
| - // Make this call before going multithreaded, or spawning any subprocesses.
|
| - base::allocator::SetupSubprocessAllocator();
|
| + // Make this call before going multithreaded, or spawning any
|
| + // subprocesses.
|
| + base::allocator::SetupSubprocessAllocator();
|
| #endif
|
| - ui::InitializeInputMethod();
|
| -
|
| + ui::InitializeInputMethod();
|
| + }
|
| main_loop_->CreateStartupTasks();
|
| int result_code = main_loop_->GetResultCode();
|
| if (result_code > 0)
|
| @@ -108,14 +115,14 @@ class BrowserMainRunnerImpl : public BrowserMainRunner {
|
| }
|
|
|
| virtual int Run() OVERRIDE {
|
| - DCHECK(is_initialized_);
|
| + DCHECK(initialization_started_);
|
| DCHECK(!is_shutdown_);
|
| main_loop_->RunMainMessageLoopParts();
|
| return main_loop_->GetResultCode();
|
| }
|
|
|
| virtual void Shutdown() OVERRIDE {
|
| - DCHECK(is_initialized_);
|
| + DCHECK(initialization_started_);
|
| DCHECK(!is_shutdown_);
|
| g_exited_main_message_loop = true;
|
|
|
| @@ -134,8 +141,8 @@ class BrowserMainRunnerImpl : public BrowserMainRunner {
|
| }
|
|
|
| protected:
|
| - // True if the runner has been initialized.
|
| - bool is_initialized_;
|
| + // True if we have started to initialize the runner.
|
| + bool initialization_started_;
|
|
|
| // True if the runner has been shut down.
|
| bool is_shutdown_;
|
|
|