Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / extensions / shell / browser / shell_browser_main_parts.cc
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 "components/storage_monitor/storage_monitor.h"
12 #include "content/public/browser/child_process_security_policy.h"
13 #include "content/public/browser/context_factory.h"
14 #include "content/public/browser/devtools_http_handler.h"
15 #include "content/public/common/result_codes.h"
16 #include "content/shell/browser/shell_devtools_manager_delegate.h"
17 #include "content/shell/browser/shell_net_log.h"
18 #include "extensions/browser/app_window/app_window_client.h"
19 #include "extensions/browser/browser_context_keyed_service_factories.h"
20 #include "extensions/browser/extension_system.h"
21 #include "extensions/browser/updater/update_service.h"
22 #include "extensions/common/constants.h"
23 #include "extensions/common/switches.h"
24 #include "extensions/shell/browser/shell_browser_context.h"
25 #include "extensions/shell/browser/shell_browser_context_keyed_service_factories.h"
26 #include "extensions/shell/browser/shell_browser_main_delegate.h"
27 #include "extensions/shell/browser/shell_desktop_controller.h"
28 #include "extensions/shell/browser/shell_device_client.h"
29 #include "extensions/shell/browser/shell_extension_system.h"
30 #include "extensions/shell/browser/shell_extension_system_factory.h"
31 #include "extensions/shell/browser/shell_extensions_browser_client.h"
32 #include "extensions/shell/browser/shell_oauth2_token_service.h"
33 #include "extensions/shell/browser/shell_omaha_query_params_delegate.h"
34 #include "extensions/shell/common/shell_extensions_client.h"
35 #include "extensions/shell/common/switches.h"
36 #include "ui/aura/env.h"
37 #include "ui/aura/window_tree_host.h"
38 #include "ui/base/ime/input_method_initializer.h"
39 #include "ui/base/resource/resource_bundle.h"
40
41 #if defined(OS_CHROMEOS)
42 #include "chromeos/audio/cras_audio_handler.h"
43 #include "chromeos/dbus/dbus_thread_manager.h"
44 #include "chromeos/network/network_handler.h"
45 #include "extensions/shell/browser/shell_audio_controller_chromeos.h"
46 #include "extensions/shell/browser/shell_network_controller_chromeos.h"
47 #endif
48
49 #if !defined(DISABLE_NACL)
50 #include "components/nacl/browser/nacl_browser.h"
51 #include "components/nacl/browser/nacl_process_host.h"
52 #include "content/public/browser/browser_thread.h"
53 #include "extensions/shell/browser/shell_nacl_browser_delegate.h"
54 #endif
55
56 using base::CommandLine;
57 using content::BrowserContext;
58
59 #if !defined(DISABLE_NACL)
60 using content::BrowserThread;
61 #endif
62
63 namespace extensions {
64
65 namespace {
66
67 void CrxInstallComplete(bool success) {
68   VLOG(1) << "CRX download complete. Success: " << success;
69 }
70 }
71
72 ShellBrowserMainParts::ShellBrowserMainParts(
73     const content::MainFunctionParams& parameters,
74     ShellBrowserMainDelegate* browser_main_delegate)
75     : devtools_http_handler_(nullptr),
76       extension_system_(nullptr),
77       parameters_(parameters),
78       run_message_loop_(true),
79       browser_main_delegate_(browser_main_delegate) {
80 }
81
82 ShellBrowserMainParts::~ShellBrowserMainParts() {
83   if (devtools_http_handler_) {
84     // Note that Stop destroys devtools_http_handler_.
85     devtools_http_handler_->Stop();
86   }
87 }
88
89 void ShellBrowserMainParts::PreMainMessageLoopStart() {
90   // TODO(jamescook): Initialize touch here?
91 }
92
93 void ShellBrowserMainParts::PostMainMessageLoopStart() {
94 #if defined(OS_CHROMEOS)
95   // Perform initialization of D-Bus objects here rather than in the below
96   // helper classes so those classes' tests can initialize stub versions of the
97   // D-Bus objects.
98   chromeos::DBusThreadManager::Initialize();
99
100   chromeos::NetworkHandler::Initialize();
101   network_controller_.reset(new ShellNetworkController(
102       CommandLine::ForCurrentProcess()->GetSwitchValueNative(
103           switches::kAppShellPreferredNetwork)));
104
105   chromeos::CrasAudioHandler::Initialize(
106       new ShellAudioController::PrefHandler());
107   audio_controller_.reset(new ShellAudioController());
108 #else
109   // Non-Chrome OS platforms are for developer convenience, so use a test IME.
110   ui::InitializeInputMethodForTesting();
111 #endif
112 }
113
114 void ShellBrowserMainParts::PreEarlyInitialization() {
115 }
116
117 int ShellBrowserMainParts::PreCreateThreads() {
118   // TODO(jamescook): Initialize chromeos::CrosSettings here?
119
120   content::ChildProcessSecurityPolicy::GetInstance()->RegisterWebSafeScheme(
121       kExtensionScheme);
122   content::ChildProcessSecurityPolicy::GetInstance()->RegisterWebSafeScheme(
123       kExtensionResourceScheme);
124
125   // Return no error.
126   return 0;
127 }
128
129 void ShellBrowserMainParts::PreMainMessageLoopRun() {
130   // Initialize our "profile" equivalent.
131   browser_context_.reset(new ShellBrowserContext(net_log_.get()));
132
133   aura::Env::GetInstance()->set_context_factory(content::GetContextFactory());
134
135   storage_monitor::StorageMonitor::Create();
136
137   desktop_controller_.reset(browser_main_delegate_->CreateDesktopController());
138
139   // NOTE: Much of this is culled from chrome/test/base/chrome_test_suite.cc
140   // TODO(jamescook): Initialize user_manager::UserManager.
141   net_log_.reset(new content::ShellNetLog("app_shell"));
142
143   device_client_.reset(new ShellDeviceClient);
144
145   extensions_client_.reset(new ShellExtensionsClient());
146   ExtensionsClient::Set(extensions_client_.get());
147
148   extensions_browser_client_.reset(
149       new ShellExtensionsBrowserClient(browser_context_.get()));
150   ExtensionsBrowserClient::Set(extensions_browser_client_.get());
151
152   omaha_query_params_delegate_.reset(new ShellOmahaQueryParamsDelegate);
153   omaha_query_params::OmahaQueryParams::SetDelegate(
154       omaha_query_params_delegate_.get());
155
156   // Create our custom ExtensionSystem first because other
157   // KeyedServices depend on it.
158   // TODO(yoz): Move this after EnsureBrowserContextKeyedServiceFactoriesBuilt.
159   CreateExtensionSystem();
160
161   // Register additional KeyedService factories here. See
162   // ChromeBrowserMainExtraPartsProfiles for details.
163   EnsureBrowserContextKeyedServiceFactoriesBuilt();
164   ShellExtensionSystemFactory::GetInstance();
165
166   BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
167       browser_context_.get());
168
169   // Initialize OAuth2 support from command line.
170   CommandLine* cmd = CommandLine::ForCurrentProcess();
171   oauth2_token_service_.reset(new ShellOAuth2TokenService(
172       browser_context_.get(),
173       cmd->GetSwitchValueASCII(switches::kAppShellUser),
174       cmd->GetSwitchValueASCII(switches::kAppShellRefreshToken)));
175
176 #if !defined(DISABLE_NACL)
177   // Takes ownership.
178   nacl::NaClBrowser::SetDelegate(
179       new ShellNaClBrowserDelegate(browser_context_.get()));
180   // Track the task so it can be canceled if app_shell shuts down very quickly,
181   // such as in browser tests.
182   task_tracker_.PostTask(
183       BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO).get(),
184       FROM_HERE,
185       base::Bind(nacl::NaClProcessHost::EarlyStartup));
186 #endif
187
188   // TODO(rockot): Remove this temporary hack test.
189   std::string install_crx_id =
190       cmd->GetSwitchValueASCII(switches::kAppShellInstallCrx);
191   if (install_crx_id.size() != 0) {
192     CHECK(install_crx_id.size() == 32)
193         << "Extension ID must be exactly 32 characters long.";
194     UpdateService* update_service = UpdateService::Get(browser_context_.get());
195     update_service->DownloadAndInstall(install_crx_id,
196                                        base::Bind(CrxInstallComplete));
197   }
198
199   // CreateHttpHandler retains ownership over DevToolsHttpHandler.
200   devtools_http_handler_ =
201       content::ShellDevToolsManagerDelegate::CreateHttpHandler(
202           browser_context_.get());
203   if (parameters_.ui_task) {
204     // For running browser tests.
205     parameters_.ui_task->Run();
206     delete parameters_.ui_task;
207     run_message_loop_ = false;
208   } else {
209     browser_main_delegate_->Start(browser_context_.get());
210   }
211 }
212
213 bool ShellBrowserMainParts::MainMessageLoopRun(int* result_code) {
214   if (!run_message_loop_)
215     return true;
216   // TODO(yoz): just return false here?
217   base::RunLoop run_loop;
218   run_loop.Run();
219   *result_code = content::RESULT_CODE_NORMAL_EXIT;
220   return true;
221 }
222
223 void ShellBrowserMainParts::PostMainMessageLoopRun() {
224   browser_main_delegate_->Shutdown();
225
226 #if !defined(DISABLE_NACL)
227   task_tracker_.TryCancelAll();
228   nacl::NaClBrowser::SetDelegate(nullptr);
229 #endif
230
231   oauth2_token_service_.reset();
232   BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
233       browser_context_.get());
234   extension_system_ = NULL;
235   ExtensionsBrowserClient::Set(NULL);
236   extensions_browser_client_.reset();
237   browser_context_.reset();
238
239   desktop_controller_.reset();
240
241   storage_monitor::StorageMonitor::Destroy();
242 }
243
244 void ShellBrowserMainParts::PostDestroyThreads() {
245 #if defined(OS_CHROMEOS)
246   audio_controller_.reset();
247   chromeos::CrasAudioHandler::Shutdown();
248   network_controller_.reset();
249   chromeos::NetworkHandler::Shutdown();
250   chromeos::DBusThreadManager::Shutdown();
251 #endif
252 }
253
254 void ShellBrowserMainParts::CreateExtensionSystem() {
255   DCHECK(browser_context_);
256   extension_system_ = static_cast<ShellExtensionSystem*>(
257       ExtensionSystem::Get(browser_context_.get()));
258   extension_system_->InitForRegularProfile(true);
259 }
260
261 }  // namespace extensions