Upstream version 6.35.121.0
[platform/framework/web/crosswalk.git] / src / apps / shell / browser / shell_browser_main_parts.cc
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/browser_context_keyed_service_factories.h"
8 #include "apps/shell/browser/shell_apps_client.h"
9 #include "apps/shell/browser/shell_browser_context.h"
10 #include "apps/shell/browser/shell_desktop_controller.h"
11 #include "apps/shell/browser/shell_extension_system.h"
12 #include "apps/shell/browser/shell_extension_system_factory.h"
13 #include "apps/shell/browser/shell_extensions_browser_client.h"
14 #include "apps/shell/common/shell_extensions_client.h"
15 #include "base/command_line.h"
16 #include "base/file_util.h"
17 #include "base/files/file_path.h"
18 #include "base/run_loop.h"
19 #include "components/keyed_service/content/browser_context_dependency_manager.h"
20 #include "content/public/common/result_codes.h"
21 #include "content/shell/browser/shell_devtools_delegate.h"
22 #include "content/shell/browser/shell_net_log.h"
23 #include "extensions/browser/browser_context_keyed_service_factories.h"
24 #include "extensions/browser/extension_system.h"
25 #include "ui/aura/window_tree_host.h"
26 #include "ui/base/resource/resource_bundle.h"
27 #include "ui/views/widget/widget.h"
28
29 using content::BrowserContext;
30 using extensions::Extension;
31 using extensions::ExtensionSystem;
32 using extensions::ShellExtensionSystem;
33
34 namespace {
35
36 // Register additional KeyedService factories here. See
37 // ChromeBrowserMainExtraPartsProfiles for details.
38 void EnsureBrowserContextKeyedServiceFactoriesBuilt() {
39   apps::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     : extension_system_(NULL), parameters_(parameters) {}
51
52 ShellBrowserMainParts::~ShellBrowserMainParts() {
53 }
54
55 void ShellBrowserMainParts::PreMainMessageLoopStart() {
56   // TODO(jamescook): Initialize touch here?
57 }
58
59 void ShellBrowserMainParts::PostMainMessageLoopStart() {
60 }
61
62 void ShellBrowserMainParts::PreEarlyInitialization() {
63 }
64
65 int ShellBrowserMainParts::PreCreateThreads() {
66   // TODO(jamescook): Initialize chromeos::CrosSettings here?
67
68   // Return no error.
69   return 0;
70 }
71
72 void ShellBrowserMainParts::PreMainMessageLoopRun() {
73   desktop_controller_.reset(new ShellDesktopController);
74   desktop_controller_->GetWindowTreeHost()->AddObserver(this);
75
76   // NOTE: Much of this is culled from chrome/test/base/chrome_test_suite.cc
77   // TODO(jamescook): Initialize chromeos::UserManager.
78   net_log_.reset(new content::ShellNetLog("app_shell"));
79
80   // Initialize our "profile" equivalent.
81   browser_context_.reset(new ShellBrowserContext);
82
83   extensions_client_.reset(new ShellExtensionsClient());
84   extensions::ExtensionsClient::Set(extensions_client_.get());
85
86   extensions_browser_client_.reset(
87       new extensions::ShellExtensionsBrowserClient(browser_context_.get()));
88   extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get());
89
90   apps_client_.reset(new ShellAppsClient(browser_context_.get()));
91   AppsClient::Set(apps_client_.get());
92
93   // Create our custom ExtensionSystem first because other
94   // KeyedServices depend on it.
95   // TODO(yoz): Move this after EnsureBrowserContextKeyedServiceFactoriesBuilt.
96   CreateExtensionSystem();
97
98   ::EnsureBrowserContextKeyedServiceFactoriesBuilt();
99   BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
100       browser_context_.get());
101
102   devtools_delegate_.reset(
103       new content::ShellDevToolsDelegate(browser_context_.get()));
104
105   // For running browser tests.
106   // TODO(yoz): This is set up to exit prematurely because we don't have
107   // any tests yet.
108   if (parameters_.ui_task) {
109     parameters_.ui_task->Run();
110     delete parameters_.ui_task;
111     return;
112   }
113
114   const std::string kAppSwitch = "app";
115   CommandLine* command_line = CommandLine::ForCurrentProcess();
116   if (command_line->HasSwitch(kAppSwitch)) {
117     base::FilePath app_dir(command_line->GetSwitchValueNative(kAppSwitch));
118     base::FilePath app_absolute_dir = base::MakeAbsoluteFilePath(app_dir);
119     extension_system_->LoadAndLaunchApp(app_absolute_dir);
120   } else {
121     LOG(ERROR) << "--" << kAppSwitch << " unset; boredom is in your future";
122   }
123 }
124
125 bool ShellBrowserMainParts::MainMessageLoopRun(int* result_code)  {
126   base::RunLoop run_loop;
127   run_loop.Run();
128   *result_code = content::RESULT_CODE_NORMAL_EXIT;
129   return true;
130 }
131
132 void ShellBrowserMainParts::PostMainMessageLoopRun() {
133   BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
134       browser_context_.get());
135   extension_system_ = NULL;
136   extensions::ExtensionsBrowserClient::Set(NULL);
137   extensions_browser_client_.reset();
138   browser_context_.reset();
139
140   desktop_controller_->GetWindowTreeHost()->RemoveObserver(this);
141   desktop_controller_.reset();
142 }
143
144 void ShellBrowserMainParts::OnHostCloseRequested(
145     const aura::WindowTreeHost* host) {
146   extension_system_->CloseApp();
147   base::MessageLoop::current()->PostTask(FROM_HERE,
148                                          base::MessageLoop::QuitClosure());
149 }
150
151 void ShellBrowserMainParts::CreateExtensionSystem() {
152   DCHECK(browser_context_);
153   extension_system_ = static_cast<ShellExtensionSystem*>(
154       ExtensionSystem::Get(browser_context_.get()));
155   extension_system_->InitForRegularProfile(true);
156 }
157
158 }  // namespace apps