1 // Copyright (c) 2013 Intel Corporation. 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.
5 #include "xwalk/runtime/browser/xwalk_runner.h"
9 #include "base/command_line.h"
10 #include "base/logging.h"
11 #include "content/public/browser/render_process_host.h"
12 #include "xwalk/application/browser/application.h"
13 #include "xwalk/application/browser/application_service.h"
14 #include "xwalk/application/browser/application_system.h"
15 #include "xwalk/extensions/browser/xwalk_extension_service.h"
16 #include "xwalk/extensions/common/xwalk_extension_switches.h"
17 #include "xwalk/runtime/browser/application_component.h"
18 #include "xwalk/runtime/browser/devtools/remote_debugging_server.h"
19 #include "xwalk/runtime/browser/runtime_context.h"
20 #include "xwalk/runtime/browser/storage_component.h"
21 #include "xwalk/runtime/browser/sysapps_component.h"
22 #include "xwalk/runtime/browser/xwalk_app_extension_bridge.h"
23 #include "xwalk/runtime/browser/xwalk_browser_main_parts.h"
24 #include "xwalk/runtime/browser/xwalk_component.h"
25 #include "xwalk/runtime/browser/xwalk_content_browser_client.h"
26 #include "xwalk/runtime/common/xwalk_runtime_features.h"
27 #include "xwalk/runtime/common/xwalk_switches.h"
29 #if defined(OS_ANDROID)
30 #include "xwalk/runtime/browser/xwalk_runner_android.h"
31 #elif defined(OS_TIZEN)
32 #include "xwalk/runtime/browser/xwalk_runner_tizen.h"
39 XWalkRunner* g_xwalk_runner = NULL;
43 XWalkRunner::XWalkRunner() {
44 VLOG(1) << "Creating XWalkRunner object.";
45 DCHECK(!g_xwalk_runner);
46 g_xwalk_runner = this;
48 XWalkRuntimeFeatures::GetInstance()->Initialize(
49 CommandLine::ForCurrentProcess());
51 // Initializing after the g_xwalk_runner is set to ensure
52 // XWalkRunner::GetInstance() can be used in all sub objects if needed.
53 content_browser_client_.reset(new XWalkContentBrowserClient(this));
56 XWalkRunner::~XWalkRunner() {
57 DCHECK(g_xwalk_runner);
58 g_xwalk_runner = NULL;
59 VLOG(1) << "Destroying XWalkRunner object.";
63 XWalkRunner* XWalkRunner::GetInstance() {
64 return g_xwalk_runner;
67 application::ApplicationSystem* XWalkRunner::app_system() {
68 return app_component_ ? app_component_->app_system() : NULL;
71 void XWalkRunner::PreMainMessageLoopRun() {
72 runtime_context_.reset(new RuntimeContext);
73 app_extension_bridge_.reset(new XWalkAppExtensionBridge());
75 CommandLine* cmd_line = CommandLine::ForCurrentProcess();
76 if (!cmd_line->HasSwitch(switches::kXWalkDisableExtensions))
77 extension_service_.reset(new extensions::XWalkExtensionService(
78 app_extension_bridge_.get()));
81 app_extension_bridge_->SetApplicationSystem(app_component_->app_system());
84 void XWalkRunner::PostMainMessageLoopRun() {
86 extension_service_.reset();
87 runtime_context_.reset();
88 DisableRemoteDebugging();
91 void XWalkRunner::CreateComponents() {
92 scoped_ptr<ApplicationComponent> app_component(CreateAppComponent());
93 // Keep a reference as some code still needs to call
94 // XWalkRunner::app_system().
95 app_component_ = app_component.get();
96 AddComponent(app_component.PassAs<XWalkComponent>());
98 if (XWalkRuntimeFeatures::isSysAppsEnabled())
99 AddComponent(CreateSysAppsComponent().PassAs<XWalkComponent>());
100 if (XWalkRuntimeFeatures::isStorageAPIEnabled())
101 AddComponent(CreateStorageComponent().PassAs<XWalkComponent>());
104 void XWalkRunner::DestroyComponents() {
105 // The ScopedVector takes care of deleting all the components. Ensure that
106 // components are deleted before their dependencies by reversing the order.
107 std::reverse(components_.begin(), components_.end());
110 app_component_ = NULL;
113 void XWalkRunner::AddComponent(scoped_ptr<XWalkComponent> component) {
114 components_.push_back(component.release());
117 scoped_ptr<ApplicationComponent> XWalkRunner::CreateAppComponent() {
118 return make_scoped_ptr(new ApplicationComponent(runtime_context_.get()));
121 scoped_ptr<SysAppsComponent> XWalkRunner::CreateSysAppsComponent() {
122 return make_scoped_ptr(new SysAppsComponent());
125 scoped_ptr<StorageComponent> XWalkRunner::CreateStorageComponent() {
126 return make_scoped_ptr(new StorageComponent());
129 void XWalkRunner::InitializeRuntimeVariablesForExtensions(
130 const content::RenderProcessHost* host,
131 base::ValueMap* variables) {
132 application::Application* app = app_system()->application_service()->
133 GetApplicationByRenderHostID(host->GetID());
136 (*variables)["app_id"] = new base::StringValue(app->id());
139 void XWalkRunner::OnRenderProcessWillLaunch(content::RenderProcessHost* host) {
140 if (!extension_service_)
143 std::vector<extensions::XWalkExtension*> ui_thread_extensions;
144 std::vector<extensions::XWalkExtension*> extension_thread_extensions;
146 ScopedVector<XWalkComponent>::iterator it = components_.begin();
147 for (; it != components_.end(); ++it) {
148 XWalkComponent* component = *it;
149 component->CreateUIThreadExtensions(host, &ui_thread_extensions);
150 component->CreateExtensionThreadExtensions(
151 host, &extension_thread_extensions);
154 // TODO(cmarcelo): Once functionality is moved to components, remove
155 // CreateInternalExtensions*() functions from XWalkBrowserMainParts.
156 XWalkBrowserMainParts* main_parts = content_browser_client_->main_parts();
157 main_parts->CreateInternalExtensionsForUIThread(
158 host, &ui_thread_extensions);
159 main_parts->CreateInternalExtensionsForExtensionThread(
160 host, &extension_thread_extensions);
162 scoped_ptr<base::ValueMap> runtime_variables(new base::ValueMap);
163 InitializeRuntimeVariablesForExtensions(host, runtime_variables.get());
164 extension_service_->OnRenderProcessWillLaunch(
165 host, &ui_thread_extensions, &extension_thread_extensions,
166 runtime_variables.Pass());
169 void XWalkRunner::OnRenderProcessHostGone(content::RenderProcessHost* host) {
170 if (!extension_service_)
172 extension_service_->OnRenderProcessDied(host);
175 void XWalkRunner::EnableRemoteDebugging(int port) {
176 const char* local_ip = "0.0.0.0";
177 if (port > 0 && port < 65535) {
178 remote_debugging_server_.reset(
179 new RemoteDebuggingServer(runtime_context(),
180 local_ip, port, std::string()));
184 void XWalkRunner::DisableRemoteDebugging() {
185 remote_debugging_server_.reset();
189 scoped_ptr<XWalkRunner> XWalkRunner::Create() {
190 XWalkRunner* runner = NULL;
191 #if defined(OS_ANDROID)
192 runner = new XWalkRunnerAndroid;
193 #elif defined(OS_TIZEN)
194 runner = new XWalkRunnerTizen;
196 runner = new XWalkRunner;
198 return scoped_ptr<XWalkRunner>(runner);
201 content::ContentBrowserClient* XWalkRunner::GetContentBrowserClient() {
202 return content_browser_client_.get();