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 |