Index: mojo/shell/shell.cc |
diff --git a/mojo/shell/shell.cc b/mojo/shell/shell.cc |
index 48370a30c77575f4a8d9cbc318b296862dbbb832..beb0fb7b1f623ec016b52b48197c0cc79b6c0c39 100644 |
--- a/mojo/shell/shell.cc |
+++ b/mojo/shell/shell.cc |
@@ -104,8 +104,7 @@ class Shell::Instance : public mojom::Connector, |
public InterfaceFactory<mojom::Shell>, |
public mojom::Shell { |
public: |
- Instance(mojom::ShellClientPtr shell_client, |
- mojo::shell::Shell* shell, |
+ Instance(mojo::shell::Shell* shell, |
const Identity& identity, |
const CapabilitySpec& capability_spec) |
: shell_(shell), |
@@ -113,7 +112,6 @@ class Shell::Instance : public mojom::Connector, |
identity_(identity), |
capability_spec_(capability_spec), |
allow_any_application_(capability_spec.required.count("*") == 1), |
- shell_client_(std::move(shell_client)), |
pid_receiver_binding_(this), |
weak_factory_(this) { |
if (identity_.name() == kShellName || |
@@ -121,9 +119,6 @@ class Shell::Instance : public mojom::Connector, |
pid_ = base::Process::Current().Pid(); |
} |
DCHECK_NE(mojom::kInvalidInstanceID, id_); |
- |
- shell_client_.set_connection_error_handler( |
- base::Bind(&Instance::OnShellClientLost, base::Unretained(this))); |
} |
~Instance() override {} |
@@ -150,13 +145,8 @@ class Shell::Instance : public mojom::Connector, |
} |
} |
- void InitializeClient() { |
- shell_client_->Initialize(mojom::Identity::From(identity_), id_, |
- base::Bind(&Instance::OnInitializeResponse, |
- base::Unretained(this))); |
- } |
- |
void ConnectToClient(scoped_ptr<ConnectParams> params) { |
+ CHECK(shell_client_.is_bound()); |
params->connect_callback().Run(mojom::ConnectResult::SUCCEEDED, |
identity_.user_id(), id_); |
uint32_t source_id = mojom::kInvalidInstanceID; |
@@ -174,28 +164,38 @@ class Shell::Instance : public mojom::Connector, |
mojom::CapabilityRequest::From(spec), params->target().name()); |
} |
+ void StartWithClient(mojom::ShellClientPtr client) { |
+ CHECK(!shell_client_); |
+ shell_client_ = std::move(client); |
+ shell_client_.set_connection_error_handler( |
+ base::Bind(&Instance::OnShellClientLost, base::Unretained(this))); |
+ shell_client_->Initialize(mojom::Identity::From(identity_), id_, |
+ base::Bind(&Instance::OnInitializeResponse, |
+ base::Unretained(this))); |
+ } |
+ |
void StartWithClientProcessConnection( |
- mojom::ShellClientRequest request, |
mojom::ClientProcessConnectionPtr client_process_connection) { |
- factory_.Bind(mojom::ShellClientFactoryPtrInfo( |
- std::move(client_process_connection->shell_client_factory), 0u)); |
+ mojom::ShellClientPtr client; |
+ client.Bind(mojom::ShellClientPtrInfo( |
+ std::move(client_process_connection->shell_client), 0)); |
pid_receiver_binding_.Bind( |
std::move(client_process_connection->pid_receiver_request)); |
- factory_->CreateShellClient(std::move(request), identity_.name()); |
+ StartWithClient(std::move(client)); |
} |
- void StartWithFilePath(mojom::ShellClientRequest request, |
- const base::FilePath& path) { |
+ void StartWithFilePath(const base::FilePath& path) { |
+ CHECK(!shell_client_); |
scoped_ptr<NativeRunner> runner = |
shell_->native_runner_factory_->Create(path); |
bool start_sandboxed = false; |
- runner->Start(path, identity_, start_sandboxed, std::move(request), |
- base::Bind(&Instance::PIDAvailable, |
- weak_factory_.GetWeakPtr()), |
- base::Bind(&mojo::shell::Shell::CleanupRunner, |
- shell_->weak_ptr_factory_.GetWeakPtr(), |
- runner.get())); |
+ mojom::ShellClientPtr client = runner->Start( |
+ path, identity_, start_sandboxed, |
+ base::Bind(&Instance::PIDAvailable, weak_factory_.GetWeakPtr()), |
+ base::Bind(&mojo::shell::Shell::CleanupRunner, |
+ shell_->weak_ptr_factory_.GetWeakPtr(), runner.get())); |
shell_->native_runners_.push_back(std::move(runner)); |
+ StartWithClient(std::move(client)); |
} |
mojom::InstanceInfoPtr CreateInstanceInfo() const { |
@@ -299,9 +299,9 @@ class Shell::Instance : public mojom::Connector, |
return false; |
} |
- if (!(*client_process_connection)->shell_client_factory.is_valid() || |
+ if (!(*client_process_connection)->shell_client.is_valid() || |
!(*client_process_connection)->pid_receiver_request.is_valid()) { |
- LOG(ERROR) << "Error: must supply both shell_client_factory AND " |
+ LOG(ERROR) << "Error: must supply both shell_client AND " |
<< "pid_receiver_request when sending " |
<< "client_process_connection."; |
callback.Run(mojom::ConnectResult::INVALID_ARGUMENT, |
@@ -393,7 +393,6 @@ class Shell::Instance : public mojom::Connector, |
Binding<mojom::PIDReceiver> pid_receiver_binding_; |
BindingSet<mojom::Connector> connectors_; |
BindingSet<mojom::Shell> shell_bindings_; |
- mojom::ShellClientFactoryPtr factory_; |
NativeRunner* runner_ = nullptr; |
base::ProcessId pid_ = base::kNullProcessId; |
base::WeakPtrFactory<Instance> weak_factory_; |
@@ -422,8 +421,9 @@ Shell::Shell(scoped_ptr<NativeRunnerFactory> native_runner_factory, |
weak_ptr_factory_(this) { |
mojom::ShellClientPtr client; |
mojom::ShellClientRequest request = GetProxy(&client); |
- CreateInstance(CreateShellIdentity(), GetPermissiveCapabilities(), |
- std::move(client)); |
+ Instance* instance = CreateInstance(CreateShellIdentity(), |
+ GetPermissiveCapabilities()); |
+ instance->StartWithClient(std::move(client)); |
shell_connection_.reset(new ShellConnection(this, std::move(request))); |
if (catalog) |
@@ -492,7 +492,9 @@ bool Shell::AcceptConnection(Connection* connection) { |
// Shell, private: |
void Shell::InitCatalog(mojom::ShellClientPtr catalog) { |
- CreateInstance(CreateCatalogIdentity(), CapabilitySpec(), std::move(catalog)); |
+ Instance* instance = |
+ CreateInstance(CreateCatalogIdentity(), CapabilitySpec()); |
+ instance->StartWithClient(std::move(catalog)); |
// TODO(beng): this doesn't work anymore. |
// Seed the catalog with manifest info for the shell & catalog. |
@@ -582,10 +584,9 @@ bool Shell::ConnectToExistingInstance(scoped_ptr<ConnectParams>* params) { |
} |
Shell::Instance* Shell::CreateInstance(const Identity& target, |
- const CapabilitySpec& spec, |
- mojom::ShellClientPtr client) { |
+ const CapabilitySpec& spec) { |
CHECK(target.user_id() != mojom::kInheritUserID); |
- Instance* instance = new Instance(std::move(client), this, target, spec); |
+ Instance* instance = new Instance(this, target, spec); |
DCHECK(identity_to_instance_.find(target) == |
identity_to_instance_.end()); |
identity_to_instance_[target] = instance; |
@@ -594,7 +595,6 @@ Shell::Instance* Shell::CreateInstance(const Identity& target, |
[this, &info](mojom::InstanceListener* listener) { |
listener->InstanceCreated(info.Clone()); |
}); |
- instance->InitializeClient(); |
return instance; |
} |
@@ -608,10 +608,10 @@ void Shell::AddInstanceListener(mojom::InstanceListenerPtr listener) { |
instance_listeners_.AddInterfacePtr(std::move(listener)); |
} |
-void Shell::CreateShellClient(const Identity& source, |
- const Identity& shell_client_factory, |
- const std::string& name, |
- mojom::ShellClientRequest request) { |
+void Shell::CreateShellClientWithFactory(const Identity& source, |
+ const Identity& shell_client_factory, |
+ const std::string& name, |
+ mojom::ShellClientRequest request) { |
mojom::ShellClientFactory* factory = |
GetShellClientFactory(shell_client_factory, source); |
factory->CreateShellClient(std::move(request), name); |
@@ -674,42 +674,40 @@ void Shell::OnGotResolvedName(mojom::ShellResolverPtr resolver, |
mojom::ClientProcessConnectionPtr client_process_connection = |
params->TakeClientProcessConnection(); |
- |
- mojom::ShellClientRequest request; |
- if (!client.is_bound()) |
- request = GetProxy(&client); |
- |
- Instance* instance = CreateInstance(target, capabilities, std::move(client)); |
- instance->ConnectToClient(std::move(params)); |
- |
- // If a ShellClientPtr was provided, there's no more work to do: someone |
- // is already holding a corresponding ShellClientRequest. |
- if (!request.is_pending()) |
- return; |
- |
- if (client_process_connection.is_null() && LoadWithLoader(target, &request)) |
- return; |
- |
- CHECK(!file_url.is_null() && !capabilities_ptr.is_null()); |
- |
- if (target.name() != resolved_name) { |
- // In cases where a package alias is resolved, we have to use the instance |
- // from the original request rather than for the package itself, which will |
- // always be the same. |
- CreateShellClient( |
- source, Identity(resolved_name, target.user_id(), instance_name), |
- target.name(), std::move(request)); |
+ Instance* instance = CreateInstance(target, capabilities); |
+ |
+ // Below are various paths through which a new Instance can be bound to a |
+ // ShellClient proxy. |
+ if (client.is_bound()) { |
+ // If a ShellClientPtr was provided, there's no more work to do: someone |
+ // is already holding a corresponding ShellClientRequest. |
+ instance->StartWithClient(std::move(client)); |
+ } else if (!client_process_connection.is_null()) { |
+ // Likewise if a ClientProcessConnection was given via Connect(), it |
+ // provides the ShellClient proxy to use. |
+ instance->StartWithClientProcessConnection( |
+ std::move(client_process_connection)); |
} else { |
- if (!client_process_connection.is_null()) { |
- // The client already started a process for this instance, use it. |
- instance->StartWithClientProcessConnection( |
- std::move(request), std::move(client_process_connection)); |
+ // Otherwise we create a new ShellClient pipe. |
+ mojom::ShellClientRequest request = GetProxy(&client); |
+ if (LoadWithLoader(target, &request)) { |
+ instance->StartWithClient(std::move(client)); |
} else { |
- // Otherwise we make our own process. |
- instance->StartWithFilePath(std::move(request), |
- util::UrlToFilePath(file_url.To<GURL>())); |
+ CHECK(!file_url.is_null() && !capabilities_ptr.is_null()); |
+ |
+ if (target.name() != resolved_name) { |
+ instance->StartWithClient(std::move(client)); |
+ CreateShellClientWithFactory( |
+ source, Identity(resolved_name, target.user_id(), instance_name), |
+ target.name(), std::move(request)); |
+ } else { |
+ instance->StartWithFilePath(util::UrlToFilePath(file_url.To<GURL>())); |
+ } |
} |
} |
+ |
+ // Now that the instance has a ShellClient, we can connect to it. |
+ instance->ConnectToClient(std::move(params)); |
} |
bool Shell::LoadWithLoader(const Identity& target, |