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"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/child_process_security_policy.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/context_factory.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/result_codes.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/shell/browser/shell_devtools_delegate.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/shell/browser/shell_net_log.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/app_window/app_window_client.h"
1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "extensions/browser/browser_context_keyed_service_factories.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/constants.cc"
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_browser_context.h"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_browser_main_delegate.h"
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_desktop_controller.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/shell/browser/shell_device_client.h"
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_extension_system.h"
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_extension_system_factory.h"
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_extensions_browser_client.h"
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_omaha_query_params_delegate.h"
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/common/shell_extensions_client.h"
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/common/switches.h"
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/aura/env.h"
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_tree_host.h"
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/base/ime/input_method_initializer.h"
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(OS_ANDROID) && !defined(OS_IOS)
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/storage_monitor/storage_monitor.h"
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_CHROMEOS)
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromeos/audio/cras_audio_handler.h"
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chromeos/dbus/dbus_thread_manager.h"
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromeos/network/network_handler.h"
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/shell/browser/shell_audio_controller_chromeos.h"
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/browser/shell_network_controller_chromeos.h"
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if !defined(DISABLE_NACL)
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/nacl/browser/nacl_browser.h"
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/nacl/browser/nacl_process_host.h"
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "extensions/shell/browser/shell_nacl_browser_delegate.h"
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::BrowserContext;
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace extensions {
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ShellBrowserMainParts::ShellBrowserMainParts(
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const content::MainFunctionParams& parameters,
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ShellBrowserMainDelegate* browser_main_delegate)
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : extension_system_(NULL),
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      parameters_(parameters),
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      run_message_loop_(true),
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      browser_main_delegate_(browser_main_delegate) {
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ShellBrowserMainParts::~ShellBrowserMainParts() {
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellBrowserMainParts::PreMainMessageLoopStart() {
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(jamescook): Initialize touch here?
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellBrowserMainParts::PostMainMessageLoopStart() {
750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_CHROMEOS)
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Perform initialization of D-Bus objects here rather than in the below
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // helper classes so those classes' tests can initialize stub versions of the
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // D-Bus objects.
790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  chromeos::DBusThreadManager::Initialize();
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::NetworkHandler::Initialize();
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  network_controller_.reset(new ShellNetworkController(
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::CommandLine::ForCurrentProcess()->GetSwitchValueNative(
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          switches::kAppShellPreferredNetwork)));
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::CrasAudioHandler::Initialize(
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new ShellAudioController::PrefHandler());
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  audio_controller_.reset(new ShellAudioController());
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Non-Chrome OS platforms are for developer convenience, so use a test IME.
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ui::InitializeInputMethodForTesting();
920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellBrowserMainParts::PreEarlyInitialization() {
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int ShellBrowserMainParts::PreCreateThreads() {
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(jamescook): Initialize chromeos::CrosSettings here?
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::ChildProcessSecurityPolicy::GetInstance()->RegisterWebSafeScheme(
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kExtensionScheme);
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::ChildProcessSecurityPolicy::GetInstance()->RegisterWebSafeScheme(
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kExtensionResourceScheme);
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Return no error.
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return 0;
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellBrowserMainParts::PreMainMessageLoopRun() {
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Initialize our "profile" equivalent.
112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  browser_context_.reset(new ShellBrowserContext);
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  aura::Env::GetInstance()->set_context_factory(content::GetContextFactory());
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(OS_ANDROID) && !defined(OS_IOS)
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  storage_monitor::StorageMonitor::Create();
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  desktop_controller_.reset(browser_main_delegate_->CreateDesktopController());
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // NOTE: Much of this is culled from chrome/test/base/chrome_test_suite.cc
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // TODO(jamescook): Initialize user_manager::UserManager.
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net_log_.reset(new content::ShellNetLog("app_shell"));
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  device_client_.reset(new ShellDeviceClient);
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions_client_.reset(new ShellExtensionsClient());
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExtensionsClient::Set(extensions_client_.get());
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions_browser_client_.reset(
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new ShellExtensionsBrowserClient(browser_context_.get()));
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExtensionsBrowserClient::Set(extensions_browser_client_.get());
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  omaha_query_params_delegate_.reset(new ShellOmahaQueryParamsDelegate);
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  omaha_query_params::OmahaQueryParams::SetDelegate(
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      omaha_query_params_delegate_.get());
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Create our custom ExtensionSystem first because other
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // KeyedServices depend on it.
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(yoz): Move this after EnsureBrowserContextKeyedServiceFactoriesBuilt.
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateExtensionSystem();
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Register additional KeyedService factories here. See
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // ChromeBrowserMainExtraPartsProfiles for details.
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EnsureBrowserContextKeyedServiceFactoriesBuilt();
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ShellExtensionSystemFactory::GetInstance();
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      browser_context_.get());
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if !defined(DISABLE_NACL)
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Takes ownership.
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  nacl::NaClBrowser::SetDelegate(
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new ShellNaClBrowserDelegate(browser_context_.get()));
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::BrowserThread::PostTask(
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      content::BrowserThread::IO,
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      FROM_HERE,
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::Bind(nacl::NaClProcessHost::EarlyStartup));
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  devtools_delegate_.reset(
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new content::ShellDevToolsDelegate(browser_context_.get()));
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (parameters_.ui_task) {
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // For running browser tests.
166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    parameters_.ui_task->Run();
167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    delete parameters_.ui_task;
168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    run_message_loop_ = false;
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    browser_main_delegate_->Start(browser_context_.get());
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool ShellBrowserMainParts::MainMessageLoopRun(int* result_code) {
175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!run_message_loop_)
176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return true;
177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // TODO(yoz): just return false here?
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop run_loop;
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  run_loop.Run();
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *result_code = content::RESULT_CODE_NORMAL_EXIT;
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellBrowserMainParts::PostMainMessageLoopRun() {
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  browser_main_delegate_->Shutdown();
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      browser_context_.get());
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extension_system_ = NULL;
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExtensionsBrowserClient::Set(NULL);
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions_browser_client_.reset();
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  browser_context_.reset();
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  desktop_controller_.reset();
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(OS_ANDROID) && !defined(OS_IOS)
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  storage_monitor::StorageMonitor::Destroy();
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ShellBrowserMainParts::PostDestroyThreads() {
2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_CHROMEOS)
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  audio_controller_.reset();
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::CrasAudioHandler::Shutdown();
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  network_controller_.reset();
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::NetworkHandler::Shutdown();
2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  chromeos::DBusThreadManager::Shutdown();
2080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif
2090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellBrowserMainParts::CreateExtensionSystem() {
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(browser_context_);
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extension_system_ = static_cast<ShellExtensionSystem*>(
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ExtensionSystem::Get(browser_context_.get()));
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extension_system_->InitForRegularProfile(true);
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace extensions
219