shell_browser_main_parts.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "extensions/shell/browser/shell_browser_main_parts.h" 6 7#include "base/command_line.h" 8#include "base/run_loop.h" 9#include "components/keyed_service/content/browser_context_dependency_manager.h" 10#include "components/omaha_query_params/omaha_query_params.h" 11#include "content/public/common/result_codes.h" 12#include "content/shell/browser/shell_devtools_delegate.h" 13#include "content/shell/browser/shell_net_log.h" 14#include "extensions/browser/browser_context_keyed_service_factories.h" 15#include "extensions/browser/extension_system.h" 16#include "extensions/shell/browser/shell_browser_context.h" 17#include "extensions/shell/browser/shell_browser_main_delegate.h" 18#include "extensions/shell/browser/shell_desktop_controller.h" 19#include "extensions/shell/browser/shell_extension_system.h" 20#include "extensions/shell/browser/shell_extension_system_factory.h" 21#include "extensions/shell/browser/shell_extensions_browser_client.h" 22#include "extensions/shell/browser/shell_omaha_query_params_delegate.h" 23#include "extensions/shell/common/shell_extensions_client.h" 24#include "extensions/shell/common/switches.h" 25#include "ui/aura/window_tree_host.h" 26#include "ui/base/ime/input_method_initializer.h" 27#include "ui/base/resource/resource_bundle.h" 28 29#if defined(OS_CHROMEOS) 30#include "chromeos/dbus/dbus_thread_manager.h" 31#include "extensions/shell/browser/shell_network_controller_chromeos.h" 32#endif 33 34#if !defined(DISABLE_NACL) 35#include "components/nacl/browser/nacl_browser.h" 36#include "components/nacl/browser/nacl_process_host.h" 37#include "content/public/browser/browser_thread.h" 38#include "extensions/shell/browser/shell_nacl_browser_delegate.h" 39#endif 40 41using content::BrowserContext; 42 43namespace { 44 45// Register additional KeyedService factories here. See 46// ChromeBrowserMainExtraPartsProfiles for details. 47void EnsureBrowserContextKeyedServiceFactoriesBuilt() { 48 extensions::EnsureBrowserContextKeyedServiceFactoriesBuilt(); 49 extensions::ShellExtensionSystemFactory::GetInstance(); 50} 51 52} // namespace 53 54namespace extensions { 55 56ShellBrowserMainParts::ShellBrowserMainParts( 57 const content::MainFunctionParams& parameters, 58 ShellBrowserMainDelegate* browser_main_delegate) 59 : extension_system_(NULL), 60 parameters_(parameters), 61 run_message_loop_(true), 62 browser_main_delegate_(browser_main_delegate) { 63} 64 65ShellBrowserMainParts::~ShellBrowserMainParts() { 66} 67 68void ShellBrowserMainParts::PreMainMessageLoopStart() { 69 // TODO(jamescook): Initialize touch here? 70} 71 72void ShellBrowserMainParts::PostMainMessageLoopStart() { 73#if defined(OS_CHROMEOS) 74 chromeos::DBusThreadManager::Initialize(); 75 network_controller_.reset(new ShellNetworkController( 76 base::CommandLine::ForCurrentProcess()->GetSwitchValueNative( 77 switches::kAppShellPreferredNetwork))); 78#else 79 // Non-Chrome OS platforms are for developer convenience, so use a test IME. 80 ui::InitializeInputMethodForTesting(); 81#endif 82} 83 84void ShellBrowserMainParts::PreEarlyInitialization() { 85} 86 87int ShellBrowserMainParts::PreCreateThreads() { 88 // TODO(jamescook): Initialize chromeos::CrosSettings here? 89 90 // Return no error. 91 return 0; 92} 93 94void ShellBrowserMainParts::PreMainMessageLoopRun() { 95 // Initialize our "profile" equivalent. 96 browser_context_.reset(new ShellBrowserContext); 97 98 desktop_controller_.reset(browser_main_delegate_->CreateDesktopController()); 99 desktop_controller_->CreateRootWindow(); 100 101 // NOTE: Much of this is culled from chrome/test/base/chrome_test_suite.cc 102 // TODO(jamescook): Initialize user_manager::UserManager. 103 net_log_.reset(new content::ShellNetLog("app_shell")); 104 105 extensions_client_.reset(new ShellExtensionsClient()); 106 ExtensionsClient::Set(extensions_client_.get()); 107 108 extensions_browser_client_.reset( 109 new ShellExtensionsBrowserClient(browser_context_.get())); 110 ExtensionsBrowserClient::Set(extensions_browser_client_.get()); 111 112 omaha_query_params_delegate_.reset(new ShellOmahaQueryParamsDelegate); 113 omaha_query_params::OmahaQueryParams::SetDelegate( 114 omaha_query_params_delegate_.get()); 115 116 // Create our custom ExtensionSystem first because other 117 // KeyedServices depend on it. 118 // TODO(yoz): Move this after EnsureBrowserContextKeyedServiceFactoriesBuilt. 119 CreateExtensionSystem(); 120 121 ::EnsureBrowserContextKeyedServiceFactoriesBuilt(); 122 BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices( 123 browser_context_.get()); 124 125#if !defined(DISABLE_NACL) 126 // Takes ownership. 127 nacl::NaClBrowser::SetDelegate( 128 new ShellNaClBrowserDelegate(browser_context_.get())); 129 content::BrowserThread::PostTask( 130 content::BrowserThread::IO, 131 FROM_HERE, 132 base::Bind(nacl::NaClProcessHost::EarlyStartup)); 133#endif 134 135 devtools_delegate_.reset( 136 new content::ShellDevToolsDelegate(browser_context_.get())); 137 if (parameters_.ui_task) { 138 // For running browser tests. 139 parameters_.ui_task->Run(); 140 delete parameters_.ui_task; 141 run_message_loop_ = false; 142 } else { 143 browser_main_delegate_->Start(browser_context_.get()); 144 } 145} 146 147bool ShellBrowserMainParts::MainMessageLoopRun(int* result_code) { 148 if (!run_message_loop_) 149 return true; 150 // TODO(yoz): just return false here? 151 base::RunLoop run_loop; 152 run_loop.Run(); 153 *result_code = content::RESULT_CODE_NORMAL_EXIT; 154 return true; 155} 156 157void ShellBrowserMainParts::PostMainMessageLoopRun() { 158 browser_main_delegate_->Shutdown(); 159 160 BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices( 161 browser_context_.get()); 162 extension_system_ = NULL; 163 ExtensionsBrowserClient::Set(NULL); 164 extensions_browser_client_.reset(); 165 browser_context_.reset(); 166 167 desktop_controller_.reset(); 168} 169 170void ShellBrowserMainParts::PostDestroyThreads() { 171#if defined(OS_CHROMEOS) 172 network_controller_.reset(); 173 chromeos::DBusThreadManager::Shutdown(); 174#endif 175} 176 177void ShellBrowserMainParts::CreateExtensionSystem() { 178 DCHECK(browser_context_); 179 extension_system_ = static_cast<ShellExtensionSystem*>( 180 ExtensionSystem::Get(browser_context_.get())); 181 extension_system_->InitForRegularProfile(true); 182} 183 184} // namespace extensions 185