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