Home | History | Annotate | Download | only in browser
      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