shell_browser_main_parts.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_browser_main_parts.h" 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/command_line.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/run_loop.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/browser_context_dependency_manager.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/omaha_query_params/omaha_query_params.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/result_codes.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/shell/browser/shell_devtools_delegate.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/shell/browser/shell_net_log.h" 1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "extensions/browser/browser_context_keyed_service_factories.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_browser_context.h" 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_browser_main_delegate.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_desktop_controller.h" 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_extension_system.h" 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_extension_system_factory.h" 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_extensions_browser_client.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_omaha_query_params_delegate.h" 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/common/shell_extensions_client.h" 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/common/switches.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_tree_host.h" 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/base/ime/input_method_initializer.h" 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_CHROMEOS) 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chromeos/dbus/dbus_thread_manager.h" 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_network_controller_chromeos.h" 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::BrowserContext; 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Register additional KeyedService factories here. See 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// ChromeBrowserMainExtraPartsProfiles for details. 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void EnsureBrowserContextKeyedServiceFactoriesBuilt() { 4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) extensions::EnsureBrowserContextKeyedServiceFactoriesBuilt(); 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::ShellExtensionSystemFactory::GetInstance(); 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace extensions { 4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ShellBrowserMainParts::ShellBrowserMainParts( 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const content::MainFunctionParams& parameters, 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShellBrowserMainDelegate* browser_main_delegate) 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : extension_system_(NULL), 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch parameters_(parameters), 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) run_message_loop_(true), 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser_main_delegate_(browser_main_delegate) { 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ShellBrowserMainParts::~ShellBrowserMainParts() { 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellBrowserMainParts::PreMainMessageLoopStart() { 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(jamescook): Initialize touch here? 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellBrowserMainParts::PostMainMessageLoopStart() { 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_CHROMEOS) 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch chromeos::DBusThreadManager::Initialize(); 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch network_controller_.reset(new ShellNetworkController( 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CommandLine::ForCurrentProcess()->GetSwitchValueNative( 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switches::kAppShellPreferredNetwork))); 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Non-Chrome OS platforms are for developer convenience, so use a test IME. 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ui::InitializeInputMethodForTesting(); 740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellBrowserMainParts::PreEarlyInitialization() { 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int ShellBrowserMainParts::PreCreateThreads() { 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(jamescook): Initialize chromeos::CrosSettings here? 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Return no error. 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellBrowserMainParts::PreMainMessageLoopRun() { 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Initialize our "profile" equivalent. 89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch browser_context_.reset(new ShellBrowserContext); 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) desktop_controller_.reset(browser_main_delegate_->CreateDesktopController()); 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) desktop_controller_->CreateRootWindow(); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // NOTE: Much of this is culled from chrome/test/base/chrome_test_suite.cc 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // TODO(jamescook): Initialize user_manager::UserManager. 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_.reset(new content::ShellNetLog("app_shell")); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions_client_.reset(new ShellExtensionsClient()); 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionsClient::Set(extensions_client_.get()); 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions_browser_client_.reset( 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new ShellExtensionsBrowserClient(browser_context_.get())); 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionsBrowserClient::Set(extensions_browser_client_.get()); 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) omaha_query_params_delegate_.reset(new ShellOmahaQueryParamsDelegate); 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch omaha_query_params::OmahaQueryParams::SetDelegate( 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch omaha_query_params_delegate_.get()); 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Create our custom ExtensionSystem first because other 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // KeyedServices depend on it. 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(yoz): Move this after EnsureBrowserContextKeyedServiceFactoriesBuilt. 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateExtensionSystem(); 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ::EnsureBrowserContextKeyedServiceFactoriesBuilt(); 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices( 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser_context_.get()); 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) devtools_delegate_.reset( 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new content::ShellDevToolsDelegate(browser_context_.get())); 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (parameters_.ui_task) { 121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // For running browser tests. 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch parameters_.ui_task->Run(); 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delete parameters_.ui_task; 124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch run_message_loop_ = false; 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser_main_delegate_->Start(browser_context_.get()); 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool ShellBrowserMainParts::MainMessageLoopRun(int* result_code) { 131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!run_message_loop_) 132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(yoz): just return false here? 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop run_loop; 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) run_loop.Run(); 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *result_code = content::RESULT_CODE_NORMAL_EXIT; 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellBrowserMainParts::PostMainMessageLoopRun() { 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser_main_delegate_->Shutdown(); 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices( 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser_context_.get()); 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_system_ = NULL; 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ExtensionsBrowserClient::Set(NULL); 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions_browser_client_.reset(); 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser_context_.reset(); 149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch desktop_controller_.reset(); 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ShellBrowserMainParts::PostDestroyThreads() { 1540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_CHROMEOS) 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) network_controller_.reset(); 1560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch chromeos::DBusThreadManager::Shutdown(); 1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif 1580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellBrowserMainParts::CreateExtensionSystem() { 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(browser_context_); 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_system_ = static_cast<ShellExtensionSystem*>( 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionSystem::Get(browser_context_.get())); 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_system_->InitForRegularProfile(true); 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace extensions 168