| Index: services/service_manager/service_manager.cc
|
| diff --git a/services/service_manager/service_manager.cc b/services/service_manager/service_manager.cc
|
| index 99b9869ee5b99b844139621efe4698041b13fee5..ed5e3044994bf5a44ed47a9c89fa1d9020b5348a 100644
|
| --- a/services/service_manager/service_manager.cc
|
| +++ b/services/service_manager/service_manager.cc
|
| @@ -322,7 +322,8 @@
|
| service.Bind(mojom::ServicePtrInfo(std::move(service_handle), 0));
|
| params->set_client_process_info(std::move(service),
|
| std::move(pid_receiver_request));
|
| - service_manager_->Connect(std::move(params), weak_factory_.GetWeakPtr());
|
| + service_manager_->Connect(
|
| + std::move(params), nullptr, weak_factory_.GetWeakPtr());
|
| }
|
|
|
| void Connect(const service_manager::Identity& in_target,
|
| @@ -341,7 +342,8 @@
|
| params->set_target(target);
|
| params->set_remote_interfaces(std::move(remote_interfaces));
|
| params->set_connect_callback(callback);
|
| - service_manager_->Connect(std::move(params), weak_factory_.GetWeakPtr());
|
| + service_manager_->Connect(
|
| + std::move(params), nullptr, weak_factory_.GetWeakPtr());
|
| }
|
|
|
| void BindInterface(const service_manager::Identity& in_target,
|
| @@ -362,7 +364,8 @@
|
| params->set_interface_request_info(interface_name,
|
| std::move(interface_pipe));
|
| params->set_bind_interface_callback(callback);
|
| - service_manager_->Connect(std::move(params), weak_factory_.GetWeakPtr());
|
| + service_manager_->Connect(
|
| + std::move(params), nullptr, weak_factory_.GetWeakPtr());
|
| }
|
|
|
| void Clone(mojom::ConnectorRequest request) override {
|
| @@ -682,26 +685,22 @@
|
| }
|
|
|
| void ServiceManager::Connect(std::unique_ptr<ConnectParams> params) {
|
| - Connect(std::move(params), nullptr);
|
| -}
|
| -
|
| -void ServiceManager::RegisterService(
|
| - const Identity& identity,
|
| - mojom::ServicePtr service,
|
| - mojom::PIDReceiverRequest pid_receiver_request) {
|
| - auto params = base::MakeUnique<ConnectParams>();
|
| -
|
| - if (!pid_receiver_request.is_pending()) {
|
| - mojom::PIDReceiverPtr pid_receiver;
|
| - pid_receiver_request = mojom::PIDReceiverRequest(&pid_receiver);
|
| - pid_receiver->SetPID(base::Process::Current().Pid());
|
| - }
|
| -
|
| - params->set_source(identity);
|
| - params->set_target(identity);
|
| - params->set_client_process_info(
|
| - std::move(service), std::move(pid_receiver_request));
|
| - Connect(std::move(params), nullptr);
|
| + Connect(std::move(params), nullptr, nullptr);
|
| +}
|
| +
|
| +mojom::ServiceRequest ServiceManager::StartEmbedderService(
|
| + const std::string& name) {
|
| + std::unique_ptr<ConnectParams> params(new ConnectParams);
|
| +
|
| + Identity embedder_identity(name, mojom::kRootUserID);
|
| + params->set_source(embedder_identity);
|
| + params->set_target(embedder_identity);
|
| +
|
| + mojom::ServicePtr service;
|
| + mojom::ServiceRequest request(&service);
|
| + Connect(std::move(params), std::move(service), nullptr);
|
| +
|
| + return request;
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -766,6 +765,7 @@
|
| }
|
|
|
| void ServiceManager::Connect(std::unique_ptr<ConnectParams> params,
|
| + mojom::ServicePtr service,
|
| base::WeakPtr<Instance> source_instance) {
|
| TRACE_EVENT_INSTANT1("service_manager", "ServiceManager::Connect",
|
| TRACE_EVENT_SCOPE_THREAD, "original_name",
|
| @@ -773,11 +773,10 @@
|
| DCHECK(!params->target().name().empty());
|
| DCHECK(base::IsValidGUID(params->target().user_id()));
|
| DCHECK_NE(mojom::kInheritUserID, params->target().user_id());
|
| - DCHECK(!params->HasClientProcessInfo() ||
|
| - !identity_to_instance_.count(params->target()));
|
| + DCHECK(!service.is_bound() || !identity_to_instance_.count(params->target()));
|
|
|
| // Connect to an existing matching instance, if possible.
|
| - if (!params->HasClientProcessInfo() && ConnectToExistingInstance(¶ms))
|
| + if (!service.is_bound() && ConnectToExistingInstance(¶ms))
|
| return;
|
|
|
| // The catalog needs to see the source identity as that of the originating
|
| @@ -792,7 +791,7 @@
|
| name,
|
| base::Bind(&service_manager::ServiceManager::OnGotResolvedName,
|
| weak_ptr_factory_.GetWeakPtr(), base::Passed(¶ms),
|
| - !!source_instance, source_instance));
|
| + base::Passed(&service), !!source_instance, source_instance));
|
| }
|
|
|
| ServiceManager::Instance* ServiceManager::GetExistingInstance(
|
| @@ -933,6 +932,7 @@
|
| }
|
|
|
| void ServiceManager::OnGotResolvedName(std::unique_ptr<ConnectParams> params,
|
| + mojom::ServicePtr service,
|
| bool has_source_instance,
|
| base::WeakPtr<Instance> source_instance,
|
| mojom::ResolveResultPtr result,
|
| @@ -992,8 +992,12 @@
|
|
|
| // Below are various paths through which a new Instance can be bound to a
|
| // Service proxy.
|
| - if (params->HasClientProcessInfo()) {
|
| - // This branch should be reachable only via a call to RegisterService() . We
|
| + if (service.is_bound()) {
|
| + // If a ServicePtr was provided, there's no more work to do: someone
|
| + // is already holding a corresponding ServiceRequest.
|
| + instance->StartWithService(std::move(service));
|
| + } else if (params->HasClientProcessInfo()) {
|
| + // This branch should be reachable only via a call to RegisterService(). We
|
| // start the instance but return early before we connect to it. Clients will
|
| // call Connect() with the target identity subsequently.
|
| instance->BindPIDReceiver(params->TakePIDReceiverRequest());
|
| @@ -1001,7 +1005,6 @@
|
| return;
|
| } else {
|
| // Otherwise we create a new Service pipe.
|
| - mojom::ServicePtr service;
|
| mojom::ServiceRequest request(&service);
|
|
|
| // The catalog was unable to read a manifest for this service. We can't do
|
|
|