Index: mojo/shell/application_manager/application_manager.cc |
diff --git a/mojo/shell/application_manager/application_manager.cc b/mojo/shell/application_manager/application_manager.cc |
index 8c908a73f21fbc189194b07a0be6765c13094645..d137fb8f2c4f7ddf58f7e59a4ab7623df2e87922 100644 |
--- a/mojo/shell/application_manager/application_manager.cc |
+++ b/mojo/shell/application_manager/application_manager.cc |
@@ -29,6 +29,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() { |
@@ -143,31 +154,32 @@ void ApplicationManager::ConnectToApplicationWithParameters( |
} |
// The application is not running, let's compute the parameters. |
+ std::vector<std::string> parameters = |
+ Concatenate(pre_redirect_parameters, GetArgsForURL(resolved_url)); |
+ |
if (ConnectToApplicationWithLoader(mapped_url, requestor_url, &services, |
&exposed_services, on_application_end, |
- pre_redirect_parameters, |
- GetLoaderForURL(mapped_url))) { |
+ parameters, GetLoaderForURL(mapped_url))) { |
return; |
} |
- if (ConnectToApplicationWithLoader(resolved_url, requestor_url, &services, |
- &exposed_services, on_application_end, |
- pre_redirect_parameters, |
- GetLoaderForURL(resolved_url))) { |
+ if (ConnectToApplicationWithLoader( |
+ resolved_url, requestor_url, &services, &exposed_services, |
+ on_application_end, parameters, GetLoaderForURL(resolved_url))) { |
return; |
} |
- if (ConnectToApplicationWithLoader( |
- resolved_url, requestor_url, &services, &exposed_services, |
- on_application_end, pre_redirect_parameters, default_loader_.get())) { |
+ if (ConnectToApplicationWithLoader(resolved_url, requestor_url, &services, |
+ &exposed_services, on_application_end, |
+ parameters, default_loader_.get())) { |
return; |
} |
- auto callback = base::Bind(&ApplicationManager::HandleFetchCallback, |
- weak_ptr_factory_.GetWeakPtr(), requestor_url, |
- base::Passed(services.Pass()), |
- base::Passed(exposed_services.Pass()), |
- on_application_end, pre_redirect_parameters); |
+ auto callback = base::Bind( |
+ &ApplicationManager::HandleFetchCallback, weak_ptr_factory_.GetWeakPtr(), |
+ requestor_url, base::Passed(services.Pass()), |
+ base::Passed(exposed_services.Pass()), on_application_end, |
+ parameters); |
if (resolved_url.SchemeIsFile()) { |
new LocalFetcher( |
@@ -363,6 +375,22 @@ void ApplicationManager::RunNativeApplication( |
weak_ptr_factory_.GetWeakPtr(), runner)); |
} |
+void ApplicationManager::RegisterExternalApplication( |
+ const GURL& url, |
+ const std::vector<std::string>& args, |
+ ApplicationPtr application) { |
+ const auto& args_it = url_to_args_.find(url); |
+ if (args_it != url_to_args_.end()) { |
+ LOG(WARNING) << "--args-for provided for external application " << url |
+ << " <ignored>"; |
+ } |
+ Identity identity(url); |
+ ShellImpl* shell_impl = |
+ new ShellImpl(application.Pass(), this, identity, base::Closure()); |
+ identity_to_shell_impl_[identity] = shell_impl; |
+ shell_impl->InitializeApplication(Array<String>::From(args)); |
+} |
+ |
void ApplicationManager::RegisterContentHandler( |
const std::string& mime_type, |
const GURL& content_handler_url) { |
@@ -406,6 +434,21 @@ void ApplicationManager::SetLoaderForScheme( |
scheme_to_loader_[scheme] = loader.release(); |
} |
+void ApplicationManager::SetArgsForURL(const std::vector<std::string>& args, |
+ const GURL& url) { |
+ 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( |
const NativeRunnerFactory::Options& options, |
const GURL& url) { |
@@ -464,6 +507,13 @@ ScopedMessagePipeHandle ApplicationManager::ConnectToServiceByName( |
return pipe.handle0.Pass(); |
} |
+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 args_it->second; |
+ return std::vector<std::string>(); |
+} |
+ |
void ApplicationManager::CleanupRunner(NativeRunner* runner) { |
native_runners_.erase( |
std::find(native_runners_.begin(), native_runners_.end(), runner)); |