| Index: mojo/shell/application_manager.cc
|
| diff --git a/mojo/shell/application_manager.cc b/mojo/shell/application_manager.cc
|
| index 03f9c5214ded9fae140649a737a1efdbdbea2493..9695010244c19203a3eaa22e1b918639fbf2074a 100644
|
| --- a/mojo/shell/application_manager.cc
|
| +++ b/mojo/shell/application_manager.cc
|
| @@ -98,6 +98,11 @@ ApplicationManager::~ApplicationManager() {
|
| runner.reset();
|
| }
|
|
|
| +void ApplicationManager::SetInstanceQuitCallback(
|
| + base::Callback<void(const Identity&)> callback) {
|
| + instance_quit_callback_ = callback;
|
| +}
|
| +
|
| void ApplicationManager::Connect(scoped_ptr<ConnectParams> params) {
|
| TRACE_EVENT_INSTANT1("mojo_shell", "ApplicationManager::Connect",
|
| TRACE_EVENT_SCOPE_THREAD, "original_url",
|
| @@ -129,9 +134,7 @@ void ApplicationManager::TerminateShellConnections() {
|
|
|
| void ApplicationManager::OnApplicationInstanceError(
|
| ApplicationInstance* instance) {
|
| - // Called from ~ApplicationInstance, so we do not need to call Destroy here.
|
| const Identity identity = instance->identity();
|
| - base::Closure on_application_end = instance->on_application_end();
|
| // Remove the shell.
|
| auto it = identity_to_instance_.find(identity);
|
| DCHECK(it != identity_to_instance_.end());
|
| @@ -142,8 +145,8 @@ void ApplicationManager::OnApplicationInstanceError(
|
| [this, id](mojom::ApplicationManagerListener* listener) {
|
| listener->ApplicationInstanceDestroyed(id);
|
| });
|
| - if (!on_application_end.is_null())
|
| - on_application_end.Run();
|
| + if (!instance_quit_callback_.is_null())
|
| + instance_quit_callback_.Run(identity);
|
| }
|
|
|
| ApplicationInstance* ApplicationManager::GetApplicationInstance(
|
| @@ -200,8 +203,7 @@ void ApplicationManager::CreateInstanceForHandle(
|
| Identity target_id(url.To<GURL>(), std::string(), local_filter);
|
| mojom::ShellClientRequest request;
|
| // TODO(beng): do better than url.spec() for application name.
|
| - ApplicationInstance* instance =
|
| - CreateInstance(target_id, base::Closure(), url, &request);
|
| + ApplicationInstance* instance = CreateInstance(target_id, url, &request);
|
| instance->BindPIDReceiver(std::move(pid_receiver));
|
| scoped_ptr<NativeRunner> runner =
|
| native_runner_factory_->Create(base::FilePath());
|
| @@ -222,19 +224,19 @@ void ApplicationManager::AddListener(
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // ApplicationManager, private:
|
| -
|
| -void ApplicationManager::InitPackageManager(bool register_mojo_url_schemes) {
|
| - scoped_ptr<ApplicationLoader> loader(
|
| - new package_manager::Loader(task_runner_, register_mojo_url_schemes));
|
| -
|
| - mojom::ShellClientRequest request;
|
| - GURL url("mojo://package_manager/");
|
| - CreateInstance(Identity(url), base::Closure(), url.spec(), &request);
|
| - loader->Load(url, std::move(request));
|
| -
|
| - SetLoaderForURL(std::move(loader), url);
|
| -
|
| - ConnectToInterface(this, CreateShellIdentity(), url, &shell_resolver_);
|
| +
|
| +void ApplicationManager::InitPackageManager(bool register_mojo_url_schemes) {
|
| + scoped_ptr<ApplicationLoader> loader(
|
| + new package_manager::Loader(task_runner_, register_mojo_url_schemes));
|
| +
|
| + mojom::ShellClientRequest request;
|
| + GURL url("mojo://package_manager/");
|
| + CreateInstance(Identity(url), url.spec(), &request);
|
| + loader->Load(url, std::move(request));
|
| +
|
| + SetLoaderForURL(std::move(loader), url);
|
| +
|
| + ConnectToInterface(this, CreateShellIdentity(), url, &shell_resolver_);
|
| }
|
|
|
| bool ApplicationManager::ConnectToInstance(scoped_ptr<ConnectParams>* params) {
|
| @@ -247,14 +249,12 @@ bool ApplicationManager::ConnectToInstance(scoped_ptr<ConnectParams>* params) {
|
|
|
| ApplicationInstance* ApplicationManager::CreateInstance(
|
| const Identity& target_id,
|
| - const base::Closure& on_application_end,
|
| const String& application_name,
|
| mojom::ShellClientRequest* request) {
|
| mojom::ShellClientPtr shell_client;
|
| *request = GetProxy(&shell_client);
|
| ApplicationInstance* instance = new ApplicationInstance(
|
| - std::move(shell_client), this, target_id, on_application_end,
|
| - application_name);
|
| + std::move(shell_client), this, target_id, application_name);
|
| DCHECK(identity_to_instance_.find(target_id) ==
|
| identity_to_instance_.end());
|
| identity_to_instance_[target_id] = instance;
|
| @@ -317,40 +317,39 @@ void ApplicationManager::OnGotResolvedURL(
|
| if (ConnectToInstance(¶ms))
|
| return;
|
|
|
| - Identity source = params->source(), target = params->target();
|
| - mojom::ShellClientRequest request;
|
| - ApplicationInstance* instance = CreateInstance(
|
| - params->target(), params->on_application_end(), application_name,
|
| - &request);
|
| - instance->ConnectToClient(std::move(params));
|
| -
|
| - if (LoadWithLoader(target, &request))
|
| - return;
|
| -
|
| - CHECK(!file_url.is_null() && !application_name.is_null() &&
|
| - !base_filter.is_null());
|
| -
|
| - GURL resolved_gurl = resolved_url.To<GURL>();
|
| - if (target.url().spec() != resolved_url) {
|
| - // TODO(beng): this clobbers the CapabilityFilter passed via Connect().
|
| - CapabilityFilter capability_filter = GetPermissiveCapabilityFilter();
|
| - if (!base_filter.is_null())
|
| - capability_filter = base_filter->filter.To<CapabilityFilter>();
|
| -
|
| - CreateShellClient(source, Identity(resolved_gurl, target.qualifier(),
|
| - capability_filter), target.url(), std::move(request));
|
| - } else {
|
| - bool start_sandboxed = false;
|
| - base::FilePath path = util::UrlToFilePath(file_url.To<GURL>());
|
| - scoped_ptr<NativeRunner> runner = native_runner_factory_->Create(path);
|
| - runner->Start(path, start_sandboxed, std::move(request),
|
| - base::Bind(&ApplicationManager::ApplicationPIDAvailable,
|
| - weak_ptr_factory_.GetWeakPtr(), instance->id()),
|
| - base::Bind(&ApplicationManager::CleanupRunner,
|
| - weak_ptr_factory_.GetWeakPtr(), runner.get()));
|
| - instance->SetNativeRunner(runner.get());
|
| - native_runners_.push_back(std::move(runner));
|
| - }
|
| + Identity source = params->source(), target = params->target();
|
| + mojom::ShellClientRequest request;
|
| + ApplicationInstance* instance =
|
| + CreateInstance(params->target(), application_name, &request);
|
| + instance->ConnectToClient(std::move(params));
|
| +
|
| + if (LoadWithLoader(target, &request))
|
| + return;
|
| +
|
| + CHECK(!file_url.is_null() && !application_name.is_null() &&
|
| + !base_filter.is_null());
|
| +
|
| + GURL resolved_gurl = resolved_url.To<GURL>();
|
| + if (target.url().spec() != resolved_url) {
|
| + // TODO(beng): this clobbers the CapabilityFilter passed via Connect().
|
| + CapabilityFilter capability_filter = GetPermissiveCapabilityFilter();
|
| + if (!base_filter.is_null())
|
| + capability_filter = base_filter->filter.To<CapabilityFilter>();
|
| +
|
| + CreateShellClient(source, Identity(resolved_gurl, target.qualifier(),
|
| + capability_filter), target.url(), std::move(request));
|
| + } else {
|
| + bool start_sandboxed = false;
|
| + base::FilePath path = util::UrlToFilePath(file_url.To<GURL>());
|
| + scoped_ptr<NativeRunner> runner = native_runner_factory_->Create(path);
|
| + runner->Start(path, start_sandboxed, std::move(request),
|
| + base::Bind(&ApplicationManager::ApplicationPIDAvailable,
|
| + weak_ptr_factory_.GetWeakPtr(), instance->id()),
|
| + base::Bind(&ApplicationManager::CleanupRunner,
|
| + weak_ptr_factory_.GetWeakPtr(), runner.get()));
|
| + instance->SetNativeRunner(runner.get());
|
| + native_runners_.push_back(std::move(runner));
|
| + }
|
| }
|
|
|
| bool ApplicationManager::LoadWithLoader(const Identity& target,
|
|
|