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