|  | // Copyright 2019 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. | 
|  |  | 
|  | // This file exposes services in the browser to child processes. | 
|  |  | 
|  | #include "content/browser/browser_child_process_host_impl.h" | 
|  |  | 
|  | #include "base/bind.h" | 
|  | #include "base/no_destructor.h" | 
|  | #include "base/task/thread_pool.h" | 
|  | #include "build/build_config.h" | 
|  | #include "components/discardable_memory/public/mojom/discardable_shared_memory_manager.mojom.h" | 
|  | #include "components/discardable_memory/service/discardable_shared_memory_manager.h" | 
|  | #include "content/browser/field_trial_recorder.h" | 
|  | #include "content/common/field_trial_recorder.mojom.h" | 
|  | #include "content/public/browser/browser_child_process_host_delegate.h" | 
|  | #include "content/public/browser/browser_task_traits.h" | 
|  | #include "content/public/browser/browser_thread.h" | 
|  | #include "content/public/browser/device_service.h" | 
|  | #include "services/device/public/mojom/power_monitor.mojom.h" | 
|  | #include "services/metrics/public/cpp/ukm_recorder.h" | 
|  | #include "services/metrics/public/mojom/ukm_interface.mojom.h" | 
|  | #include "services/metrics/ukm_recorder_interface.h" | 
|  |  | 
|  | #if defined(OS_MACOSX) | 
|  | #include "content/browser/sandbox_support_mac_impl.h" | 
|  | #include "content/common/sandbox_support_mac.mojom.h" | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_WIN) | 
|  | #include "content/browser/renderer_host/dwrite_font_proxy_impl_win.h" | 
|  | #include "content/public/common/font_cache_dispatcher_win.h" | 
|  | #include "content/public/common/font_cache_win.mojom.h" | 
|  | #endif | 
|  |  | 
|  | namespace content { | 
|  | namespace { | 
|  |  | 
|  | BrowserChildProcessHost::BindHostReceiverInterceptor& | 
|  | GetBindHostReceiverInterceptor() { | 
|  | static base::NoDestructor< | 
|  | BrowserChildProcessHost::BindHostReceiverInterceptor> | 
|  | interceptor; | 
|  | return *interceptor; | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | void BrowserChildProcessHostImpl::BindHostReceiver( | 
|  | mojo::GenericPendingReceiver receiver) { | 
|  | const auto& interceptor = GetBindHostReceiverInterceptor(); | 
|  | if (interceptor) { | 
|  | interceptor.Run(this, &receiver); | 
|  | if (!receiver) | 
|  | return; | 
|  | } | 
|  |  | 
|  | if (auto r = | 
|  | receiver.As<memory_instrumentation::mojom::CoordinatorConnector>()) { | 
|  | // Well-behaved child processes do not bind this interface more than once. | 
|  | if (!coordinator_connector_receiver_.is_bound()) | 
|  | coordinator_connector_receiver_.Bind(std::move(r)); | 
|  | return; | 
|  | } | 
|  |  | 
|  | #if defined(OS_MACOSX) | 
|  | if (auto r = receiver.As<mojom::SandboxSupportMac>()) { | 
|  | static base::NoDestructor<SandboxSupportMacImpl> sandbox_support; | 
|  | sandbox_support->BindReceiver(std::move(r)); | 
|  | return; | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_WIN) | 
|  | if (auto r = receiver.As<mojom::FontCacheWin>()) { | 
|  | FontCacheDispatcher::Create(std::move(r)); | 
|  | return; | 
|  | } | 
|  |  | 
|  | if (auto r = receiver.As<blink::mojom::DWriteFontProxy>()) { | 
|  | base::ThreadPool::CreateSequencedTaskRunner( | 
|  | {base::TaskPriority::USER_BLOCKING, base::MayBlock()}) | 
|  | ->PostTask(FROM_HERE, | 
|  | base::BindOnce(&DWriteFontProxyImpl::Create, std::move(r))); | 
|  | return; | 
|  | } | 
|  | #endif | 
|  |  | 
|  | if (auto r = receiver.As<mojom::FieldTrialRecorder>()) { | 
|  | GetUIThreadTaskRunner({})->PostTask( | 
|  | FROM_HERE, base::BindOnce(&FieldTrialRecorder::Create, std::move(r))); | 
|  | return; | 
|  | } | 
|  |  | 
|  | if (auto r = receiver.As< | 
|  | discardable_memory::mojom::DiscardableSharedMemoryManager>()) { | 
|  | discardable_memory::DiscardableSharedMemoryManager::Get()->Bind( | 
|  | std::move(r)); | 
|  | return; | 
|  | } | 
|  |  | 
|  | if (auto r = receiver.As<device::mojom::PowerMonitor>()) { | 
|  | GetUIThreadTaskRunner({})->PostTask( | 
|  | FROM_HERE, | 
|  | base::BindOnce( | 
|  | [](mojo::PendingReceiver<device::mojom::PowerMonitor> r) { | 
|  | GetDeviceService().BindPowerMonitor(std::move(r)); | 
|  | }, | 
|  | std::move(r))); | 
|  | return; | 
|  | } | 
|  |  | 
|  | if (auto r = receiver.As<ukm::mojom::UkmRecorderInterface>()) { | 
|  | metrics::UkmRecorderInterface::Create(ukm::UkmRecorder::Get(), | 
|  | std::move(r)); | 
|  | return; | 
|  | } | 
|  |  | 
|  | delegate_->BindHostReceiver(std::move(receiver)); | 
|  | } | 
|  |  | 
|  | // static | 
|  | void BrowserChildProcessHost::InterceptBindHostReceiverForTesting( | 
|  | BindHostReceiverInterceptor callback) { | 
|  | GetBindHostReceiverInterceptor() = std::move(callback); | 
|  | } | 
|  |  | 
|  | }  // namespace content |