| Index: services/service_manager/service_manager.cc
|
| diff --git a/services/service_manager/service_manager.cc b/services/service_manager/service_manager.cc
|
| index acfcaaf51e02febad62ea28dac2cf44aa890440b..a32333f5da1dbcd0f3cf03f62e337734da5f2802 100644
|
| --- a/services/service_manager/service_manager.cc
|
| +++ b/services/service_manager/service_manager.cc
|
| @@ -165,16 +165,6 @@ class ServiceManager::Instance
|
| base::Unretained(this)));
|
| }
|
|
|
| - void StartWithClientProcessConnection(
|
| - mojom::ClientProcessConnectionPtr client_process_connection) {
|
| - mojom::ServicePtr service;
|
| - service.Bind(mojom::ServicePtrInfo(
|
| - std::move(client_process_connection->service), 0));
|
| - pid_receiver_binding_.Bind(
|
| - std::move(client_process_connection->pid_receiver_request));
|
| - StartWithService(std::move(service));
|
| - }
|
| -
|
| bool StartWithFilePath(const base::FilePath& path) {
|
| DCHECK(!service_);
|
| DCHECK(!path.empty());
|
| @@ -189,6 +179,10 @@ class ServiceManager::Instance
|
| return true;
|
| }
|
|
|
| + void BindPIDReceiver(mojom::PIDReceiverRequest request) {
|
| + pid_receiver_binding_.Bind(std::move(request));
|
| + }
|
| +
|
| mojom::RunningServiceInfoPtr CreateRunningServiceInfo() const {
|
| mojom::RunningServiceInfoPtr info(mojom::RunningServiceInfo::New());
|
| info->id = id_;
|
| @@ -234,18 +228,42 @@ class ServiceManager::Instance
|
| };
|
|
|
| // mojom::Connector implementation:
|
| - void Connect(const service_manager::Identity& in_target,
|
| + void Start(
|
| + const Identity& target,
|
| + mojo::ScopedMessagePipeHandle service_handle,
|
| + mojom::PIDReceiverRequest pid_receiver_request) override {
|
| + mojom::ServicePtr service;
|
| + service.Bind(mojom::ServicePtrInfo(std::move(service_handle), 0));
|
| + ConnectImpl(
|
| + target,
|
| + mojom::InterfaceProviderRequest(),
|
| + std::move(service),
|
| + std::move(pid_receiver_request),
|
| + base::Bind(
|
| + &service_manager::ServiceManager::Instance::EmptyConnectCallback,
|
| + weak_factory_.GetWeakPtr()));
|
| + }
|
| +
|
| + void Connect(const service_manager::Identity& target,
|
| mojom::InterfaceProviderRequest remote_interfaces,
|
| - mojom::ClientProcessConnectionPtr client_process_connection,
|
| const ConnectCallback& callback) override {
|
| + ConnectImpl(target, std::move(remote_interfaces), mojom::ServicePtr(),
|
| + mojom::PIDReceiverRequest(), callback);
|
| + }
|
| +
|
| + void ConnectImpl(const service_manager::Identity& in_target,
|
| + mojom::InterfaceProviderRequest remote_interfaces,
|
| + mojom::ServicePtr service,
|
| + mojom::PIDReceiverRequest pid_receiver_request,
|
| + const ConnectCallback& callback) {
|
| Identity target = in_target;
|
| if (target.user_id() == mojom::kInheritUserID)
|
| target.set_user_id(identity_.user_id());
|
|
|
| if (!ValidateIdentity(target, callback))
|
| return;
|
| - if (!ValidateClientProcessConnection(&client_process_connection, target,
|
| - callback)) {
|
| + if (!ValidateClientProcessInfo(&service, &pid_receiver_request, target,
|
| + callback)) {
|
| return;
|
| }
|
| if (!ValidateConnectionSpec(target, callback))
|
| @@ -255,7 +273,8 @@ class ServiceManager::Instance
|
| params->set_source(identity_);
|
| params->set_target(target);
|
| params->set_remote_interfaces(std::move(remote_interfaces));
|
| - params->set_client_process_connection(std::move(client_process_connection));
|
| + params->set_client_process_info(std::move(service),
|
| + std::move(pid_receiver_request));
|
| params->set_connect_callback(callback);
|
| service_manager_->Connect(
|
| std::move(params), nullptr, weak_factory_.GetWeakPtr());
|
| @@ -300,11 +319,12 @@ class ServiceManager::Instance
|
| return true;
|
| }
|
|
|
| - bool ValidateClientProcessConnection(
|
| - mojom::ClientProcessConnectionPtr* client_process_connection,
|
| + bool ValidateClientProcessInfo(
|
| + mojom::ServicePtr* service,
|
| + mojom::PIDReceiverRequest* pid_receiver_request,
|
| const Identity& target,
|
| const ConnectCallback& callback) {
|
| - if (!client_process_connection->is_null()) {
|
| + if (service->is_bound() || pid_receiver_request->is_pending()) {
|
| if (!HasCapability(GetConnectionSpec(), kCapability_ClientProcess)) {
|
| LOG(ERROR) << "Instance: " << identity_.name() << " attempting "
|
| << "to register an instance for a process it created for "
|
| @@ -316,11 +336,9 @@ class ServiceManager::Instance
|
| return false;
|
| }
|
|
|
| - if (!(*client_process_connection)->service.is_valid() ||
|
| - !(*client_process_connection)->pid_receiver_request.is_valid()) {
|
| + if (!service->is_bound() || !pid_receiver_request->is_pending()) {
|
| LOG(ERROR) << "Must supply both service AND "
|
| - << "pid_receiver_request when sending "
|
| - << "client_process_connection.";
|
| + << "pid_receiver_request when sending client process info";
|
| callback.Run(mojom::ConnectResult::INVALID_ARGUMENT,
|
| mojom::kInheritUserID);
|
| return false;
|
| @@ -342,7 +360,7 @@ class ServiceManager::Instance
|
| InterfaceProviderSpec connection_spec = GetConnectionSpec();
|
| // TODO(beng): Need to do the following additional policy validation of
|
| // whether this instance is allowed to connect using:
|
| - // - a non-null client_process_connection.
|
| + // - non-null client process info.
|
| if (target.user_id() != identity_.user_id() &&
|
| target.user_id() != mojom::kRootUserID &&
|
| !HasCapability(connection_spec, kCapability_UserID)) {
|
| @@ -432,6 +450,9 @@ class ServiceManager::Instance
|
| OnServiceLost(service_manager_->GetWeakPtr());
|
| }
|
|
|
| + void EmptyConnectCallback(mojom::ConnectResult result,
|
| + const std::string& user_id) {}
|
| +
|
| service_manager::ServiceManager* const service_manager_;
|
|
|
| // An id that identifies this instance. Distinct from pid, as a single process
|
| @@ -872,8 +893,6 @@ void ServiceManager::OnGotResolvedName(std::unique_ptr<ConnectParams> params,
|
| source_identity_for_creation = params->source();
|
| }
|
|
|
| - mojom::ClientProcessConnectionPtr client_process_connection =
|
| - params->TakeClientProcessConnection();
|
| Instance* instance = CreateInstance(source_identity_for_creation,
|
| target, result->interface_provider_specs);
|
|
|
| @@ -883,11 +902,13 @@ void ServiceManager::OnGotResolvedName(std::unique_ptr<ConnectParams> params,
|
| // 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 (!client_process_connection.is_null()) {
|
| - // Likewise if a ClientProcessConnection was given via Connect(), it
|
| - // provides the Service proxy to use.
|
| - instance->StartWithClientProcessConnection(
|
| - std::move(client_process_connection));
|
| + } 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());
|
| + instance->StartWithService(params->TakeService());
|
| + return;
|
| } else {
|
| // Otherwise we create a new Service pipe.
|
| mojom::ServiceRequest request(&service);
|
|
|