| Index: shell/application_manager/application_manager.cc
|
| diff --git a/shell/application_manager/application_manager.cc b/shell/application_manager/application_manager.cc
|
| index 8ffe80860d6f97e3011363cf8e6b59330a17b108..f285962ee5cc1a4cd430a82e77150e889eccf894 100644
|
| --- a/shell/application_manager/application_manager.cc
|
| +++ b/shell/application_manager/application_manager.cc
|
| @@ -28,6 +28,17 @@ namespace {
|
| // Used by TestAPI.
|
| bool has_created_instance = false;
|
|
|
| +std::vector<std::string> Concatenate(const std::vector<std::string>& v1,
|
| + const std::vector<std::string>& v2) {
|
| + if (!v1.size())
|
| + return v2;
|
| + if (!v2.size())
|
| + return v1;
|
| + std::vector<std::string> result(v1);
|
| + result.insert(result.end(), v1.begin(), v1.end());
|
| + return result;
|
| +}
|
| +
|
| } // namespace
|
|
|
| ApplicationManager::Delegate::~Delegate() {
|
| @@ -111,6 +122,17 @@ void ApplicationManager::ConnectToApplication(
|
| const GURL& requestor_url,
|
| InterfaceRequest<ServiceProvider> services,
|
| ServiceProviderPtr exposed_services) {
|
| + ConnectToApplicationWithParameters(requested_url, requestor_url,
|
| + services.Pass(), exposed_services.Pass(),
|
| + std::vector<std::string>());
|
| +}
|
| +
|
| +void ApplicationManager::ConnectToApplicationWithParameters(
|
| + const GURL& requested_url,
|
| + const GURL& requestor_url,
|
| + InterfaceRequest<ServiceProvider> services,
|
| + ServiceProviderPtr exposed_services,
|
| + const std::vector<std::string>& parameters) {
|
| DCHECK(requested_url.is_valid());
|
|
|
| // We check both the mapped and resolved urls for existing shell_impls because
|
| @@ -129,27 +151,28 @@ void ApplicationManager::ConnectToApplication(
|
| }
|
|
|
| if (ConnectToApplicationWithLoader(requested_url, mapped_url, requestor_url,
|
| - &services, &exposed_services,
|
| + &services, &exposed_services, parameters,
|
| GetLoaderForURL(mapped_url))) {
|
| return;
|
| }
|
|
|
| if (ConnectToApplicationWithLoader(requested_url, resolved_url, requestor_url,
|
| - &services, &exposed_services,
|
| + &services, &exposed_services, parameters,
|
| GetLoaderForURL(resolved_url))) {
|
| return;
|
| }
|
|
|
| if (ConnectToApplicationWithLoader(requested_url, resolved_url, requestor_url,
|
| - &services, &exposed_services,
|
| + &services, &exposed_services, parameters,
|
| default_loader_.get())) {
|
| return;
|
| }
|
|
|
| - auto callback = base::Bind(&ApplicationManager::HandleFetchCallback,
|
| - weak_ptr_factory_.GetWeakPtr(), requested_url,
|
| - requestor_url, base::Passed(services.Pass()),
|
| - base::Passed(exposed_services.Pass()));
|
| + auto callback = base::Bind(
|
| + &ApplicationManager::HandleFetchCallback, weak_ptr_factory_.GetWeakPtr(),
|
| + requested_url, requestor_url, base::Passed(services.Pass()),
|
| + base::Passed(exposed_services.Pass()),
|
| + Concatenate(parameters, GetArgsForURL(resolved_url)));
|
|
|
| if (resolved_url.SchemeIsFile()) {
|
| new LocalFetcher(resolved_url, GetBaseURLAndQuery(resolved_url, nullptr),
|
| @@ -191,13 +214,15 @@ bool ApplicationManager::ConnectToApplicationWithLoader(
|
| const GURL& requestor_url,
|
| InterfaceRequest<ServiceProvider>* services,
|
| ServiceProviderPtr* exposed_services,
|
| + const std::vector<std::string>& parameters,
|
| ApplicationLoader* loader) {
|
| if (!loader)
|
| return false;
|
|
|
| - loader->Load(resolved_url,
|
| - RegisterShell(requested_url, resolved_url, requestor_url,
|
| - services->Pass(), exposed_services->Pass()));
|
| + loader->Load(
|
| + resolved_url,
|
| + RegisterShell(requested_url, resolved_url, requestor_url,
|
| + services->Pass(), exposed_services->Pass(), parameters));
|
| return true;
|
| }
|
|
|
| @@ -206,7 +231,8 @@ InterfaceRequest<Application> ApplicationManager::RegisterShell(
|
| const GURL& resolved_url,
|
| const GURL& requestor_url,
|
| InterfaceRequest<ServiceProvider> services,
|
| - ServiceProviderPtr exposed_services) {
|
| + ServiceProviderPtr exposed_services,
|
| + const std::vector<std::string>& parameters) {
|
| Identity app_identity(resolved_url);
|
|
|
| ApplicationPtr application;
|
| @@ -214,7 +240,8 @@ InterfaceRequest<Application> ApplicationManager::RegisterShell(
|
| ShellImpl* shell =
|
| new ShellImpl(application.Pass(), this, original_url, app_identity);
|
| identity_to_shell_impl_[app_identity] = shell;
|
| - shell->InitializeApplication(GetArgsForURL(original_url));
|
| + shell->InitializeApplication(Array<String>::From(
|
| + Concatenate(parameters, GetArgsForURL(app_identity.url))));
|
| ConnectToClient(shell, resolved_url, requestor_url, services.Pass(),
|
| exposed_services.Pass());
|
| return application_request.Pass();
|
| @@ -242,6 +269,7 @@ void ApplicationManager::HandleFetchCallback(
|
| const GURL& requestor_url,
|
| InterfaceRequest<ServiceProvider> services,
|
| ServiceProviderPtr exposed_services,
|
| + const std::vector<std::string>& parameters,
|
| NativeRunner::CleanupBehavior cleanup_behavior,
|
| scoped_ptr<Fetcher> fetcher) {
|
| if (!fetcher) {
|
| @@ -252,8 +280,9 @@ void ApplicationManager::HandleFetchCallback(
|
| GURL redirect_url = fetcher->GetRedirectURL();
|
| if (!redirect_url.is_empty()) {
|
| // And around we go again... Whee!
|
| - ConnectToApplication(redirect_url, requestor_url, services.Pass(),
|
| - exposed_services.Pass());
|
| + ConnectToApplicationWithParameters(redirect_url, requestor_url,
|
| + services.Pass(), exposed_services.Pass(),
|
| + parameters);
|
| return;
|
| }
|
|
|
| @@ -270,7 +299,7 @@ void ApplicationManager::HandleFetchCallback(
|
|
|
| InterfaceRequest<Application> request(
|
| RegisterShell(requested_url, fetcher->GetURL(), requestor_url,
|
| - services.Pass(), exposed_services.Pass()));
|
| + services.Pass(), exposed_services.Pass(), parameters));
|
|
|
| // If the response begins with a #!mojo <content-handler-url>, use it.
|
| GURL content_handler_url;
|
| @@ -398,7 +427,17 @@ void ApplicationManager::SetLoaderForScheme(
|
|
|
| void ApplicationManager::SetArgsForURL(const std::vector<std::string>& args,
|
| const GURL& url) {
|
| - url_to_args_[url] = args;
|
| + url_to_args_[url].insert(url_to_args_[url].end(), args.begin(), args.end());
|
| + GURL mapped_url = delegate_->ResolveMappings(url);
|
| + if (mapped_url != url) {
|
| + url_to_args_[mapped_url].insert(url_to_args_[mapped_url].end(),
|
| + args.begin(), args.end());
|
| + }
|
| + GURL resolved_url = delegate_->ResolveURL(mapped_url);
|
| + if (resolved_url != mapped_url) {
|
| + url_to_args_[resolved_url].insert(url_to_args_[resolved_url].end(),
|
| + args.begin(), args.end());
|
| + }
|
| }
|
|
|
| void ApplicationManager::SetNativeOptionsForURL(
|
| @@ -457,11 +496,11 @@ ScopedMessagePipeHandle ApplicationManager::ConnectToServiceByName(
|
| return pipe.handle0.Pass();
|
| }
|
|
|
| -Array<String> ApplicationManager::GetArgsForURL(const GURL& url) {
|
| +std::vector<std::string> ApplicationManager::GetArgsForURL(const GURL& url) {
|
| const auto& args_it = url_to_args_.find(url);
|
| if (args_it != url_to_args_.end())
|
| - return Array<String>::From(args_it->second);
|
| - return Array<String>();
|
| + return args_it->second;
|
| + return std::vector<std::string>();
|
| }
|
|
|
| void ApplicationManager::CleanupRunner(NativeRunner* runner) {
|
|
|