OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "mojo/shell/application_manager.h" | 5 #include "mojo/shell/application_manager.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/macros.h" | 14 #include "base/macros.h" |
15 #include "base/process/process.h" | 15 #include "base/process/process.h" |
16 #include "base/stl_util.h" | 16 #include "base/stl_util.h" |
17 #include "base/strings/string_util.h" | 17 #include "base/strings/string_util.h" |
18 #include "base/trace_event/trace_event.h" | 18 #include "base/trace_event/trace_event.h" |
19 #include "mojo/common/url_type_converters.h" | 19 #include "mojo/common/url_type_converters.h" |
20 #include "mojo/public/cpp/bindings/binding.h" | 20 #include "mojo/public/cpp/bindings/binding.h" |
21 #include "mojo/services/package_manager/loader.h" | 21 #include "mojo/services/package_manager/loader.h" |
22 #include "mojo/shell/application_instance.h" | 22 #include "mojo/shell/application_instance.h" |
23 #include "mojo/shell/fetcher.h" | 23 #include "mojo/shell/connect_util.h" |
24 #include "mojo/shell/package_manager.h" | 24 #include "mojo/shell/content_handler_connection.h" |
25 #include "mojo/shell/public/cpp/connect.h" | 25 #include "mojo/shell/public/cpp/connect.h" |
26 #include "mojo/shell/query_util.h" | |
27 #include "mojo/shell/shell_application_loader.h" | 26 #include "mojo/shell/shell_application_loader.h" |
28 #include "mojo/shell/switches.h" | 27 #include "mojo/shell/switches.h" |
29 #include "mojo/util/filename_util.h" | 28 #include "mojo/util/filename_util.h" |
30 | 29 |
31 namespace mojo { | 30 namespace mojo { |
32 namespace shell { | 31 namespace shell { |
33 | 32 |
34 namespace { | 33 namespace { |
35 | 34 |
36 // Used by TestAPI. | 35 // Used by TestAPI. |
(...skipping 16 matching lines...) Expand all Loading... |
53 return has_created_instance; | 52 return has_created_instance; |
54 } | 53 } |
55 | 54 |
56 bool ApplicationManager::TestAPI::HasRunningInstanceForURL( | 55 bool ApplicationManager::TestAPI::HasRunningInstanceForURL( |
57 const GURL& url) const { | 56 const GURL& url) const { |
58 return manager_->identity_to_instance_.find(Identity(url)) != | 57 return manager_->identity_to_instance_.find(Identity(url)) != |
59 manager_->identity_to_instance_.end(); | 58 manager_->identity_to_instance_.end(); |
60 } | 59 } |
61 | 60 |
62 ApplicationManager::ApplicationManager( | 61 ApplicationManager::ApplicationManager( |
63 scoped_ptr<PackageManager> package_manager, | |
64 bool register_mojo_url_schemes) | 62 bool register_mojo_url_schemes) |
65 : ApplicationManager(std::move(package_manager), nullptr, nullptr, | 63 : ApplicationManager(nullptr, nullptr, register_mojo_url_schemes) {} |
66 register_mojo_url_schemes) {} | |
67 | 64 |
68 ApplicationManager::ApplicationManager( | 65 ApplicationManager::ApplicationManager( |
69 scoped_ptr<PackageManager> package_manager, | |
70 scoped_ptr<NativeRunnerFactory> native_runner_factory, | 66 scoped_ptr<NativeRunnerFactory> native_runner_factory, |
71 base::TaskRunner* task_runner, | 67 base::TaskRunner* task_runner, |
72 bool register_mojo_url_schemes) | 68 bool register_mojo_url_schemes) |
73 : use_remote_package_manager_(false), | 69 : task_runner_(task_runner), |
74 package_manager_(std::move(package_manager)), | |
75 task_runner_(task_runner), | |
76 native_runner_factory_(std::move(native_runner_factory)), | 70 native_runner_factory_(std::move(native_runner_factory)), |
77 weak_ptr_factory_(this) { | 71 weak_ptr_factory_(this) { |
78 package_manager_->SetApplicationManager(this); | |
79 SetLoaderForURL(make_scoped_ptr(new ShellApplicationLoader(this)), | 72 SetLoaderForURL(make_scoped_ptr(new ShellApplicationLoader(this)), |
80 GURL("mojo:shell")); | 73 GURL("mojo://shell/")); |
81 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( | 74 |
82 switches::kDontUseRemotePackageManager)) { | 75 GURL package_manager_url("mojo://package_manager/"); |
83 UseRemotePackageManager(register_mojo_url_schemes); | 76 SetLoaderForURL(make_scoped_ptr(new package_manager::Loader( |
84 } | 77 task_runner_, register_mojo_url_schemes)), package_manager_url); |
| 78 |
| 79 ConnectToInterface(this, package_manager_url, &shell_resolver_); |
85 } | 80 } |
86 | 81 |
87 ApplicationManager::~ApplicationManager() { | 82 ApplicationManager::~ApplicationManager() { |
88 TerminateShellConnections(); | 83 TerminateShellConnections(); |
89 STLDeleteValues(&url_to_loader_); | 84 STLDeleteValues(&url_to_loader_); |
90 for (auto& runner : native_runners_) | 85 for (auto& runner : native_runners_) |
91 runner.reset(); | 86 runner.reset(); |
92 } | 87 } |
93 | 88 |
94 void ApplicationManager::TerminateShellConnections() { | 89 void ApplicationManager::TerminateShellConnections() { |
95 STLDeleteValues(&identity_to_instance_); | 90 STLDeleteValues(&identity_to_instance_); |
96 } | 91 } |
97 | 92 |
98 void ApplicationManager::ConnectToApplication( | 93 void ApplicationManager::ConnectToApplication( |
99 scoped_ptr<ConnectToApplicationParams> params) { | 94 scoped_ptr<ConnectToApplicationParams> params) { |
100 TRACE_EVENT_INSTANT1("mojo_shell", "ApplicationManager::ConnectToApplication", | 95 TRACE_EVENT_INSTANT1("mojo_shell", "ApplicationManager::ConnectToApplication", |
101 TRACE_EVENT_SCOPE_THREAD, "original_url", | 96 TRACE_EVENT_SCOPE_THREAD, "original_url", |
102 params->target().url().spec()); | 97 params->target().url().spec()); |
103 DCHECK(params->target().url().is_valid()); | 98 DCHECK(params->target().url().is_valid()); |
104 | 99 |
105 // Connect to an existing matching instance, if possible. | 100 // Connect to an existing matching instance, if possible. |
106 if (ConnectToRunningApplication(¶ms)) | 101 if (ConnectToRunningApplication(¶ms)) |
107 return; | 102 return; |
108 | 103 |
109 // TODO(beng): seems like this should be able to move to OnGotResolvedURL(). | 104 // TODO(beng): seems like this should be able to move to OnGotResolvedURL(). |
110 ApplicationLoader* loader = GetLoaderForURL(params->target().url()); | 105 ApplicationLoader* loader = GetLoaderForURL(params->target().url()); |
111 if (loader) { | 106 if (loader) { |
112 GURL url = params->target().url(); | 107 GURL url = params->target().url(); |
113 package_manager_->BuiltinAppLoaded(url); | |
114 mojom::ShellClientRequest request; | 108 mojom::ShellClientRequest request; |
115 std::string application_name = | 109 // TODO(beng): move this to OnGotResolvedURL & read from manifest. |
116 package_manager_->GetApplicationName(params->target().url().spec()); | 110 std::string application_name = url.spec(); |
117 ApplicationInstance* instance = CreateAndConnectToInstance( | 111 ApplicationInstance* instance = CreateAndConnectToInstance( |
118 std::move(params), nullptr, nullptr, application_name, &request); | 112 std::move(params), nullptr, nullptr, application_name, &request); |
119 loader->Load(url, std::move(request)); | 113 loader->Load(url, std::move(request)); |
120 instance->RunConnectCallback(); | 114 instance->RunConnectCallback(); |
121 return; | 115 return; |
122 } | 116 } |
123 | 117 |
124 if (use_remote_package_manager_) { | 118 std::string url = params->target().url().spec(); |
125 std::string url = params->target().url().spec(); | 119 shell_resolver_->ResolveMojoURL( |
126 shell_resolver_->ResolveMojoURL( | 120 url, |
127 url, | 121 base::Bind(&ApplicationManager::OnGotResolvedURL, |
128 base::Bind(&ApplicationManager::OnGotResolvedURL, | 122 weak_ptr_factory_.GetWeakPtr(), base::Passed(¶ms))); |
129 weak_ptr_factory_.GetWeakPtr(), base::Passed(¶ms))); | |
130 } else { | |
131 URLRequestPtr original_url_request = params->TakeTargetURLRequest(); | |
132 auto callback = | |
133 base::Bind(&ApplicationManager::HandleFetchCallback, | |
134 weak_ptr_factory_.GetWeakPtr(), base::Passed(¶ms)); | |
135 package_manager_->FetchRequest(std::move(original_url_request), callback); | |
136 } | |
137 } | |
138 | |
139 void ApplicationManager::UseRemotePackageManager( | |
140 bool register_mojo_url_schemes) { | |
141 use_remote_package_manager_ = true; | |
142 | |
143 GURL package_manager_url("mojo://package_manager/"); | |
144 | |
145 SetLoaderForURL(make_scoped_ptr(new package_manager::Loader( | |
146 task_runner_, register_mojo_url_schemes)), package_manager_url); | |
147 | |
148 shell::mojom::InterfaceProviderPtr interfaces; | |
149 scoped_ptr<ConnectToApplicationParams> params(new ConnectToApplicationParams); | |
150 params->set_source(Identity(GURL("mojo:shell"), std::string(), | |
151 GetPermissiveCapabilityFilter())); | |
152 params->set_remote_interfaces(GetProxy(&interfaces)); | |
153 | |
154 if (false) { | |
155 GURL file_url = | |
156 package_manager_->ResolveMojoURL(package_manager_url); | |
157 params->SetTarget(Identity(file_url, std::string(), | |
158 GetPermissiveCapabilityFilter())); | |
159 // TODO(beng): Fish the name out of a manifest. There's a chicken-and-egg | |
160 // issue here as the package manager reads the manifests. The solution is | |
161 //probably to defer application name loading. | |
162 CreateAndRunLocalApplication(std::move(params), "Package Manager", | |
163 file_url); | |
164 } else { | |
165 params->SetTarget(Identity(package_manager_url, std::string(), | |
166 GetPermissiveCapabilityFilter())); | |
167 ConnectToApplication(std::move(params)); | |
168 } | |
169 GetInterface(interfaces.get(), &shell_resolver_); | |
170 } | 123 } |
171 | 124 |
172 bool ApplicationManager::ConnectToRunningApplication( | 125 bool ApplicationManager::ConnectToRunningApplication( |
173 scoped_ptr<ConnectToApplicationParams>* params) { | 126 scoped_ptr<ConnectToApplicationParams>* params) { |
174 ApplicationInstance* instance = GetApplicationInstance((*params)->target()); | 127 ApplicationInstance* instance = GetApplicationInstance((*params)->target()); |
175 if (!instance) | 128 if (!instance) |
176 return false; | 129 return false; |
177 | 130 |
178 // TODO(beng): CHECK() that the target URL is already in the application | 131 // TODO(beng): CHECK() that the target URL is already in the application |
179 // catalog. | 132 // catalog. |
(...skipping 12 matching lines...) Expand all Loading... |
192 const GURL& url, | 145 const GURL& url, |
193 mojom::CapabilityFilterPtr filter, | 146 mojom::CapabilityFilterPtr filter, |
194 InterfaceRequest<mojom::PIDReceiver> pid_receiver) { | 147 InterfaceRequest<mojom::PIDReceiver> pid_receiver) { |
195 // We don't call ConnectToClient() here since the instance was created | 148 // We don't call ConnectToClient() here since the instance was created |
196 // manually by other code, not in response to a Connect() request. The newly | 149 // manually by other code, not in response to a Connect() request. The newly |
197 // created instance is identified by |url| and may be subsequently reached by | 150 // created instance is identified by |url| and may be subsequently reached by |
198 // client code using this identity. | 151 // client code using this identity. |
199 CapabilityFilter local_filter = filter->filter.To<CapabilityFilter>(); | 152 CapabilityFilter local_filter = filter->filter.To<CapabilityFilter>(); |
200 Identity target_id(url, std::string(), local_filter); | 153 Identity target_id(url, std::string(), local_filter); |
201 mojom::ShellClientRequest request; | 154 mojom::ShellClientRequest request; |
| 155 // TODO(beng): do better than url.spec() for application name. |
202 ApplicationInstance* instance = CreateInstance( | 156 ApplicationInstance* instance = CreateInstance( |
203 target_id, EmptyConnectCallback(), base::Closure(), | 157 target_id, EmptyConnectCallback(), base::Closure(), |
204 package_manager_->GetApplicationName(url.spec()), &request); | 158 url.spec(), &request); |
205 instance->BindPIDReceiver(std::move(pid_receiver)); | 159 instance->BindPIDReceiver(std::move(pid_receiver)); |
206 scoped_ptr<NativeRunner> runner = | 160 scoped_ptr<NativeRunner> runner = |
207 native_runner_factory_->Create(base::FilePath()); | 161 native_runner_factory_->Create(base::FilePath()); |
208 runner->InitHost(std::move(channel), std::move(request)); | 162 runner->InitHost(std::move(channel), std::move(request)); |
209 instance->SetNativeRunner(runner.get()); | 163 instance->SetNativeRunner(runner.get()); |
210 native_runners_.push_back(std::move(runner)); | 164 native_runners_.push_back(std::move(runner)); |
211 } | 165 } |
212 | 166 |
213 void ApplicationManager::AddListener( | 167 void ApplicationManager::AddListener( |
214 mojom::ApplicationManagerListenerPtr listener) { | 168 mojom::ApplicationManagerListenerPtr listener) { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 mojom::ApplicationInfoPtr application_info = | 227 mojom::ApplicationInfoPtr application_info = |
274 CreateApplicationInfoForInstance(instance); | 228 CreateApplicationInfoForInstance(instance); |
275 listeners_.ForAllPtrs( | 229 listeners_.ForAllPtrs( |
276 [this, &application_info](mojom::ApplicationManagerListener* listener) { | 230 [this, &application_info](mojom::ApplicationManagerListener* listener) { |
277 listener->ApplicationInstanceCreated(application_info.Clone()); | 231 listener->ApplicationInstanceCreated(application_info.Clone()); |
278 }); | 232 }); |
279 instance->InitializeApplication(); | 233 instance->InitializeApplication(); |
280 return instance; | 234 return instance; |
281 } | 235 } |
282 | 236 |
| 237 uint32_t ApplicationManager::StartContentHandler( |
| 238 const Identity& source, |
| 239 const Identity& content_handler, |
| 240 const GURL& url, |
| 241 mojom::ShellClientRequest request) { |
| 242 URLResponsePtr response(URLResponse::New()); |
| 243 response->url = url.spec(); |
| 244 ContentHandlerConnection* connection = |
| 245 GetContentHandler(content_handler, source); |
| 246 connection->StartApplication(std::move(request), std::move(response)); |
| 247 return connection->id(); |
| 248 } |
| 249 |
| 250 ContentHandlerConnection* ApplicationManager::GetContentHandler( |
| 251 const Identity& content_handler_identity, |
| 252 const Identity& source_identity) { |
| 253 auto it = identity_to_content_handler_.find(content_handler_identity); |
| 254 if (it != identity_to_content_handler_.end()) |
| 255 return it->second; |
| 256 |
| 257 ContentHandlerConnection* connection = new ContentHandlerConnection( |
| 258 this, source_identity, |
| 259 content_handler_identity, |
| 260 ++content_handler_id_counter_, |
| 261 base::Bind(&ApplicationManager::OnContentHandlerConnectionClosed, |
| 262 weak_ptr_factory_.GetWeakPtr())); |
| 263 identity_to_content_handler_[content_handler_identity] = connection; |
| 264 return connection; |
| 265 } |
| 266 |
| 267 void ApplicationManager::OnContentHandlerConnectionClosed( |
| 268 ContentHandlerConnection* connection) { |
| 269 // Remove the mapping. |
| 270 auto it = identity_to_content_handler_.find(connection->identity()); |
| 271 DCHECK(it != identity_to_content_handler_.end()); |
| 272 identity_to_content_handler_.erase(it); |
| 273 } |
| 274 |
283 void ApplicationManager::OnGotResolvedURL( | 275 void ApplicationManager::OnGotResolvedURL( |
284 scoped_ptr<ConnectToApplicationParams> params, | 276 scoped_ptr<ConnectToApplicationParams> params, |
285 const String& resolved_url, | 277 const String& resolved_url, |
286 const String& file_url, | 278 const String& file_url, |
287 const String& application_name, | 279 const String& application_name, |
288 mojom::CapabilityFilterPtr base_filter) { | 280 mojom::CapabilityFilterPtr base_filter) { |
289 // It's possible that when this manifest request was issued, another one was | 281 // It's possible that when this manifest request was issued, another one was |
290 // already in-progress and completed by the time this one did, and so the | 282 // already in-progress and completed by the time this one did, and so the |
291 // requested application may already be running. | 283 // requested application may already be running. |
292 if (ConnectToRunningApplication(¶ms)) | 284 if (ConnectToRunningApplication(¶ms)) |
293 return; | 285 return; |
294 | 286 |
295 GURL resolved_gurl = resolved_url.To<GURL>(); | 287 GURL resolved_gurl = resolved_url.To<GURL>(); |
296 if (params->target().url().spec() != resolved_url) { | 288 if (params->target().url().spec() != resolved_url) { |
297 CapabilityFilter capability_filter = GetPermissiveCapabilityFilter(); | 289 CapabilityFilter capability_filter = GetPermissiveCapabilityFilter(); |
298 if (!base_filter.is_null()) | 290 if (!base_filter.is_null()) |
299 capability_filter = base_filter->filter.To<CapabilityFilter>(); | 291 capability_filter = base_filter->filter.To<CapabilityFilter>(); |
300 | 292 |
301 // TODO(beng): For now, we just use the legacy PackageManagerImpl to manage | 293 // TODO(beng): For now, we just use the legacy PackageManagerImpl to manage |
302 // the ContentHandler connection. Once we get rid of the | 294 // the ContentHandler connection. Once we get rid of the |
303 // non-remote package manager path we will have to fold this in | 295 // non-remote package manager path we will have to fold this in |
304 // here. | 296 // here. |
305 Identity source, target; | 297 Identity source, target; |
306 mojom::ShellClientRequest request; | 298 mojom::ShellClientRequest request; |
307 ApplicationInstance* instance = CreateAndConnectToInstance( | 299 ApplicationInstance* instance = CreateAndConnectToInstance( |
308 std::move(params), &source, &target, application_name, &request); | 300 std::move(params), &source, &target, application_name, &request); |
309 | 301 |
310 uint32_t content_handler_id = package_manager_->StartContentHandler( | 302 uint32_t content_handler_id = StartContentHandler( |
311 source, Identity(resolved_gurl, target.qualifier(), capability_filter), | 303 source, Identity(resolved_gurl, target.qualifier(), capability_filter), |
312 target.url(), std::move(request)); | 304 target.url(), std::move(request)); |
313 CHECK(content_handler_id != mojom::Shell::kInvalidApplicationID); | 305 CHECK(content_handler_id != mojom::Shell::kInvalidApplicationID); |
314 instance->set_requesting_content_handler_id(content_handler_id); | 306 instance->set_requesting_content_handler_id(content_handler_id); |
315 instance->RunConnectCallback(); | 307 instance->RunConnectCallback(); |
316 return; | 308 return; |
317 } | 309 } |
318 CreateAndRunLocalApplication(std::move(params), application_name, | 310 CreateAndRunLocalApplication(std::move(params), application_name, |
319 file_url.To<GURL>()); | 311 file_url.To<GURL>()); |
320 } | 312 } |
321 | 313 |
322 void ApplicationManager::CreateAndRunLocalApplication( | 314 void ApplicationManager::CreateAndRunLocalApplication( |
323 scoped_ptr<ConnectToApplicationParams> params, | 315 scoped_ptr<ConnectToApplicationParams> params, |
324 const String& application_name, | 316 const String& application_name, |
325 const GURL& file_url) { | 317 const GURL& file_url) { |
326 Identity source, target; | 318 Identity source, target; |
327 mojom::ShellClientRequest request; | 319 mojom::ShellClientRequest request; |
328 ApplicationInstance* instance = CreateAndConnectToInstance( | 320 ApplicationInstance* instance = CreateAndConnectToInstance( |
329 std::move(params), &source, &target, application_name, &request); | 321 std::move(params), &source, &target, application_name, &request); |
330 | 322 |
331 scoped_ptr<Fetcher> fetcher; | |
332 bool start_sandboxed = false; | 323 bool start_sandboxed = false; |
333 RunNativeApplication(std::move(request), start_sandboxed, std::move(fetcher), | 324 RunNativeApplication(std::move(request), start_sandboxed, instance, |
334 instance, util::UrlToFilePath(file_url), true); | 325 util::UrlToFilePath(file_url)); |
335 instance->RunConnectCallback(); | |
336 } | |
337 | |
338 void ApplicationManager::HandleFetchCallback( | |
339 scoped_ptr<ConnectToApplicationParams> params, | |
340 scoped_ptr<Fetcher> fetcher) { | |
341 if (!fetcher) { | |
342 // Network error. Drop |params| to tell the requestor. | |
343 params->connect_callback().Run(mojom::Shell::kInvalidApplicationID, | |
344 mojom::Shell::kInvalidApplicationID); | |
345 return; | |
346 } | |
347 | |
348 GURL redirect_url = fetcher->GetRedirectURL(); | |
349 if (!redirect_url.is_empty()) { | |
350 // And around we go again... Whee! | |
351 // TODO(sky): this loses the original URL info. | |
352 URLRequestPtr new_request = URLRequest::New(); | |
353 new_request->url = redirect_url.spec(); | |
354 HttpHeaderPtr header = HttpHeader::New(); | |
355 header->name = "Referer"; | |
356 header->value = fetcher->GetRedirectReferer().spec(); | |
357 new_request->headers.push_back(std::move(header)); | |
358 params->SetTargetURLRequest(std::move(new_request)); | |
359 ConnectToApplication(std::move(params)); | |
360 return; | |
361 } | |
362 | |
363 // We already checked if the application was running before we fetched it, but | |
364 // it might have started while the fetch was outstanding. We don't want to | |
365 // have two copies of the app running, so check again. | |
366 if (ConnectToRunningApplication(¶ms)) | |
367 return; | |
368 | |
369 Identity source, target; | |
370 mojom::ShellClientRequest request; | |
371 std::string application_name = | |
372 package_manager_->GetApplicationName(params->target().url().spec()); | |
373 ApplicationInstance* instance = CreateAndConnectToInstance( | |
374 std::move(params), &source, &target, application_name, &request); | |
375 | |
376 uint32_t content_handler_id = package_manager_->HandleWithContentHandler( | |
377 fetcher.get(), source, target.url(), target.filter(), &request); | |
378 if (content_handler_id != mojom::Shell::kInvalidApplicationID) { | |
379 instance->set_requesting_content_handler_id(content_handler_id); | |
380 } else { | |
381 bool start_sandboxed = false; | |
382 fetcher->AsPath( | |
383 task_runner_, | |
384 base::Bind(&ApplicationManager::RunNativeApplication, | |
385 weak_ptr_factory_.GetWeakPtr(), | |
386 base::Passed(std::move(request)), start_sandboxed, | |
387 base::Passed(std::move(fetcher)), | |
388 base::Unretained(instance))); | |
389 } | |
390 instance->RunConnectCallback(); | 326 instance->RunConnectCallback(); |
391 } | 327 } |
392 | 328 |
393 void ApplicationManager::RunNativeApplication( | 329 void ApplicationManager::RunNativeApplication( |
394 InterfaceRequest<mojom::ShellClient> request, | 330 InterfaceRequest<mojom::ShellClient> request, |
395 bool start_sandboxed, | 331 bool start_sandboxed, |
396 scoped_ptr<Fetcher> fetcher, | |
397 ApplicationInstance* instance, | 332 ApplicationInstance* instance, |
398 const base::FilePath& path, | 333 const base::FilePath& path) { |
399 bool path_exists) { | |
400 // We only passed fetcher to keep it alive. Done with it now. | |
401 fetcher.reset(); | |
402 | |
403 DCHECK(request.is_pending()); | 334 DCHECK(request.is_pending()); |
404 | 335 |
405 if (!path_exists) { | |
406 LOG(ERROR) << "Library not started because library path '" << path.value() | |
407 << "' does not exist."; | |
408 return; | |
409 } | |
410 | |
411 TRACE_EVENT1("mojo_shell", "ApplicationManager::RunNativeApplication", "path", | 336 TRACE_EVENT1("mojo_shell", "ApplicationManager::RunNativeApplication", "path", |
412 path.AsUTF8Unsafe()); | 337 path.AsUTF8Unsafe()); |
413 scoped_ptr<NativeRunner> runner = native_runner_factory_->Create(path); | 338 scoped_ptr<NativeRunner> runner = native_runner_factory_->Create(path); |
414 runner->Start(path, start_sandboxed, std::move(request), | 339 runner->Start(path, start_sandboxed, std::move(request), |
415 base::Bind(&ApplicationManager::ApplicationPIDAvailable, | 340 base::Bind(&ApplicationManager::ApplicationPIDAvailable, |
416 weak_ptr_factory_.GetWeakPtr(), instance->id()), | 341 weak_ptr_factory_.GetWeakPtr(), instance->id()), |
417 base::Bind(&ApplicationManager::CleanupRunner, | 342 base::Bind(&ApplicationManager::CleanupRunner, |
418 weak_ptr_factory_.GetWeakPtr(), runner.get())); | 343 weak_ptr_factory_.GetWeakPtr(), runner.get())); |
419 instance->SetNativeRunner(runner.get()); | 344 instance->SetNativeRunner(runner.get()); |
420 native_runners_.push_back(std::move(runner)); | 345 native_runners_.push_back(std::move(runner)); |
421 } | 346 } |
422 | 347 |
423 void ApplicationManager::SetLoaderForURL(scoped_ptr<ApplicationLoader> loader, | 348 void ApplicationManager::SetLoaderForURL(scoped_ptr<ApplicationLoader> loader, |
424 const GURL& url) { | 349 const GURL& url) { |
425 URLToLoaderMap::iterator it = url_to_loader_.find(url); | 350 URLToLoaderMap::iterator it = url_to_loader_.find(url); |
426 if (it != url_to_loader_.end()) | 351 if (it != url_to_loader_.end()) |
427 delete it->second; | 352 delete it->second; |
428 url_to_loader_[url] = loader.release(); | 353 url_to_loader_[url] = loader.release(); |
429 } | 354 } |
430 | 355 |
431 ApplicationLoader* ApplicationManager::GetLoaderForURL(const GURL& url) { | 356 ApplicationLoader* ApplicationManager::GetLoaderForURL(const GURL& url) { |
432 auto url_it = url_to_loader_.find(GetBaseURLAndQuery(url, nullptr)); | 357 auto url_it = url_to_loader_.find(url); |
433 if (url_it != url_to_loader_.end()) | 358 if (url_it != url_to_loader_.end()) |
434 return url_it->second; | 359 return url_it->second; |
435 return default_loader_.get(); | 360 return default_loader_.get(); |
436 } | 361 } |
437 | 362 |
438 mojom::ApplicationInfoPtr ApplicationManager::CreateApplicationInfoForInstance( | 363 mojom::ApplicationInfoPtr ApplicationManager::CreateApplicationInfoForInstance( |
439 ApplicationInstance* instance) const { | 364 ApplicationInstance* instance) const { |
440 mojom::ApplicationInfoPtr info(mojom::ApplicationInfo::New()); | 365 mojom::ApplicationInfoPtr info(mojom::ApplicationInfo::New()); |
441 info->id = instance->id(); | 366 info->id = instance->id(); |
442 info->url = instance->identity().url().spec(); | 367 info->url = instance->identity().url().spec(); |
443 info->qualifier = instance->identity().qualifier(); | 368 info->qualifier = instance->identity().qualifier(); |
444 if (use_remote_package_manager_) | 369 info->name = instance->application_name(); |
445 info->name = instance->application_name(); | |
446 else | |
447 info->name = package_manager_->GetApplicationName(info->url); | |
448 if (instance->identity().url().spec() == "mojo://shell/") | 370 if (instance->identity().url().spec() == "mojo://shell/") |
449 info->pid = base::Process::Current().Pid(); | 371 info->pid = base::Process::Current().Pid(); |
450 else | 372 else |
451 info->pid = instance->pid(); | 373 info->pid = instance->pid(); |
452 return info; | 374 return info; |
453 } | 375 } |
454 | 376 |
455 void ApplicationManager::OnApplicationInstanceError( | 377 void ApplicationManager::OnApplicationInstanceError( |
456 ApplicationInstance* instance) { | 378 ApplicationInstance* instance) { |
457 // Called from ~ApplicationInstance, so we do not need to call Destroy here. | 379 // Called from ~ApplicationInstance, so we do not need to call Destroy here. |
(...skipping 21 matching lines...) Expand all Loading... |
479 } | 401 } |
480 } | 402 } |
481 } | 403 } |
482 | 404 |
483 mojom::Shell::ConnectToApplicationCallback EmptyConnectCallback() { | 405 mojom::Shell::ConnectToApplicationCallback EmptyConnectCallback() { |
484 return base::Bind(&OnEmptyOnConnectCallback); | 406 return base::Bind(&OnEmptyOnConnectCallback); |
485 } | 407 } |
486 | 408 |
487 } // namespace shell | 409 } // namespace shell |
488 } // namespace mojo | 410 } // namespace mojo |
OLD | NEW |