• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
EnsureBrowserContextKeyedServiceFactoriesBuilt()39 void EnsureBrowserContextKeyedServiceFactoriesBuilt() {
40   extensions::EnsureBrowserContextKeyedServiceFactoriesBuilt();
41   extensions::ShellExtensionSystemFactory::GetInstance();
42 }
43 
44 }  // namespace
45 
46 namespace apps {
47 
ShellBrowserMainParts(const content::MainFunctionParams & parameters,ShellBrowserMainDelegate * browser_main_delegate)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 
~ShellBrowserMainParts()57 ShellBrowserMainParts::~ShellBrowserMainParts() {
58 }
59 
PreMainMessageLoopStart()60 void ShellBrowserMainParts::PreMainMessageLoopStart() {
61   // TODO(jamescook): Initialize touch here?
62 }
63 
PostMainMessageLoopStart()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 
PreEarlyInitialization()74 void ShellBrowserMainParts::PreEarlyInitialization() {
75 }
76 
PreCreateThreads()77 int ShellBrowserMainParts::PreCreateThreads() {
78   // TODO(jamescook): Initialize chromeos::CrosSettings here?
79 
80   // Return no error.
81   return 0;
82 }
83 
PreMainMessageLoopRun()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 
MainMessageLoopRun(int * result_code)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 
PostMainMessageLoopRun()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 
PostDestroyThreads()146 void ShellBrowserMainParts::PostDestroyThreads() {
147 #if defined(OS_CHROMEOS)
148   network_controller_.reset();
149   chromeos::DBusThreadManager::Shutdown();
150 #endif
151 }
152 
CreateExtensionSystem()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