Index: shell/application_manager/application_manager.cc |
diff --git a/shell/application_manager/application_manager.cc b/shell/application_manager/application_manager.cc |
index 52de7f8e2ec33d7b88fd64c8fe037b12e190a46d..e6beb2117a3ad85e1ae4a3765d0b3d4686acd409 100644 |
--- a/shell/application_manager/application_manager.cc |
+++ b/shell/application_manager/application_manager.cc |
@@ -142,13 +142,10 @@ void ApplicationManager::ConnectToApplication( |
return; |
} |
- InterfaceRequest<Application> application_request = |
- RegisterShell(requested_url, resolved_url, requestor_url, services.Pass(), |
- exposed_services.Pass()); |
- |
auto callback = base::Bind(&ApplicationManager::HandleFetchCallback, |
- weak_ptr_factory_.GetWeakPtr(), |
- base::Passed(application_request.Pass())); |
+ weak_ptr_factory_.GetWeakPtr(), requested_url, |
+ requestor_url, base::Passed(services.Pass()), |
+ base::Passed(exposed_services.Pass())); |
if (resolved_url.SchemeIsFile()) { |
new LocalFetcher(resolved_url, |
@@ -228,7 +225,10 @@ void ApplicationManager::ConnectToClient( |
} |
void ApplicationManager::HandleFetchCallback( |
- InterfaceRequest<Application> application_request, |
+ const GURL& requested_url, |
+ const GURL& requestor_url, |
+ InterfaceRequest<ServiceProvider> services, |
+ ServiceProviderPtr exposed_services, |
NativeRunner::CleanupBehavior cleanup_behavior, |
scoped_ptr<Fetcher> fetcher) { |
if (!fetcher) { |
@@ -236,12 +236,35 @@ void ApplicationManager::HandleFetchCallback( |
return; |
} |
+ GURL redirect_url = fetcher->GetRedirectURL(); |
+ if (!redirect_url.is_empty()) { |
+ // And around we go again... Whee! |
qsr
2015/02/26 10:41:56
Is there any advantage to try to use the url_loade
|
+ ConnectToApplication(redirect_url, requestor_url, services.Pass(), |
+ exposed_services.Pass()); |
+ return; |
+ } |
+ |
+ // We already checked if the application was running before we fetched it, but |
+ // it might have started while the fetch was outstanding. We don't want to |
+ // have two copies of the app running, so check again. |
+ // |
+ // Also, it's possible the original URL was redirected to an app that is |
+ // already running. |
+ if (ConnectToRunningApplication(fetcher->GetURL(), requestor_url, &services, |
+ &exposed_services)) { |
+ return; |
+ } |
+ |
+ InterfaceRequest<Application> application_request( |
+ RegisterShell(requested_url, fetcher->GetURL(), requestor_url, |
+ services.Pass(), exposed_services.Pass())); |
+ |
// If the response begins with a #!mojo <content-handler-url>, use it. |
- GURL url; |
+ GURL content_handler_url; |
std::string shebang; |
- if (fetcher->PeekContentHandler(&shebang, &url)) { |
+ if (fetcher->PeekContentHandler(&shebang, &content_handler_url)) { |
LoadWithContentHandler( |
- url, application_request.Pass(), |
+ content_handler_url, application_request.Pass(), |
fetcher->AsURLResponse(blocking_pool_, |
static_cast<int>(shebang.size()))); |
return; |