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

Unified Diff: content/browser/mojo/mojo_shell_context.cc

Issue 2387263002: Rename MojoShellContext -> ServiceManagerContext. (Closed)
Patch Set: . Created 4 years, 2 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
« no previous file with comments | « content/browser/mojo/mojo_shell_context.h ('k') | content/browser/mojo_sandbox_browsertest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/mojo/mojo_shell_context.cc
diff --git a/content/browser/mojo/mojo_shell_context.cc b/content/browser/mojo/mojo_shell_context.cc
deleted file mode 100644
index acc926a17e51c31b27049732c43f9345680f28ee..0000000000000000000000000000000000000000
--- a/content/browser/mojo/mojo_shell_context.cc
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/mojo/mojo_shell_context.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/json/json_reader.h"
-#include "base/lazy_instance.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/single_thread_task_runner.h"
-#include "content/browser/gpu/gpu_process_host.h"
-#include "content/browser/mojo/merge_dictionary.h"
-#include "content/common/mojo/mojo_shell_connection_impl.h"
-#include "content/grit/content_resources.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/content_browser_client.h"
-#include "content/public/browser/utility_process_host.h"
-#include "content/public/browser/utility_process_host_client.h"
-#include "content/public/common/content_client.h"
-#include "content/public/common/mojo_shell_connection.h"
-#include "content/public/common/service_names.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "services/catalog/catalog.h"
-#include "services/catalog/manifest_provider.h"
-#include "services/catalog/store.h"
-#include "services/file/public/cpp/constants.h"
-#include "services/shell/connect_params.h"
-#include "services/shell/native_runner.h"
-#include "services/shell/public/cpp/connector.h"
-#include "services/shell/public/cpp/service.h"
-#include "services/shell/public/interfaces/service.mojom.h"
-#include "services/shell/runner/common/client_util.h"
-#include "services/shell/runner/host/in_process_native_runner.h"
-#include "services/shell/service_manager.h"
-
-namespace content {
-
-namespace {
-
-base::LazyInstance<std::unique_ptr<shell::Connector>>::Leaky
- g_io_thread_connector = LAZY_INSTANCE_INITIALIZER;
-
-void DestroyConnectorOnIOThread() { g_io_thread_connector.Get().reset(); }
-
-void StartUtilityProcessOnIOThread(shell::mojom::ServiceFactoryRequest request,
- const base::string16& process_name,
- bool use_sandbox) {
- UtilityProcessHost* process_host =
- UtilityProcessHost::Create(nullptr, nullptr);
- process_host->SetName(process_name);
- if (!use_sandbox)
- process_host->DisableSandbox();
- process_host->Start();
- process_host->GetRemoteInterfaces()->GetInterface(std::move(request));
-}
-
-void StartServiceInUtilityProcess(const std::string& service_name,
- const base::string16& process_name,
- bool use_sandbox,
- shell::mojom::ServiceRequest request) {
- shell::mojom::ServiceFactoryPtr service_factory;
- BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
- base::Bind(&StartUtilityProcessOnIOThread,
- base::Passed(GetProxy(&service_factory)),
- process_name, use_sandbox));
- service_factory->CreateService(std::move(request), service_name);
-}
-
-#if (ENABLE_MOJO_MEDIA_IN_GPU_PROCESS)
-
-// Request shell::mojom::ServiceFactory from GPU process host. Must be called on
-// IO thread.
-void RequestGpuServiceFactory(shell::mojom::ServiceFactoryRequest request) {
- GpuProcessHost* process_host =
- GpuProcessHost::Get(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED);
- if (!process_host) {
- DLOG(ERROR) << "GPU process host not available.";
- return;
- }
-
- // TODO(xhwang): It's possible that |process_host| is non-null, but the actual
- // process is dead. In that case, |request| will be dropped and application
- // load requests through ServiceFactory will also fail. Make sure we handle
- // these cases correctly.
- process_host->GetRemoteInterfaces()->GetInterface(std::move(request));
-}
-
-void StartServiceInGpuProcess(const std::string& service_name,
- shell::mojom::ServiceRequest request) {
- shell::mojom::ServiceFactoryPtr service_factory;
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&RequestGpuServiceFactory,
- base::Passed(GetProxy(&service_factory))));
- service_factory->CreateService(std::move(request), service_name);
-}
-
-#endif // ENABLE_MOJO_MEDIA_IN_GPU_PROCESS
-
-// A ManifestProvider which resolves application names to builtin manifest
-// resources for the catalog service to consume.
-class BuiltinManifestProvider : public catalog::ManifestProvider {
- public:
- BuiltinManifestProvider() {}
- ~BuiltinManifestProvider() override {}
-
- void AddManifestValue(const std::string& name,
- std::unique_ptr<base::Value> manifest_contents) {
- auto result = manifests_.insert(
- std::make_pair(name, std::move(manifest_contents)));
- DCHECK(result.second) << "Duplicate manifest entry: " << name;
- }
-
- private:
- // catalog::ManifestProvider:
- std::unique_ptr<base::Value> GetManifest(const std::string& name) override {
- auto it = manifests_.find(name);
- return it != manifests_.end() ? it->second->CreateDeepCopy() : nullptr;
- }
-
- std::map<std::string, std::unique_ptr<base::Value>> manifests_;
-
- DISALLOW_COPY_AND_ASSIGN(BuiltinManifestProvider);
-};
-
-} // namespace
-
-// State which lives on the IO thread and drives the ServiceManager.
-class MojoShellContext::InProcessServiceManagerContext
- : public base::RefCountedThreadSafe<InProcessServiceManagerContext> {
- public:
- InProcessServiceManagerContext() {}
-
- shell::mojom::ServiceRequest Start(
- std::unique_ptr<BuiltinManifestProvider> manifest_provider) {
- shell::mojom::ServicePtr embedder_service_proxy;
- shell::mojom::ServiceRequest embedder_service_request =
- mojo::GetProxy(&embedder_service_proxy);
- shell::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;
- }
-
- void ShutDown() {
- BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)->PostTask(
- FROM_HERE,
- base::Bind(&InProcessServiceManagerContext::ShutDownOnIOThread, this));
- }
-
- private:
- friend class base::RefCountedThreadSafe<InProcessServiceManagerContext>;
-
- ~InProcessServiceManagerContext() {}
-
- void StartOnIOThread(
- std::unique_ptr<BuiltinManifestProvider> manifest_provider,
- shell::mojom::ServicePtrInfo embedder_service_proxy_info) {
- manifest_provider_ = std::move(manifest_provider);
-
- base::SequencedWorkerPool* blocking_pool = BrowserThread::GetBlockingPool();
- std::unique_ptr<shell::NativeRunnerFactory> native_runner_factory(
- new shell::InProcessNativeRunnerFactory(blocking_pool));
- catalog_.reset(
- new catalog::Catalog(blocking_pool, nullptr, manifest_provider_.get()));
- service_manager_.reset(new shell::ServiceManager(
- std::move(native_runner_factory), catalog_->TakeService()));
-
- shell::mojom::ServiceRequest request =
- service_manager_->StartEmbedderService(kBrowserMojoApplicationName);
- mojo::FuseInterface(
- std::move(request), std::move(embedder_service_proxy_info));
- }
-
- void ShutDownOnIOThread() {
- service_manager_.reset();
- catalog_.reset();
- manifest_provider_.reset();
- }
-
- std::unique_ptr<BuiltinManifestProvider> manifest_provider_;
- std::unique_ptr<catalog::Catalog> catalog_;
- std::unique_ptr<shell::ServiceManager> service_manager_;
-
- DISALLOW_COPY_AND_ASSIGN(InProcessServiceManagerContext);
-};
-
-MojoShellContext::MojoShellContext() {
- shell::mojom::ServiceRequest request;
- if (shell::ShellIsRemote()) {
- mojo::edk::SetParentPipeHandleFromCommandLine();
- request = shell::GetServiceRequestFromCommandLine();
- } else {
- std::unique_ptr<BuiltinManifestProvider> manifest_provider =
- base::MakeUnique<BuiltinManifestProvider>();
-
- static const struct ManifestInfo {
- const char* name;
- int resource_id;
- } kManifests[] = {
- { kBrowserMojoApplicationName, IDR_MOJO_CONTENT_BROWSER_MANIFEST },
- { kGpuMojoApplicationName, IDR_MOJO_CONTENT_GPU_MANIFEST },
- { kPluginMojoApplicationName, IDR_MOJO_CONTENT_PLUGIN_MANIFEST },
- { kRendererMojoApplicationName, IDR_MOJO_CONTENT_RENDERER_MANIFEST },
- { kUtilityMojoApplicationName, IDR_MOJO_CONTENT_UTILITY_MANIFEST },
- { "service:catalog", IDR_MOJO_CATALOG_MANIFEST },
- { file::kFileServiceName, IDR_MOJO_FILE_MANIFEST }
- };
-
- for (size_t i = 0; i < arraysize(kManifests); ++i) {
- std::string contents = GetContentClient()->GetDataResource(
- kManifests[i].resource_id,
- ui::ScaleFactor::SCALE_FACTOR_NONE).as_string();
- DCHECK(!contents.empty());
- std::unique_ptr<base::Value> manifest_value =
- base::JSONReader::Read(contents);
- std::unique_ptr<base::Value> overlay_value =
- GetContentClient()->browser()->GetServiceManifestOverlay(
- kManifests[i].name);
- if (overlay_value) {
- base::DictionaryValue* manifest_dictionary = nullptr;
- CHECK(manifest_value->GetAsDictionary(&manifest_dictionary));
- base::DictionaryValue* overlay_dictionary = nullptr;
- CHECK(overlay_value->GetAsDictionary(&overlay_dictionary));
- MergeDictionary(manifest_dictionary, overlay_dictionary);
- }
- manifest_provider->AddManifestValue(kManifests[i].name,
- std::move(manifest_value));
- }
- in_process_context_ = new InProcessServiceManagerContext;
- request = in_process_context_->Start(std::move(manifest_provider));
- }
- MojoShellConnection::SetForProcess(MojoShellConnection::Create(
- std::move(request),
- BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)));
-
- ContentBrowserClient::StaticMojoApplicationMap apps;
- GetContentClient()->browser()->RegisterInProcessMojoApplications(&apps);
- for (const auto& entry : apps) {
- MojoShellConnection::GetForProcess()->AddEmbeddedService(entry.first,
- entry.second);
- }
-
- // This is safe to assign directly from any thread, because MojoShellContext
- // must be constructed before anyone can call GetConnectorForIOThread().
- g_io_thread_connector.Get() =
- MojoShellConnection::GetForProcess()->GetConnector()->Clone();
-
- MojoShellConnection::GetForProcess()->Start();
-
- ContentBrowserClient::OutOfProcessMojoApplicationMap sandboxed_apps;
- GetContentClient()
- ->browser()
- ->RegisterOutOfProcessMojoApplications(&sandboxed_apps);
- for (const auto& app : sandboxed_apps) {
- MojoShellConnection::GetForProcess()->AddServiceRequestHandler(
- app.first,
- base::Bind(&StartServiceInUtilityProcess, app.first, app.second,
- true /* use_sandbox */));
- }
-
- ContentBrowserClient::OutOfProcessMojoApplicationMap unsandboxed_apps;
- GetContentClient()
- ->browser()
- ->RegisterUnsandboxedOutOfProcessMojoApplications(&unsandboxed_apps);
- for (const auto& app : unsandboxed_apps) {
- MojoShellConnection::GetForProcess()->AddServiceRequestHandler(
- app.first,
- base::Bind(&StartServiceInUtilityProcess, app.first, app.second,
- false /* use_sandbox */));
- }
-
-#if (ENABLE_MOJO_MEDIA_IN_GPU_PROCESS)
- MojoShellConnection::GetForProcess()->AddServiceRequestHandler(
- "service:media", base::Bind(&StartServiceInGpuProcess, "service:media"));
-#endif
-}
-
-MojoShellContext::~MojoShellContext() {
- // NOTE: The in-process ServiceManager MUST be destroyed before the browser
- // process-wide MojoShellConnection. Otherwise it's possible for the
- // ServiceManager to receive connection requests for service:content_browser
- // which it may attempt to service by launching a new instance of the browser.
- if (in_process_context_)
- in_process_context_->ShutDown();
- if (MojoShellConnection::GetForProcess())
- MojoShellConnection::DestroyForProcess();
- BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
- base::Bind(&DestroyConnectorOnIOThread));
-}
-
-// static
-shell::Connector* MojoShellContext::GetConnectorForIOThread() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- return g_io_thread_connector.Get().get();
-}
-
-} // namespace content
« no previous file with comments | « content/browser/mojo/mojo_shell_context.h ('k') | content/browser/mojo_sandbox_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698