| 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/connect_util.h" | 23 #include "mojo/shell/connect_util.h" |
| 24 #include "mojo/shell/content_handler_connection.h" | |
| 25 #include "mojo/shell/public/cpp/connect.h" | 24 #include "mojo/shell/public/cpp/connect.h" |
| 26 #include "mojo/shell/shell_application_loader.h" | 25 #include "mojo/shell/shell_application_loader.h" |
| 26 #include "mojo/shell/shell_client_factory_connection.h" |
| 27 #include "mojo/shell/switches.h" | 27 #include "mojo/shell/switches.h" |
| 28 #include "mojo/util/filename_util.h" | 28 #include "mojo/util/filename_util.h" |
| 29 | 29 |
| 30 namespace mojo { | 30 namespace mojo { |
| 31 namespace shell { | 31 namespace shell { |
| 32 | 32 |
| 33 namespace { | 33 namespace { |
| 34 | 34 |
| 35 // Used by TestAPI. | 35 // Used by TestAPI. |
| 36 bool has_created_instance = false; | 36 bool has_created_instance = false; |
| 37 | 37 |
| 38 void OnEmptyOnConnectCallback(uint32_t remote_id, uint32_t content_handler_id) { | 38 void OnEmptyOnConnectCallback(uint32_t remote_id, |
| 39 uint32_t shell_client_factory_id) { |
| 39 } | 40 } |
| 40 | 41 |
| 41 } // namespace | 42 } // namespace |
| 42 | 43 |
| 43 // static | 44 // static |
| 44 ApplicationManager::TestAPI::TestAPI(ApplicationManager* manager) | 45 ApplicationManager::TestAPI::TestAPI(ApplicationManager* manager) |
| 45 : manager_(manager) { | 46 : manager_(manager) { |
| 46 } | 47 } |
| 47 | 48 |
| 48 ApplicationManager::TestAPI::~TestAPI() { | 49 ApplicationManager::TestAPI::~TestAPI() { |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 mojom::ApplicationInfoPtr application_info = | 228 mojom::ApplicationInfoPtr application_info = |
| 228 CreateApplicationInfoForInstance(instance); | 229 CreateApplicationInfoForInstance(instance); |
| 229 listeners_.ForAllPtrs( | 230 listeners_.ForAllPtrs( |
| 230 [this, &application_info](mojom::ApplicationManagerListener* listener) { | 231 [this, &application_info](mojom::ApplicationManagerListener* listener) { |
| 231 listener->ApplicationInstanceCreated(application_info.Clone()); | 232 listener->ApplicationInstanceCreated(application_info.Clone()); |
| 232 }); | 233 }); |
| 233 instance->InitializeApplication(); | 234 instance->InitializeApplication(); |
| 234 return instance; | 235 return instance; |
| 235 } | 236 } |
| 236 | 237 |
| 237 uint32_t ApplicationManager::StartContentHandler( | 238 uint32_t ApplicationManager::StartShellClientFactory( |
| 238 const Identity& source, | 239 const Identity& source, |
| 239 const Identity& content_handler, | 240 const Identity& shell_client_factory, |
| 240 const GURL& url, | 241 const GURL& url, |
| 241 mojom::ShellClientRequest request) { | 242 mojom::ShellClientRequest request) { |
| 242 URLResponsePtr response(URLResponse::New()); | 243 ShellClientFactoryConnection* connection = |
| 243 response->url = url.spec(); | 244 GetShellClientFactory(shell_client_factory, source); |
| 244 ContentHandlerConnection* connection = | 245 connection->CreateShellClient(std::move(request), url); |
| 245 GetContentHandler(content_handler, source); | |
| 246 connection->StartApplication(std::move(request), std::move(response)); | |
| 247 return connection->id(); | 246 return connection->id(); |
| 248 } | 247 } |
| 249 | 248 |
| 250 ContentHandlerConnection* ApplicationManager::GetContentHandler( | 249 ShellClientFactoryConnection* ApplicationManager::GetShellClientFactory( |
| 251 const Identity& content_handler_identity, | 250 const Identity& shell_client_factory_identity, |
| 252 const Identity& source_identity) { | 251 const Identity& source_identity) { |
| 253 auto it = identity_to_content_handler_.find(content_handler_identity); | 252 auto it = identity_to_shell_client_factory_.find( |
| 254 if (it != identity_to_content_handler_.end()) | 253 shell_client_factory_identity); |
| 254 if (it != identity_to_shell_client_factory_.end()) |
| 255 return it->second; | 255 return it->second; |
| 256 | 256 |
| 257 ContentHandlerConnection* connection = new ContentHandlerConnection( | 257 ShellClientFactoryConnection* connection = new ShellClientFactoryConnection( |
| 258 this, source_identity, | 258 this, source_identity, |
| 259 content_handler_identity, | 259 shell_client_factory_identity, |
| 260 ++content_handler_id_counter_, | 260 ++shell_client_factory_id_counter_, |
| 261 base::Bind(&ApplicationManager::OnContentHandlerConnectionClosed, | 261 base::Bind(&ApplicationManager::OnShellClientFactoryConnectionClosed, |
| 262 weak_ptr_factory_.GetWeakPtr())); | 262 weak_ptr_factory_.GetWeakPtr())); |
| 263 identity_to_content_handler_[content_handler_identity] = connection; | 263 identity_to_shell_client_factory_[shell_client_factory_identity] = connection; |
| 264 return connection; | 264 return connection; |
| 265 } | 265 } |
| 266 | 266 |
| 267 void ApplicationManager::OnContentHandlerConnectionClosed( | 267 void ApplicationManager::OnShellClientFactoryConnectionClosed( |
| 268 ContentHandlerConnection* connection) { | 268 ShellClientFactoryConnection* connection) { |
| 269 // Remove the mapping. | 269 // Remove the mapping. |
| 270 auto it = identity_to_content_handler_.find(connection->identity()); | 270 auto it = identity_to_shell_client_factory_.find(connection->identity()); |
| 271 DCHECK(it != identity_to_content_handler_.end()); | 271 DCHECK(it != identity_to_shell_client_factory_.end()); |
| 272 identity_to_content_handler_.erase(it); | 272 identity_to_shell_client_factory_.erase(it); |
| 273 } | 273 } |
| 274 | 274 |
| 275 void ApplicationManager::OnGotResolvedURL( | 275 void ApplicationManager::OnGotResolvedURL( |
| 276 scoped_ptr<ConnectToApplicationParams> params, | 276 scoped_ptr<ConnectToApplicationParams> params, |
| 277 const String& resolved_url, | 277 const String& resolved_url, |
| 278 const String& file_url, | 278 const String& file_url, |
| 279 const String& application_name, | 279 const String& application_name, |
| 280 mojom::CapabilityFilterPtr base_filter) { | 280 mojom::CapabilityFilterPtr base_filter) { |
| 281 // 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 |
| 282 // 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 |
| 283 // requested application may already be running. | 283 // requested application may already be running. |
| 284 if (ConnectToRunningApplication(¶ms)) | 284 if (ConnectToRunningApplication(¶ms)) |
| 285 return; | 285 return; |
| 286 | 286 |
| 287 GURL resolved_gurl = resolved_url.To<GURL>(); | 287 GURL resolved_gurl = resolved_url.To<GURL>(); |
| 288 if (params->target().url().spec() != resolved_url) { | 288 if (params->target().url().spec() != resolved_url) { |
| 289 CapabilityFilter capability_filter = GetPermissiveCapabilityFilter(); | 289 CapabilityFilter capability_filter = GetPermissiveCapabilityFilter(); |
| 290 if (!base_filter.is_null()) | 290 if (!base_filter.is_null()) |
| 291 capability_filter = base_filter->filter.To<CapabilityFilter>(); | 291 capability_filter = base_filter->filter.To<CapabilityFilter>(); |
| 292 | 292 |
| 293 // 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 |
| 294 // the ContentHandler connection. Once we get rid of the | 294 // the ShellClientFactory connection. Once we get rid of the |
| 295 // 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 |
| 296 // here. | 296 // here. |
| 297 Identity source, target; | 297 Identity source, target; |
| 298 mojom::ShellClientRequest request; | 298 mojom::ShellClientRequest request; |
| 299 ApplicationInstance* instance = CreateAndConnectToInstance( | 299 ApplicationInstance* instance = CreateAndConnectToInstance( |
| 300 std::move(params), &source, &target, application_name, &request); | 300 std::move(params), &source, &target, application_name, &request); |
| 301 | 301 |
| 302 uint32_t content_handler_id = StartContentHandler( | 302 uint32_t shell_client_factory_id = StartShellClientFactory( |
| 303 source, Identity(resolved_gurl, target.qualifier(), capability_filter), | 303 source, Identity(resolved_gurl, target.qualifier(), capability_filter), |
| 304 target.url(), std::move(request)); | 304 target.url(), std::move(request)); |
| 305 CHECK(content_handler_id != mojom::Shell::kInvalidApplicationID); | 305 CHECK(shell_client_factory_id != mojom::Shell::kInvalidApplicationID); |
| 306 instance->set_requesting_content_handler_id(content_handler_id); | 306 instance->set_requesting_shell_client_factory_id(shell_client_factory_id); |
| 307 instance->RunConnectCallback(); | 307 instance->RunConnectCallback(); |
| 308 return; | 308 return; |
| 309 } | 309 } |
| 310 CreateAndRunLocalApplication(std::move(params), application_name, | 310 CreateAndRunLocalApplication(std::move(params), application_name, |
| 311 file_url.To<GURL>()); | 311 file_url.To<GURL>()); |
| 312 } | 312 } |
| 313 | 313 |
| 314 void ApplicationManager::CreateAndRunLocalApplication( | 314 void ApplicationManager::CreateAndRunLocalApplication( |
| 315 scoped_ptr<ConnectToApplicationParams> params, | 315 scoped_ptr<ConnectToApplicationParams> params, |
| 316 const String& application_name, | 316 const String& application_name, |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 } | 401 } |
| 402 } | 402 } |
| 403 } | 403 } |
| 404 | 404 |
| 405 mojom::Shell::ConnectToApplicationCallback EmptyConnectCallback() { | 405 mojom::Shell::ConnectToApplicationCallback EmptyConnectCallback() { |
| 406 return base::Bind(&OnEmptyOnConnectCallback); | 406 return base::Bind(&OnEmptyOnConnectCallback); |
| 407 } | 407 } |
| 408 | 408 |
| 409 } // namespace shell | 409 } // namespace shell |
| 410 } // namespace mojo | 410 } // namespace mojo |
| OLD | NEW |