Index: content/browser/service_manager/service_manager_context.cc |
diff --git a/content/browser/service_manager/service_manager_context.cc b/content/browser/service_manager/service_manager_context.cc |
index 0cad78c8a54fbce6dde976f6c5948d6b269c2fc6..db56719c833e15ef86a50ad54b1117d3f36b5614 100644 |
--- a/content/browser/service_manager/service_manager_context.cc |
+++ b/content/browser/service_manager/service_manager_context.cc |
@@ -13,6 +13,7 @@ |
#include "base/lazy_instance.h" |
#include "base/macros.h" |
#include "base/memory/ptr_util.h" |
+#include "base/process/process_handle.h" |
#include "base/single_thread_task_runner.h" |
#include "base/strings/utf_string_conversions.h" |
#include "content/browser/gpu/gpu_process_host.h" |
@@ -182,19 +183,14 @@ class ServiceManagerContext::InProcessServiceManagerContext |
public: |
InProcessServiceManagerContext() {} |
- service_manager::mojom::ServiceRequest Start( |
+ void Start( |
+ service_manager::mojom::ServicePtrInfo packaged_services_service_info, |
std::unique_ptr<BuiltinManifestProvider> manifest_provider) { |
- service_manager::mojom::ServicePtr embedder_service_proxy; |
- service_manager::mojom::ServiceRequest embedder_service_request( |
- &embedder_service_proxy); |
- service_manager::mojom::ServicePtrInfo embedder_service_proxy_info = |
- embedder_service_proxy.PassInterface(); |
- BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)->PostTask( |
- FROM_HERE, |
- base::Bind(&InProcessServiceManagerContext::StartOnIOThread, this, |
- base::Passed(&manifest_provider), |
- base::Passed(&embedder_service_proxy_info))); |
- return embedder_service_request; |
+ BrowserThread::GetTaskRunnerForThread(BrowserThread::IO) |
+ ->PostTask(FROM_HERE, |
+ base::Bind(&InProcessServiceManagerContext::StartOnIOThread, |
+ this, base::Passed(&manifest_provider), |
+ base::Passed(&packaged_services_service_info))); |
} |
void ShutDown() { |
@@ -210,7 +206,7 @@ class ServiceManagerContext::InProcessServiceManagerContext |
void StartOnIOThread( |
std::unique_ptr<BuiltinManifestProvider> manifest_provider, |
- service_manager::mojom::ServicePtrInfo embedder_service_proxy_info) { |
+ service_manager::mojom::ServicePtrInfo packaged_services_service_info) { |
manifest_provider_ = std::move(manifest_provider); |
catalog_ = |
base::MakeUnique<catalog::Catalog>(nullptr, manifest_provider_.get()); |
@@ -218,12 +214,12 @@ class ServiceManagerContext::InProcessServiceManagerContext |
base::MakeUnique<NullServiceProcessLauncherFactory>(), |
catalog_->TakeService()); |
- service_manager::mojom::ServicePtr service; |
- service.Bind(std::move(embedder_service_proxy_info)); |
+ service_manager::mojom::ServicePtr packaged_services_service; |
+ packaged_services_service.Bind(std::move(packaged_services_service_info)); |
service_manager_->RegisterService( |
- service_manager::Identity( |
- mojom::kBrowserServiceName, service_manager::mojom::kRootUserID), |
- std::move(service), nullptr); |
+ service_manager::Identity(mojom::kPackagedServicesServiceName, |
+ service_manager::mojom::kRootUserID), |
+ std::move(packaged_services_service), nullptr); |
} |
void ShutDownOnIOThread() { |
@@ -240,10 +236,11 @@ class ServiceManagerContext::InProcessServiceManagerContext |
}; |
ServiceManagerContext::ServiceManagerContext() { |
- service_manager::mojom::ServiceRequest request; |
+ service_manager::mojom::ServiceRequest packaged_services_request; |
if (service_manager::ServiceManagerIsRemote()) { |
mojo::edk::SetParentPipeHandleFromCommandLine(); |
- request = service_manager::GetServiceRequestFromCommandLine(); |
+ packaged_services_request = |
+ service_manager::GetServiceRequestFromCommandLine(); |
} else { |
std::unique_ptr<BuiltinManifestProvider> manifest_provider = |
base::MakeUnique<BuiltinManifestProvider>(); |
@@ -252,12 +249,14 @@ ServiceManagerContext::ServiceManagerContext() { |
const char* name; |
int resource_id; |
} kManifests[] = { |
- { mojom::kBrowserServiceName, IDR_MOJO_CONTENT_BROWSER_MANIFEST }, |
- { mojom::kGpuServiceName, IDR_MOJO_CONTENT_GPU_MANIFEST }, |
- { mojom::kPluginServiceName, IDR_MOJO_CONTENT_PLUGIN_MANIFEST }, |
- { mojom::kRendererServiceName, IDR_MOJO_CONTENT_RENDERER_MANIFEST }, |
- { mojom::kUtilityServiceName, IDR_MOJO_CONTENT_UTILITY_MANIFEST }, |
- { catalog::mojom::kServiceName, IDR_MOJO_CATALOG_MANIFEST }, |
+ {mojom::kBrowserServiceName, IDR_MOJO_CONTENT_BROWSER_MANIFEST}, |
+ {mojom::kGpuServiceName, IDR_MOJO_CONTENT_GPU_MANIFEST}, |
+ {mojom::kPackagedServicesServiceName, |
+ IDR_MOJO_CONTENT_PACKAGED_SERVICES_MANIFEST}, |
+ {mojom::kPluginServiceName, IDR_MOJO_CONTENT_PLUGIN_MANIFEST}, |
+ {mojom::kRendererServiceName, IDR_MOJO_CONTENT_RENDERER_MANIFEST}, |
+ {mojom::kUtilityServiceName, IDR_MOJO_CONTENT_UTILITY_MANIFEST}, |
+ {catalog::mojom::kServiceName, IDR_MOJO_CATALOG_MANIFEST}, |
}; |
for (size_t i = 0; i < arraysize(kManifests); ++i) { |
@@ -270,24 +269,44 @@ ServiceManagerContext::ServiceManagerContext() { |
manifest.resource_id); |
} |
in_process_context_ = new InProcessServiceManagerContext; |
- request = in_process_context_->Start(std::move(manifest_provider)); |
+ |
+ service_manager::mojom::ServicePtr packaged_services_service; |
+ packaged_services_request = mojo::MakeRequest(&packaged_services_service); |
+ in_process_context_->Start(packaged_services_service.PassInterface(), |
+ std::move(manifest_provider)); |
} |
+ |
+ packaged_services_connection_ = ServiceManagerConnection::Create( |
+ std::move(packaged_services_request), |
+ BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)); |
+ |
+ service_manager::mojom::ServicePtr root_browser_service; |
ServiceManagerConnection::SetForProcess(ServiceManagerConnection::Create( |
- std::move(request), |
+ mojo::MakeRequest(&root_browser_service), |
BrowserThread::GetTaskRunnerForThread(BrowserThread::IO))); |
+ service_manager::mojom::PIDReceiverPtr pid_receiver; |
+ packaged_services_connection_->GetConnector()->StartService( |
+ service_manager::Identity(mojom::kBrowserServiceName, |
+ service_manager::mojom::kRootUserID), |
+ std::move(root_browser_service), mojo::MakeRequest(&pid_receiver)); |
+ pid_receiver->SetPID(base::GetCurrentProcId()); |
+ |
+ packaged_services_connection_->Start(); |
+ ServiceManagerConnection::GetForProcess()->Start(); |
+ |
ServiceInfo device_info; |
device_info.factory = |
base::Bind(&device::CreateDeviceService, |
BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE)); |
- ServiceManagerConnection::GetForProcess()->AddEmbeddedService( |
- device::mojom::kServiceName, device_info); |
+ packaged_services_connection_->AddEmbeddedService(device::mojom::kServiceName, |
+ device_info); |
ContentBrowserClient::StaticServiceMap services; |
GetContentClient()->browser()->RegisterInProcessServices(&services); |
for (const auto& entry : services) { |
- ServiceManagerConnection::GetForProcess()->AddEmbeddedService(entry.first, |
- entry.second); |
+ packaged_services_connection_->AddEmbeddedService(entry.first, |
+ entry.second); |
} |
// This is safe to assign directly from any thread, because |
@@ -296,17 +315,14 @@ ServiceManagerContext::ServiceManagerContext() { |
g_io_thread_connector.Get() = |
ServiceManagerConnection::GetForProcess()->GetConnector()->Clone(); |
- ServiceManagerConnection::GetForProcess()->Start(); |
- |
ContentBrowserClient::OutOfProcessServiceMap sandboxed_services; |
GetContentClient() |
->browser() |
->RegisterOutOfProcessServices(&sandboxed_services); |
for (const auto& service : sandboxed_services) { |
- ServiceManagerConnection::GetForProcess()->AddServiceRequestHandler( |
- service.first, |
- base::Bind(&StartServiceInUtilityProcess, service.first, service.second, |
- true /* use_sandbox */)); |
+ packaged_services_connection_->AddServiceRequestHandler( |
+ service.first, base::Bind(&StartServiceInUtilityProcess, service.first, |
+ service.second, true /* use_sandbox */)); |
} |
ContentBrowserClient::OutOfProcessServiceMap unsandboxed_services; |
@@ -317,25 +333,15 @@ ServiceManagerContext::ServiceManagerContext() { |
std::make_pair(shape_detection::mojom::kServiceName, |
base::ASCIIToUTF16("Shape Detection Service"))); |
for (const auto& service : unsandboxed_services) { |
- ServiceManagerConnection::GetForProcess()->AddServiceRequestHandler( |
- service.first, |
- base::Bind(&StartServiceInUtilityProcess, service.first, service.second, |
- false /* use_sandbox */)); |
+ packaged_services_connection_->AddServiceRequestHandler( |
+ service.first, base::Bind(&StartServiceInUtilityProcess, service.first, |
+ service.second, false /* use_sandbox */)); |
} |
#if (ENABLE_MOJO_MEDIA_IN_GPU_PROCESS) |
- ServiceManagerConnection::GetForProcess()->AddServiceRequestHandler( |
+ packaged_services_connection_->AddServiceRequestHandler( |
"media", base::Bind(&StartServiceInGpuProcess, "media")); |
#endif |
- |
- // Initiates the first connection to device service to create the singleton |
- // instance, later the same instance will serve all the clients wanting to |
- // connect to device service. |
- // TODO(rockot): http://crbug.com/679407 Eliminate this connection once |
- // content_browser is itself a singleton service. |
- std::unique_ptr<service_manager::Connection> device_connection = |
- ServiceManagerConnection::GetForProcess()->GetConnector()->Connect( |
- device::mojom::kServiceName); |
} |
ServiceManagerContext::~ServiceManagerContext() { |