Index: mojo/shell/application_manager.cc |
diff --git a/mojo/shell/application_manager.cc b/mojo/shell/application_manager.cc |
index acafadb715f5655e574ab9c73ae8e476bab6f293..cb834018770eb02fb0751af90ec00167d4357124 100644 |
--- a/mojo/shell/application_manager.cc |
+++ b/mojo/shell/application_manager.cc |
@@ -73,64 +73,75 @@ void ApplicationManager::TerminateShellConnections() { |
void ApplicationManager::ConnectToApplication( |
ApplicationInstance* originator, |
- mojo::URLRequestPtr requested_url, |
+ URLRequestPtr requested_url, |
const std::string& qualifier, |
const GURL& requestor_url, |
InterfaceRequest<ServiceProvider> services, |
ServiceProviderPtr exposed_services, |
- const CapabilityFilter& filter, |
+ const CapabilityFilter& capability_filter, |
const base::Closure& on_application_end, |
const Shell::ConnectToApplicationCallback& connect_callback) { |
- GURL requested_gurl(requested_url->url.To<std::string>()); |
- TRACE_EVENT_INSTANT1( |
- "mojo_shell", "ApplicationManager::ConnectToApplication", |
- TRACE_EVENT_SCOPE_THREAD, "requested_url", requested_gurl.spec()); |
- DCHECK(requested_gurl.is_valid()); |
+ DCHECK(requestor_url.is_empty()); |
+ scoped_ptr<ConnectToApplicationParams> params(new ConnectToApplicationParams); |
+ params->SetOriginatorInfo(originator); |
+ params->SetURLInfo(requested_url.Pass()); |
+ params->set_qualifier(qualifier); |
+ params->set_services(services.Pass()); |
+ params->set_exposed_services(exposed_services.Pass()); |
+ params->set_filter(capability_filter); |
+ params->set_on_application_end(on_application_end); |
+ params->set_connect_callback(connect_callback); |
+ |
+ ConnectToApplication(params.Pass()); |
+} |
+ |
+void ApplicationManager::ConnectToApplication( |
+ scoped_ptr<ConnectToApplicationParams> params) { |
+ GURL original_url = params->app_url(); |
+ URLRequestPtr original_url_request = params->TakeAppURLRequest(); |
+ |
+ TRACE_EVENT_INSTANT1("mojo_shell", "ApplicationManager::ConnectToApplication", |
+ TRACE_EVENT_SCOPE_THREAD, "original_url", |
+ original_url.spec()); |
+ DCHECK(original_url.is_valid()); |
+ DCHECK(original_url_request); |
// We check both the mapped and resolved urls for existing instances because |
// external applications can be registered for the unresolved mojo:foo urls. |
- GURL mapped_url = delegate_->ResolveMappings(requested_gurl); |
- if (ConnectToRunningApplication(originator, mapped_url, qualifier, |
- requestor_url, &services, &exposed_services, |
- filter, connect_callback)) { |
+ GURL mapped_url = delegate_->ResolveMappings(original_url); |
+ params->SetURLInfo(mapped_url); |
+ if (ConnectToRunningApplication(¶ms)) |
return; |
- } |
GURL resolved_url = delegate_->ResolveMojoURL(mapped_url); |
- if (ConnectToRunningApplication(originator, resolved_url, qualifier, |
- requestor_url, &services, &exposed_services, |
- filter, connect_callback)) { |
+ params->SetURLInfo(resolved_url); |
+ if (ConnectToRunningApplication(¶ms)) |
return; |
- } |
// The application is not running, let's compute the parameters. |
- if (ConnectToApplicationWithLoader( |
- originator, requested_gurl, qualifier, mapped_url, requestor_url, |
- &services, &exposed_services, filter, on_application_end, |
- connect_callback, GetLoaderForURL(mapped_url))) { |
+ // NOTE: Set URL info using |original_url_request| instead of |original_url| |
+ // because it may contain more information (e.g., it is a POST request). |
+ params->SetURLInfo(original_url_request.Pass()); |
+ if (ConnectToApplicationWithLoader(¶ms, mapped_url, |
+ GetLoaderForURL(mapped_url))) { |
return; |
} |
- if (ConnectToApplicationWithLoader( |
- originator, requested_gurl, qualifier, resolved_url, requestor_url, |
- &services, &exposed_services, filter, on_application_end, |
- connect_callback, GetLoaderForURL(resolved_url))) { |
+ if (ConnectToApplicationWithLoader(¶ms, resolved_url, |
+ GetLoaderForURL(resolved_url))) { |
return; |
} |
- if (ConnectToApplicationWithLoader( |
- originator, requested_gurl, qualifier, resolved_url, requestor_url, |
- &services, &exposed_services, filter, on_application_end, |
- connect_callback, default_loader_.get())) { |
+ if (ConnectToApplicationWithLoader(¶ms, resolved_url, |
+ default_loader_.get())) { |
return; |
} |
- auto callback = base::Bind( |
- &ApplicationManager::HandleFetchCallback, weak_ptr_factory_.GetWeakPtr(), |
- originator, requested_gurl, qualifier, requestor_url, |
- base::Passed(services.Pass()), base::Passed(exposed_services.Pass()), |
- filter, on_application_end, connect_callback); |
+ original_url_request = params->TakeAppURLRequest(); |
+ auto callback = |
+ base::Bind(&ApplicationManager::HandleFetchCallback, |
+ weak_ptr_factory_.GetWeakPtr(), base::Passed(¶ms)); |
if (delegate_->CreateFetcher( |
resolved_url, |
@@ -141,7 +152,7 @@ void ApplicationManager::ConnectToApplication( |
if (resolved_url.SchemeIsFile()) { |
// LocalFetcher uses the network service to infer MIME types from URLs. |
// Skip this for mojo URLs to avoid recursively loading the network service. |
- if (!network_service_ && !requested_gurl.SchemeIs("mojo")) |
+ if (!network_service_ && !original_url.SchemeIs("mojo")) |
ConnectToService(GURL("mojo:network_service"), &network_service_); |
new LocalFetcher( |
network_service_.get(), resolved_url, |
@@ -169,9 +180,9 @@ void ApplicationManager::ConnectToApplication( |
? NativeApplicationCleanup::DONT_DELETE |
: NativeApplicationCleanup::DELETE; |
- if (requested_gurl.SchemeIs("mojo")) { |
+ if (original_url.SchemeIs("mojo")) { |
// Use the resolved mojo URL in the request to support origin mapping, etc. |
- mojo::URLRequestPtr resolved_url_request(mojo::URLRequest::New()); |
+ URLRequestPtr resolved_url_request(URLRequest::New()); |
resolved_url_request->url = resolved_url.spec(); |
new NetworkFetcher(disable_cache_, resolved_url_request.Pass(), |
url_loader_factory_.get(), |
@@ -179,81 +190,51 @@ void ApplicationManager::ConnectToApplication( |
return; |
} |
- new NetworkFetcher(disable_cache_, requested_url.Pass(), |
+ new NetworkFetcher(disable_cache_, original_url_request.Pass(), |
url_loader_factory_.get(), base::Bind(callback, cleanup)); |
} |
bool ApplicationManager::ConnectToRunningApplication( |
- ApplicationInstance* originator, |
- const GURL& resolved_url, |
- const std::string& qualifier, |
- const GURL& requestor_url, |
- InterfaceRequest<ServiceProvider>* services, |
- ServiceProviderPtr* exposed_services, |
- const CapabilityFilter& filter, |
- const Shell::ConnectToApplicationCallback& connect_callback) { |
- ApplicationInstance* instance = |
- GetApplicationInstance(Identity(resolved_url, qualifier)); |
+ scoped_ptr<ConnectToApplicationParams>* params) { |
+ ApplicationInstance* instance = GetApplicationInstance( |
+ Identity((*params)->app_url(), (*params)->qualifier())); |
if (!instance) |
return false; |
- instance->ConnectToClient(originator, resolved_url, requestor_url, |
- services->Pass(), exposed_services->Pass(), filter, |
- connect_callback); |
+ instance->ConnectToClient(params->Pass()); |
return true; |
} |
bool ApplicationManager::ConnectToApplicationWithLoader( |
- ApplicationInstance* originator, |
- const GURL& requested_url, |
- const std::string& qualifier, |
+ scoped_ptr<ConnectToApplicationParams>* params, |
const GURL& resolved_url, |
- const GURL& requestor_url, |
- InterfaceRequest<ServiceProvider>* services, |
- ServiceProviderPtr* exposed_services, |
- const CapabilityFilter& filter, |
- const base::Closure& on_application_end, |
- const Shell::ConnectToApplicationCallback& connect_callback, |
ApplicationLoader* loader) { |
if (!loader) |
return false; |
- const GURL app_url = |
- requested_url.SchemeIs("mojo") ? requested_url : resolved_url; |
+ if (!(*params)->app_url().SchemeIs("mojo")) |
+ (*params)->SetURLInfo(resolved_url); |
- loader->Load( |
- resolved_url, |
- RegisterInstance(originator, app_url, qualifier, requestor_url, |
- services->Pass(), exposed_services->Pass(), filter, |
- on_application_end, connect_callback, nullptr)); |
+ loader->Load(resolved_url, RegisterInstance(params->Pass(), nullptr)); |
return true; |
} |
InterfaceRequest<Application> ApplicationManager::RegisterInstance( |
- ApplicationInstance* originator, |
- const GURL& app_url, |
- const std::string& qualifier, |
- const GURL& requestor_url, |
- InterfaceRequest<ServiceProvider> services, |
- ServiceProviderPtr exposed_services, |
- const CapabilityFilter& filter, |
- const base::Closure& on_application_end, |
- const Shell::ConnectToApplicationCallback& connect_callback, |
+ scoped_ptr<ConnectToApplicationParams> params, |
ApplicationInstance** resulting_instance) { |
- Identity app_identity(app_url, qualifier); |
+ Identity app_identity(params->app_url(), params->qualifier()); |
ApplicationPtr application; |
InterfaceRequest<Application> application_request = GetProxy(&application); |
ApplicationInstance* instance = new ApplicationInstance( |
- application.Pass(), this, |
- originator ? originator->identity() : Identity(GURL()), app_identity, |
- filter, Shell::kInvalidContentHandlerID, on_application_end); |
+ application.Pass(), this, params->originator_identity(), app_identity, |
+ params->filter(), Shell::kInvalidContentHandlerID, |
+ params->on_application_end()); |
DCHECK(identity_to_instance_.find(app_identity) == |
identity_to_instance_.end()); |
identity_to_instance_[app_identity] = instance; |
instance->InitializeApplication(); |
- instance->ConnectToClient(originator, app_url, requestor_url, services.Pass(), |
- exposed_services.Pass(), filter, connect_callback); |
+ instance->ConnectToClient(params.Pass()); |
if (resulting_instance) |
*resulting_instance = instance; |
return application_request.Pass(); |
@@ -268,36 +249,27 @@ ApplicationInstance* ApplicationManager::GetApplicationInstance( |
} |
void ApplicationManager::HandleFetchCallback( |
- ApplicationInstance* originator, |
- const GURL& requested_url, |
- const std::string& qualifier, |
- const GURL& requestor_url, |
- InterfaceRequest<ServiceProvider> services, |
- ServiceProviderPtr exposed_services, |
- const CapabilityFilter& filter, |
- const base::Closure& on_application_end, |
- const Shell::ConnectToApplicationCallback& connect_callback, |
+ scoped_ptr<ConnectToApplicationParams> params, |
NativeApplicationCleanup cleanup, |
scoped_ptr<Fetcher> fetcher) { |
if (!fetcher) { |
- // Network error. Drop |application_request| to tell requestor. |
- connect_callback.Run(Shell::kInvalidContentHandlerID); |
+ // Network error. Drop |params| to tell the requestor. |
+ params->connect_callback().Run(Shell::kInvalidContentHandlerID); |
return; |
} |
GURL redirect_url = fetcher->GetRedirectURL(); |
if (!redirect_url.is_empty()) { |
// And around we go again... Whee! |
- // TODO(sky): this loses |requested_url|. |
- mojo::URLRequestPtr request(mojo::URLRequest::New()); |
- request->url = mojo::String::From(redirect_url.spec()); |
+ // TODO(sky): this loses the original URL info. |
+ URLRequestPtr new_request = URLRequest::New(); |
+ new_request->url = redirect_url.spec(); |
HttpHeaderPtr header = HttpHeader::New(); |
header->name = "Referer"; |
header->value = fetcher->GetRedirectReferer().spec(); |
- request->headers.push_back(header.Pass()); |
- ConnectToApplication(originator, request.Pass(), qualifier, requestor_url, |
- services.Pass(), exposed_services.Pass(), filter, |
- on_application_end, connect_callback); |
+ new_request->headers.push_back(header.Pass()); |
+ params->SetURLInfo(new_request.Pass()); |
+ ConnectToApplication(params.Pass()); |
return; |
} |
@@ -307,20 +279,22 @@ void ApplicationManager::HandleFetchCallback( |
// |
// Also, it's possible the original URL was redirected to an app that is |
// already running. |
- if (ConnectToRunningApplication(originator, requested_url, qualifier, |
- requestor_url, &services, &exposed_services, |
- filter, connect_callback)) { |
+ if (ConnectToRunningApplication(¶ms)) |
return; |
- } |
- |
- const GURL app_url = |
- requested_url.scheme() == "mojo" ? requested_url : fetcher->GetURL(); |
+ if (params->app_url().scheme() != "mojo") |
+ params->SetURLInfo(fetcher->GetURL()); |
+ |
+ Identity originator_identity = params->originator_identity(); |
+ CapabilityFilter originator_filter = params->originator_filter(); |
+ CapabilityFilter filter = params->filter(); |
+ GURL app_url = params->app_url(); |
+ std::string qualifier = params->qualifier(); |
+ Shell::ConnectToApplicationCallback connect_callback = |
+ params->connect_callback(); |
+ params->set_connect_callback(EmptyConnectCallback()); |
ApplicationInstance* app = nullptr; |
- InterfaceRequest<Application> request( |
- RegisterInstance(originator, app_url, qualifier, requestor_url, |
- services.Pass(), exposed_services.Pass(), filter, |
- on_application_end, EmptyConnectCallback(), &app)); |
+ InterfaceRequest<Application> request(RegisterInstance(params.Pass(), &app)); |
// For resources that are loaded with content handlers, we group app instances |
// by site. |
@@ -336,9 +310,9 @@ void ApplicationManager::HandleFetchCallback( |
blocking_pool_, static_cast<int>(shebang.size()))); |
std::string site = |
enable_multi_process ? response->site.To<std::string>() : std::string(); |
- LoadWithContentHandler(originator, content_handler_url, requestor_url, site, |
- filter, connect_callback, app, request.Pass(), |
- response.Pass()); |
+ LoadWithContentHandler(originator_identity, originator_filter, |
+ content_handler_url, site, filter, connect_callback, |
+ app, request.Pass(), response.Pass()); |
return; |
} |
@@ -347,8 +321,8 @@ void ApplicationManager::HandleFetchCallback( |
URLResponsePtr response(fetcher->AsURLResponse(blocking_pool_, 0)); |
std::string site = |
enable_multi_process ? response->site.To<std::string>() : std::string(); |
- LoadWithContentHandler(originator, iter->second, requestor_url, site, |
- filter, connect_callback, app, request.Pass(), |
+ LoadWithContentHandler(originator_identity, originator_filter, iter->second, |
+ site, filter, connect_callback, app, request.Pass(), |
response.Pass()); |
return; |
} |
@@ -357,7 +331,7 @@ void ApplicationManager::HandleFetchCallback( |
if (alias_iter != application_package_alias_.end()) { |
// We replace the qualifier with the one our package alias requested. |
URLResponsePtr response(URLResponse::New()); |
- response->url = String::From(app_url.spec()); |
+ response->url = app_url.spec(); |
std::string qualifier; |
if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
@@ -374,9 +348,10 @@ void ApplicationManager::HandleFetchCallback( |
qualifier = alias_iter->second.second; |
} |
- LoadWithContentHandler(originator, alias_iter->second.first, requestor_url, |
- qualifier, filter, connect_callback, app, |
- request.Pass(), response.Pass()); |
+ LoadWithContentHandler(originator_identity, originator_filter, |
+ alias_iter->second.first, qualifier, filter, |
+ connect_callback, app, request.Pass(), |
+ response.Pass()); |
return; |
} |
@@ -460,9 +435,9 @@ void ApplicationManager::RegisterApplicationPackageAlias( |
} |
void ApplicationManager::LoadWithContentHandler( |
- ApplicationInstance* originator, |
+ const Identity& originator_identity, |
+ const CapabilityFilter& originator_filter, |
const GURL& content_handler_url, |
- const GURL& requestor_url, |
const std::string& qualifier, |
const CapabilityFilter& filter, |
const Shell::ConnectToApplicationCallback& connect_callback, |
@@ -478,8 +453,8 @@ void ApplicationManager::LoadWithContentHandler( |
connection = iter->second; |
} else { |
connection = new ContentHandlerConnection( |
- originator, this, content_handler_url, requestor_url, qualifier, filter, |
- ++content_handler_id_counter_); |
+ this, originator_identity, originator_filter, content_handler_url, |
+ qualifier, filter, ++content_handler_id_counter_); |
url_to_content_handler_[key] = connection; |
} |
@@ -564,12 +539,11 @@ ScopedMessagePipeHandle ApplicationManager::ConnectToServiceByName( |
const GURL& application_url, |
const std::string& interface_name) { |
ServiceProviderPtr services; |
- mojo::URLRequestPtr request(mojo::URLRequest::New()); |
- request->url = mojo::String::From(application_url.spec()); |
- ConnectToApplication(nullptr, request.Pass(), std::string(), GURL(), |
- GetProxy(&services), nullptr, |
- GetPermissiveCapabilityFilter(), base::Closure(), |
- EmptyConnectCallback()); |
+ scoped_ptr<ConnectToApplicationParams> params(new ConnectToApplicationParams); |
+ params->SetURLInfo(application_url); |
+ params->set_services(GetProxy(&services)); |
+ params->set_filter(GetPermissiveCapabilityFilter()); |
+ ConnectToApplication(params.Pass()); |
MessagePipe pipe; |
services->ConnectToService(interface_name, pipe.handle1.Pass()); |
return pipe.handle0.Pass(); |