Upstream version 9.38.198.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 "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 using content::BrowserContext;
35
36 namespace {
37
38 // Register additional KeyedService factories here. See
39 // ChromeBrowserMainExtraPartsProfiles for details.
40 void EnsureBrowserContextKeyedServiceFactoriesBuilt() {
41   extensions::EnsureBrowserContextKeyedServiceFactoriesBuilt();
42   extensions::ShellExtensionSystemFactory::GetInstance();
43 }
44
45 }  // namespace
46
47 namespace extensions {
48
49 ShellBrowserMainParts::ShellBrowserMainParts(
50     const content::MainFunctionParams& parameters,
51     ShellBrowserMainDelegate* browser_main_delegate)
52     : extension_system_(NULL),
53       parameters_(parameters),
54       run_message_loop_(true),
55       browser_main_delegate_(browser_main_delegate) {
56 }
57
58 ShellBrowserMainParts::~ShellBrowserMainParts() {
59 }
60
61 void ShellBrowserMainParts::PreMainMessageLoopStart() {
62   // TODO(jamescook): Initialize touch here?
63 }
64
65 void ShellBrowserMainParts::PostMainMessageLoopStart() {
66 #if defined(OS_CHROMEOS)
67   chromeos::DBusThreadManager::Initialize();
68   network_controller_.reset(new ShellNetworkController(
69       base::CommandLine::ForCurrentProcess()->GetSwitchValueNative(
70           switches::kAppShellPreferredNetwork)));
71 #else
72   // Non-Chrome OS platforms are for developer convenience, so use a test IME.
73   ui::InitializeInputMethodForTesting();
74 #endif
75 }
76
77 void ShellBrowserMainParts::PreEarlyInitialization() {
78 }
79
80 int ShellBrowserMainParts::PreCreateThreads() {
81   // TODO(jamescook): Initialize chromeos::CrosSettings here?
82
83   // Return no error.
84   return 0;
85 }
86
87 void ShellBrowserMainParts::PreMainMessageLoopRun() {
88   // Initialize our "profile" equivalent.
89   browser_context_.reset(new ShellBrowserContext);
90
91   desktop_controller_.reset(browser_main_delegate_->CreateDesktopController());
92   desktop_controller_->CreateRootWindow();
93
94   // NOTE: Much of this is culled from chrome/test/base/chrome_test_suite.cc
95   // TODO(jamescook): Initialize user_manager::UserManager.
96   net_log_.reset(new content::ShellNetLog("app_shell"));
97
98   extensions_client_.reset(new ShellExtensionsClient());
99   ExtensionsClient::Set(extensions_client_.get());
100
101   extensions_browser_client_.reset(
102       new ShellExtensionsBrowserClient(browser_context_.get()));
103   ExtensionsBrowserClient::Set(extensions_browser_client_.get());
104
105   omaha_query_params_delegate_.reset(new ShellOmahaQueryParamsDelegate);
106   omaha_query_params::OmahaQueryParams::SetDelegate(
107       omaha_query_params_delegate_.get());
108
109   // Create our custom ExtensionSystem first because other
110   // KeyedServices depend on it.
111   // TODO(yoz): Move this after EnsureBrowserContextKeyedServiceFactoriesBuilt.
112   CreateExtensionSystem();
113
114   ::EnsureBrowserContextKeyedServiceFactoriesBuilt();
115   BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
116       browser_context_.get());
117
118   devtools_delegate_.reset(
119       new content::ShellDevToolsDelegate(browser_context_.get()));
120   if (parameters_.ui_task) {
121     // For running browser tests.
122     parameters_.ui_task->Run();
123     delete parameters_.ui_task;
124     run_message_loop_ = false;
125   } else {
126     browser_main_delegate_->Start(browser_context_.get());
127   }
128 }
129
130 bool ShellBrowserMainParts::MainMessageLoopRun(int* result_code) {
131   if (!run_message_loop_)
132     return true;
133   // TODO(yoz): just return false here?
134   base::RunLoop run_loop;
135   run_loop.Run();
136   *result_code = content::RESULT_CODE_NORMAL_EXIT;
137   return true;
138 }
139
140 void ShellBrowserMainParts::PostMainMessageLoopRun() {
141   browser_main_delegate_->Shutdown();
142
143   BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
144       browser_context_.get());
145   extension_system_ = NULL;
146   ExtensionsBrowserClient::Set(NULL);
147   extensions_browser_client_.reset();
148   browser_context_.reset();
149
150   desktop_controller_.reset();
151 }
152
153 void ShellBrowserMainParts::PostDestroyThreads() {
154 #if defined(OS_CHROMEOS)
155   network_controller_.reset();
156   chromeos::DBusThreadManager::Shutdown();
157 #endif
158 }
159
160 void ShellBrowserMainParts::CreateExtensionSystem() {
161   DCHECK(browser_context_);
162   extension_system_ = static_cast<ShellExtensionSystem*>(
163       ExtensionSystem::Get(browser_context_.get()));
164   extension_system_->InitForRegularProfile(true);
165 }
166
167 }  // namespace extensions