| Index: services/shell/shell.cc
|
| diff --git a/services/shell/shell.cc b/services/shell/shell.cc
|
| index 00cd0f85acfa0d0840b51ec03a2c9da045f47daf..19dc0612f2faf02ac81087b09f3bb55934586b3e 100644
|
| --- a/services/shell/shell.cc
|
| +++ b/services/shell/shell.cc
|
| @@ -476,6 +476,10 @@ Shell::Shell(std::unique_ptr<NativeRunnerFactory> native_runner_factory,
|
|
|
| Shell::~Shell() {
|
| TerminateShellConnections();
|
| + // Terminate any remaining instances.
|
| + while (!identity_to_instance_.empty())
|
| + OnInstanceError(identity_to_instance_.begin()->second);
|
| + identity_to_resolver_.clear();
|
| for (auto& runner : native_runners_)
|
| runner.reset();
|
| }
|
| @@ -541,6 +545,18 @@ void Shell::InitCatalog(mojom::ShellClientPtr catalog) {
|
| resolver->ResolveMojoName(kShellName, base::Bind(&EmptyResolverCallback));
|
| }
|
|
|
| +mojom::ShellResolver* Shell::GetResolver(const Identity& identity) {
|
| + auto iter = identity_to_resolver_.find(identity);
|
| + if (iter != identity_to_resolver_.end())
|
| + return iter->second.get();
|
| +
|
| + mojom::ShellResolverPtr resolver_ptr;
|
| + ConnectToInterface(this, identity, CreateCatalogIdentity(), &resolver_ptr);
|
| + mojom::ShellResolver* resolver = resolver_ptr.get();
|
| + identity_to_resolver_[identity] = std::move(resolver_ptr);
|
| + return resolver;
|
| +}
|
| +
|
| void Shell::TerminateShellConnections() {
|
| Instance* instance = GetExistingInstance(CreateShellIdentity());
|
| DCHECK(instance);
|
| @@ -580,16 +596,13 @@ void Shell::Connect(std::unique_ptr<ConnectParams> params,
|
| // app so it loads the correct store. Since the catalog is itself run as root
|
| // when this re-enters Connect() it'll be handled by
|
| // ConnectToExistingInstance().
|
| - mojom::ShellResolverPtr resolver;
|
| - ConnectToInterface(this, Identity(kShellName, params->target().user_id()),
|
| - CreateCatalogIdentity(), &resolver);
|
| + mojom::ShellResolver* resolver =
|
| + GetResolver(Identity(kShellName, params->target().user_id()));
|
|
|
| std::string name = params->target().name();
|
| - mojom::ShellResolver* resolver_raw = resolver.get();
|
| - resolver_raw->ResolveMojoName(
|
| + resolver->ResolveMojoName(
|
| name, base::Bind(&shell::Shell::OnGotResolvedName,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(std::move(resolver)), base::Passed(¶ms),
|
| + weak_ptr_factory_.GetWeakPtr(), base::Passed(¶ms),
|
| base::Passed(&client)));
|
| }
|
|
|
| @@ -685,8 +698,7 @@ void Shell::OnShellClientFactoryLost(const Identity& which) {
|
| shell_client_factories_.erase(it);
|
| }
|
|
|
| -void Shell::OnGotResolvedName(mojom::ShellResolverPtr resolver,
|
| - std::unique_ptr<ConnectParams> params,
|
| +void Shell::OnGotResolvedName(std::unique_ptr<ConnectParams> params,
|
| mojom::ShellClientPtr client,
|
| mojom::ResolveResultPtr result) {
|
| std::string instance_name = params->target().instance();
|
|
|