Chromium Code Reviews| Index: shell/application_manager/application_manager.cc |
| diff --git a/shell/application_manager/application_manager.cc b/shell/application_manager/application_manager.cc |
| index f0c4bac91d2d1e031750b61db2ab00761e1c8a0f..51f8b1a33e0cdf78428f6d75ac75241d80dba45e 100644 |
| --- a/shell/application_manager/application_manager.cc |
| +++ b/shell/application_manager/application_manager.cc |
| @@ -104,37 +104,49 @@ void ApplicationManager::ConnectToApplication( |
| InterfaceRequest<ServiceProvider> services, |
| ServiceProviderPtr exposed_services) { |
| DCHECK(requested_url.is_valid()); |
| - GURL mapped_url = delegate_->ResolveMappings(requested_url); |
| // We check both the mapped and resolved urls for existing shell_impls because |
| // external applications can be registered for the unresolved mojo:foo urls. |
| - ShellImpl* shell_impl = GetShellImpl(mapped_url); |
| - if (shell_impl) { |
| - ConnectToClient(shell_impl, mapped_url, requestor_url, services.Pass(), |
| - exposed_services.Pass()); |
| + |
| + GURL mapped_url = delegate_->ResolveMappings(requested_url); |
| + if (ConnectToRunningApplication(mapped_url, requestor_url, &services, |
| + &exposed_services)) { |
| return; |
| } |
| GURL resolved_url = delegate_->ResolveURL(mapped_url); |
| - shell_impl = GetShellImpl(resolved_url); |
| - if (shell_impl) { |
| - ConnectToClient(shell_impl, resolved_url, requestor_url, services.Pass(), |
| - exposed_services.Pass()); |
| + if (ConnectToRunningApplication(resolved_url, requestor_url, &services, |
| + &exposed_services)) { |
| + return; |
| + } |
| + |
| + if (ConnectToApplicationWithLoader(requested_url, mapped_url, requestor_url, |
| + &services, &exposed_services, |
| + GetLoaderForURL(mapped_url))) { |
| return; |
| } |
| - ApplicationLoader* loader = |
| - GetLoaderForURL(mapped_url, DONT_INCLUDE_DEFAULT_LOADER); |
| - if (loader) { |
| - ConnectToApplicationImpl(requested_url, mapped_url, requestor_url, |
| - services.Pass(), exposed_services.Pass(), loader); |
| + if (ConnectToApplicationWithLoader(requested_url, resolved_url, requestor_url, |
| + &services, &exposed_services, |
| + GetLoaderForURL(resolved_url))) { |
| return; |
| } |
| - loader = GetLoaderForURL(resolved_url, INCLUDE_DEFAULT_LOADER); |
| - if (loader) { |
| - ConnectToApplicationImpl(requested_url, resolved_url, requestor_url, |
| - services.Pass(), exposed_services.Pass(), loader); |
| + if (ConnectToApplicationWithLoader(requested_url, resolved_url, requestor_url, |
| + &services, &exposed_services, |
| + default_loader_.get())) { |
| + return; |
| + } |
| + |
| + // TODO(aa): This case should go away, see comments in |
| + // DynamicApplicationLoader. |
| + if (dynamic_application_loader_.get()) { |
| + dynamic_application_loader_->Load( |
| + resolved_url, |
| + RegisterShell(requested_url, resolved_url, requestor_url, |
| + services.Pass(), exposed_services.Pass()).Pass(), |
|
qsr
2015/02/19 09:25:01
Is the last .Pass() necessary?
Aaron Boodman
2015/02/19 20:38:46
Done.
|
| + base::Bind(&ApplicationManager::LoadWithContentHandler, |
| + weak_ptr_factory_.GetWeakPtr())); |
| return; |
| } |
| @@ -142,25 +154,51 @@ void ApplicationManager::ConnectToApplication( |
| << requested_url.spec(); |
| } |
| -void ApplicationManager::ConnectToApplicationImpl( |
| +bool ApplicationManager::ConnectToRunningApplication( |
| + const GURL& application_url, |
| + const GURL& requestor_url, |
| + InterfaceRequest<ServiceProvider>* services, |
| + ServiceProviderPtr* exposed_services) { |
| + ShellImpl* shell_impl = GetShellImpl(application_url); |
| + if (!shell_impl) |
| + return false; |
| + |
| + ConnectToClient(shell_impl, application_url, requestor_url, services->Pass(), |
| + exposed_services->Pass()); |
| + return true; |
| +} |
| + |
| +bool ApplicationManager::ConnectToApplicationWithLoader( |
| const GURL& requested_url, |
| const GURL& resolved_url, |
| const GURL& requestor_url, |
| - InterfaceRequest<ServiceProvider> services, |
| - ServiceProviderPtr exposed_services, |
| + InterfaceRequest<ServiceProvider>* services, |
| + ServiceProviderPtr* exposed_services, |
| ApplicationLoader* loader) { |
| + if (!loader) |
| + return false; |
| + |
| + loader->Load(resolved_url, |
| + RegisterShell(requested_url, resolved_url, requestor_url, |
| + services->Pass(), exposed_services->Pass())); |
| + return true; |
| +} |
| + |
| +InterfaceRequest<Application> ApplicationManager::RegisterShell( |
| + const GURL& requested_url, |
| + const GURL& resolved_url, |
| + const GURL& requestor_url, |
| + InterfaceRequest<ServiceProvider> services, |
| + ServiceProviderPtr exposed_services) { |
| ApplicationPtr application; |
| InterfaceRequest<Application> application_request = GetProxy(&application); |
| ShellImpl* shell = |
| new ShellImpl(application.Pass(), this, requested_url, resolved_url); |
| url_to_shell_impl_[resolved_url] = shell; |
| shell->InitializeApplication(GetArgsForURL(requested_url)); |
| - |
| - loader->Load(this, resolved_url, application_request.Pass(), |
| - base::Bind(&ApplicationManager::LoadWithContentHandler, |
| - weak_ptr_factory_.GetWeakPtr())); |
| ConnectToClient(shell, resolved_url, requestor_url, services.Pass(), |
| exposed_services.Pass()); |
| + return application_request.Pass(); |
| } |
| ShellImpl* ApplicationManager::GetShellImpl(const GURL& url) { |
| @@ -234,17 +272,13 @@ void ApplicationManager::SetArgsForURL(const std::vector<std::string>& args, |
| url_to_args_[url] = args; |
| } |
| -ApplicationLoader* ApplicationManager::GetLoaderForURL( |
| - const GURL& url, |
| - IncludeDefaultLoader include_default_loader) { |
| +ApplicationLoader* ApplicationManager::GetLoaderForURL(const GURL& url) { |
| auto url_it = url_to_loader_.find(url); |
| if (url_it != url_to_loader_.end()) |
| return url_it->second; |
| auto scheme_it = scheme_to_loader_.find(url.scheme()); |
| if (scheme_it != scheme_to_loader_.end()) |
| return scheme_it->second; |
| - if (include_default_loader == INCLUDE_DEFAULT_LOADER) |
| - return default_loader_.get(); |
| return NULL; |
| } |
| @@ -257,10 +291,6 @@ void ApplicationManager::OnShellImplError(ShellImpl* shell_impl) { |
| DCHECK(it != url_to_shell_impl_.end()); |
| delete it->second; |
| url_to_shell_impl_.erase(it); |
| - ApplicationLoader* loader = |
| - GetLoaderForURL(requested_url, INCLUDE_DEFAULT_LOADER); |
| - if (loader) |
| - loader->OnApplicationError(this, url); |
| delegate_->OnApplicationError(requested_url); |
| } |