1 // Copyright 2013 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 "apps/shell/browser/shell_browser_main_parts.h" 6 7 #include "apps/shell/browser/shell_browser_context.h" 8 #include "apps/shell/browser/shell_browser_main_delegate.h" 9 #include "apps/shell/browser/shell_desktop_controller.h" 10 #include "apps/shell/browser/shell_extension_system.h" 11 #include "apps/shell/browser/shell_extension_system_factory.h" 12 #include "apps/shell/browser/shell_extensions_browser_client.h" 13 #include "apps/shell/common/shell_extensions_client.h" 14 #include "base/run_loop.h" 15 #include "components/keyed_service/content/browser_context_dependency_manager.h" 16 #include "content/public/common/result_codes.h" 17 #include "content/shell/browser/shell_devtools_delegate.h" 18 #include "content/shell/browser/shell_net_log.h" 19 #include "extensions/browser/browser_context_keyed_service_factories.h" 20 #include "extensions/browser/extension_system.h" 21 #include "ui/aura/window_tree_host.h" 22 #include "ui/base/ime/input_method_initializer.h" 23 #include "ui/base/resource/resource_bundle.h" 24 25 #if defined(OS_CHROMEOS) 26 #include "apps/shell/browser/shell_network_controller_chromeos.h" 27 #include "chromeos/dbus/dbus_thread_manager.h" 28 #endif 29 30 using content::BrowserContext; 31 using extensions::Extension; 32 using extensions::ExtensionSystem; 33 using extensions::ShellExtensionSystem; 34 35 namespace { 36 37 // Register additional KeyedService factories here. See 38 // ChromeBrowserMainExtraPartsProfiles for details. 39 void EnsureBrowserContextKeyedServiceFactoriesBuilt() { 40 extensions::EnsureBrowserContextKeyedServiceFactoriesBuilt(); 41 extensions::ShellExtensionSystemFactory::GetInstance(); 42 } 43 44 } // namespace 45 46 namespace apps { 47 48 ShellBrowserMainParts::ShellBrowserMainParts( 49 const content::MainFunctionParams& parameters, 50 ShellBrowserMainDelegate* browser_main_delegate) 51 : extension_system_(NULL), 52 parameters_(parameters), 53 run_message_loop_(true), 54 browser_main_delegate_(browser_main_delegate) { 55 } 56 57 ShellBrowserMainParts::~ShellBrowserMainParts() { 58 } 59 60 void ShellBrowserMainParts::PreMainMessageLoopStart() { 61 // TODO(jamescook): Initialize touch here? 62 } 63 64 void ShellBrowserMainParts::PostMainMessageLoopStart() { 65 #if defined(OS_CHROMEOS) 66 chromeos::DBusThreadManager::Initialize(); 67 network_controller_.reset(new ShellNetworkController); 68 #else 69 // Non-Chrome OS platforms are for developer convenience, so use a test IME. 70 ui::InitializeInputMethodForTesting(); 71 #endif 72 } 73 74 void ShellBrowserMainParts::PreEarlyInitialization() { 75 } 76 77 int ShellBrowserMainParts::PreCreateThreads() { 78 // TODO(jamescook): Initialize chromeos::CrosSettings here? 79 80 // Return no error. 81 return 0; 82 } 83 84 void ShellBrowserMainParts::PreMainMessageLoopRun() { 85 // Initialize our "profile" equivalent. 86 browser_context_.reset(new ShellBrowserContext); 87 88 desktop_controller_.reset(browser_main_delegate_->CreateDesktopController()); 89 desktop_controller_->CreateRootWindow(); 90 91 // NOTE: Much of this is culled from chrome/test/base/chrome_test_suite.cc 92 // TODO(jamescook): Initialize chromeos::UserManager. 93 net_log_.reset(new content::ShellNetLog("app_shell")); 94 95 extensions_client_.reset(new ShellExtensionsClient()); 96 extensions::ExtensionsClient::Set(extensions_client_.get()); 97 98 extensions_browser_client_.reset( 99 new extensions::ShellExtensionsBrowserClient(browser_context_.get())); 100 extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get()); 101 102 // Create our custom ExtensionSystem first because other 103 // KeyedServices depend on it. 104 // TODO(yoz): Move this after EnsureBrowserContextKeyedServiceFactoriesBuilt. 105 CreateExtensionSystem(); 106 107 ::EnsureBrowserContextKeyedServiceFactoriesBuilt(); 108 BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices( 109 browser_context_.get()); 110 111 devtools_delegate_.reset( 112 new content::ShellDevToolsDelegate(browser_context_.get())); 113 if (parameters_.ui_task) { 114 // For running browser tests. 115 parameters_.ui_task->Run(); 116 delete parameters_.ui_task; 117 run_message_loop_ = false; 118 } else { 119 browser_main_delegate_->Start(browser_context_.get()); 120 } 121 } 122 123 bool ShellBrowserMainParts::MainMessageLoopRun(int* result_code) { 124 if (!run_message_loop_) 125 return true; 126 // TODO(yoz): just return false here? 127 base::RunLoop run_loop; 128 run_loop.Run(); 129 *result_code = content::RESULT_CODE_NORMAL_EXIT; 130 return true; 131 } 132 133 void ShellBrowserMainParts::PostMainMessageLoopRun() { 134 browser_main_delegate_->Shutdown(); 135 136 BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices( 137 browser_context_.get()); 138 extension_system_ = NULL; 139 extensions::ExtensionsBrowserClient::Set(NULL); 140 extensions_browser_client_.reset(); 141 browser_context_.reset(); 142 143 desktop_controller_.reset(); 144 } 145 146 void ShellBrowserMainParts::PostDestroyThreads() { 147 #if defined(OS_CHROMEOS) 148 network_controller_.reset(); 149 chromeos::DBusThreadManager::Shutdown(); 150 #endif 151 } 152 153 void ShellBrowserMainParts::CreateExtensionSystem() { 154 DCHECK(browser_context_); 155 extension_system_ = static_cast<ShellExtensionSystem*>( 156 ExtensionSystem::Get(browser_context_.get())); 157 extension_system_->InitForRegularProfile(true); 158 } 159 160 } // namespace apps 161