Index: shell/application_manager/application_manager.cc |
diff --git a/shell/application_manager/application_manager.cc b/shell/application_manager/application_manager.cc |
index e6beb2117a3ad85e1ae4a3765d0b3d4686acd409..5f66af5dd076304f49be1dcde959f579b656c9f3 100644 |
--- a/shell/application_manager/application_manager.cc |
+++ b/shell/application_manager/application_manager.cc |
@@ -11,6 +11,7 @@ |
#include "base/logging.h" |
#include "base/macros.h" |
#include "base/stl_util.h" |
+#include "base/strings/string_util.h" |
#include "mojo/public/cpp/bindings/binding.h" |
#include "mojo/public/cpp/bindings/error_handler.h" |
#include "mojo/public/interfaces/application/shell.mojom.h" |
@@ -24,6 +25,17 @@ namespace mojo { |
namespace { |
// Used by TestAPI. |
bool has_created_instance = false; |
+ |
+GURL StripQueryFromURL(const GURL& url) { |
+ GURL::Replacements repl; |
+ repl.SetQueryStr(""); |
+ std::string result = url.ReplaceComponents(repl).spec(); |
+ |
+ // Remove the dangling '?' because it's ugly. |
+ base::ReplaceChars(result, "?", "", &result); |
+ return GURL(result); |
+} |
+ |
} // namespace |
ApplicationManager::Delegate::~Delegate() { |
@@ -148,7 +160,7 @@ void ApplicationManager::ConnectToApplication( |
base::Passed(exposed_services.Pass())); |
if (resolved_url.SchemeIsFile()) { |
- new LocalFetcher(resolved_url, |
+ new LocalFetcher(resolved_url, StripQueryFromURL(resolved_url), |
base::Bind(callback, NativeRunner::DontDeleteAppPath)); |
return; |
} |
@@ -161,15 +173,16 @@ void ApplicationManager::ConnectToApplication( |
} |
bool ApplicationManager::ConnectToRunningApplication( |
- const GURL& application_url, |
+ const GURL& resolved_url, |
const GURL& requestor_url, |
InterfaceRequest<ServiceProvider>* services, |
ServiceProviderPtr* exposed_services) { |
+ GURL application_url = StripQueryFromURL(resolved_url); |
ShellImpl* shell_impl = GetShellImpl(application_url); |
if (!shell_impl) |
return false; |
- ConnectToClient(shell_impl, application_url, requestor_url, services->Pass(), |
+ ConnectToClient(shell_impl, resolved_url, requestor_url, services->Pass(), |
exposed_services->Pass()); |
return true; |
} |
@@ -191,17 +204,19 @@ bool ApplicationManager::ConnectToApplicationWithLoader( |
} |
InterfaceRequest<Application> ApplicationManager::RegisterShell( |
- const GURL& requested_url, |
+ const GURL& original_url, |
const GURL& resolved_url, |
const GURL& requestor_url, |
InterfaceRequest<ServiceProvider> services, |
ServiceProviderPtr exposed_services) { |
+ GURL app_url = StripQueryFromURL(resolved_url); |
+ |
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)); |
+ new ShellImpl(application.Pass(), this, original_url, app_url); |
+ url_to_shell_impl_[app_url] = shell; |
+ shell->InitializeApplication(GetArgsForURL(original_url)); |
ConnectToClient(shell, resolved_url, requestor_url, services.Pass(), |
exposed_services.Pass()); |
return application_request.Pass(); |
@@ -216,11 +231,11 @@ ShellImpl* ApplicationManager::GetShellImpl(const GURL& url) { |
void ApplicationManager::ConnectToClient( |
ShellImpl* shell_impl, |
- const GURL& url, |
+ const GURL& resolved_url, |
const GURL& requestor_url, |
InterfaceRequest<ServiceProvider> services, |
ServiceProviderPtr exposed_services) { |
- shell_impl->ConnectToClient(requestor_url, services.Pass(), |
+ shell_impl->ConnectToClient(resolved_url, requestor_url, services.Pass(), |
exposed_services.Pass()); |
} |
@@ -255,7 +270,7 @@ void ApplicationManager::HandleFetchCallback( |
return; |
} |
- InterfaceRequest<Application> application_request( |
+ InterfaceRequest<Application> request( |
RegisterShell(requested_url, fetcher->GetURL(), requestor_url, |
services.Pass(), exposed_services.Pass())); |
@@ -264,7 +279,7 @@ void ApplicationManager::HandleFetchCallback( |
std::string shebang; |
if (fetcher->PeekContentHandler(&shebang, &content_handler_url)) { |
LoadWithContentHandler( |
- content_handler_url, application_request.Pass(), |
+ content_handler_url, request.Pass(), |
fetcher->AsURLResponse(blocking_pool_, |
static_cast<int>(shebang.size()))); |
return; |
@@ -272,7 +287,7 @@ void ApplicationManager::HandleFetchCallback( |
MimeTypeToURLMap::iterator iter = mime_type_to_url_.find(fetcher->MimeType()); |
if (iter != mime_type_to_url_.end()) { |
- LoadWithContentHandler(iter->second, application_request.Pass(), |
+ LoadWithContentHandler(iter->second, request.Pass(), |
fetcher->AsURLResponse(blocking_pool_, 0)); |
return; |
} |
@@ -282,11 +297,11 @@ void ApplicationManager::HandleFetchCallback( |
// header, or looking for some specific mojo signature prepended to the |
// library. |
- fetcher->AsPath(blocking_pool_, |
- base::Bind(&ApplicationManager::RunNativeApplication, |
- weak_ptr_factory_.GetWeakPtr(), |
- base::Passed(application_request.Pass()), |
- cleanup_behavior, base::Passed(fetcher.Pass()))); |
+ fetcher->AsPath( |
+ blocking_pool_, |
+ base::Bind(&ApplicationManager::RunNativeApplication, |
+ weak_ptr_factory_.GetWeakPtr(), base::Passed(request.Pass()), |
+ cleanup_behavior, base::Passed(fetcher.Pass()))); |
} |
void ApplicationManager::RunNativeApplication( |