Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(438)

Unified Diff: content/browser/service_manager/service_manager_context.cc

Issue 2695803004: Make browser process a singleton service (Closed)
Patch Set: . Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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() {

Powered by Google App Engine
This is Rietveld 408576698