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, |