#include "content/browser/browser_child_process_host_impl.h"
#include <memory>
#include "base/base_switches.h"
#include "base/clang_profiling_buildflags.h"
#include "base/command_line.h"
#include "base/debug/dump_without_crashing.h"
#include "base/feature_list.h"
#include "base/files/file_path.h"
#include "base/functional/bind.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/histogram_shared_memory.h"
#include "base/metrics/persistent_histogram_allocator.h"
#include "base/metrics/persistent_memory_allocator.h"
#include "base/not_fatal_until.h"
#include "base/observer_list.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/synchronization/waitable_event.h"
#include "base/task/single_thread_task_runner.h"
#include "base/token.h"
#include "base/trace_event/memory_dump_manager.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "components/metrics/histogram_controller.h"
#include "components/tracing/common/tracing_switches.h"
#include "content/browser/browser_main_loop.h"
#include "content/browser/child_process_host_impl.h"
#include "content/browser/metrics/histogram_shared_memory_config.h"
#include "content/browser/tracing/background_tracing_manager_impl.h"
#include "content/public/browser/browser_child_process_host_delegate.h"
#include "content/public/browser/browser_child_process_observer.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/child_process_data.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/resource_coordinator_service.h"
#include "content/public/common/content_client.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/process_type.h"
#include "content/public/common/result_codes.h"
#include "content/public/common/sandboxed_process_launcher_delegate.h"
#include "mojo/public/cpp/bindings/scoped_message_error_crash_key.h"
#include "mojo/public/cpp/system/platform_handle.h"
#include "services/tracing/public/cpp/trace_startup.h"
#include "services/tracing/public/cpp/trace_startup_config.h"
#if BUILDFLAG(IS_APPLE)
#include "content/browser/child_process_task_port_provider_mac.h"
#endif
#if BUILDFLAG(IS_MAC)
#include "content/browser/sandbox_support_mac_impl.h"
#include "content/common/sandbox_support_mac.mojom.h"
#endif
#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID)
#include "services/tracing/public/cpp/system_tracing_service.h"
#endif
#if BUILDFLAG(IS_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
#if BUILDFLAG(CLANG_PROFILING_INSIDE_SANDBOX)
#include "content/public/common/profiling_utils.h"
#endif
#if BUILDFLAG(CONTENT_ENABLE_LEGACY_IPC)
#include "content/public/browser/browser_message_filter.h"
#endif
namespace content {
namespace {
static base::LazyInstance<
BrowserChildProcessHostImpl::BrowserChildProcessList>::DestructorAtExit
g_child_process_list = …;
base::LazyInstance<base::ObserverList<BrowserChildProcessObserver>::Unchecked>::
DestructorAtExit g_browser_child_process_observers = …;
void NotifyProcessLaunchedAndConnected(const ChildProcessData& data) { … }
void NotifyProcessKilled(const ChildProcessData& data,
const ChildProcessTerminationInfo& info) { … }
memory_instrumentation::mojom::ProcessType GetCoordinatorClientProcessType(
ProcessType process_type) { … }
void BindTracedProcessFromUIThread(
base::WeakPtr<BrowserChildProcessHostImpl> weak_host,
mojo::PendingReceiver<tracing::mojom::TracedProcess> receiver) { … }
}
std::unique_ptr<BrowserChildProcessHost> BrowserChildProcessHost::Create(
content::ProcessType process_type,
BrowserChildProcessHostDelegate* delegate,
ChildProcessHost::IpcMode ipc_mode) { … }
BrowserChildProcessHost* BrowserChildProcessHost::FromID(int child_process_id) { … }
#if BUILDFLAG(IS_APPLE)
base::PortProvider* BrowserChildProcessHost::GetPortProvider() {
return ChildProcessTaskPortProvider::GetInstance();
}
#endif
BrowserChildProcessHostImpl::BrowserChildProcessList*
BrowserChildProcessHostImpl::GetIterator() { … }
void BrowserChildProcessHostImpl::AddObserver(
BrowserChildProcessObserver* observer) { … }
void BrowserChildProcessHostImpl::RemoveObserver(
BrowserChildProcessObserver* observer) { … }
BrowserChildProcessHostImpl::BrowserChildProcessHostImpl(
content::ProcessType process_type,
BrowserChildProcessHostDelegate* delegate,
ChildProcessHost::IpcMode ipc_mode)
: … { … }
BrowserChildProcessHostImpl::~BrowserChildProcessHostImpl() { … }
void BrowserChildProcessHostImpl::TerminateAll() { … }
void BrowserChildProcessHostImpl::Launch(
std::unique_ptr<SandboxedProcessLauncherDelegate> delegate,
std::unique_ptr<base::CommandLine> cmd_line,
bool terminate_on_shutdown) { … }
const ChildProcessData& BrowserChildProcessHostImpl::GetData() { … }
ChildProcessHost* BrowserChildProcessHostImpl::GetHost() { … }
const base::Process& BrowserChildProcessHostImpl::GetProcess() { … }
std::unique_ptr<base::PersistentMemoryAllocator>
BrowserChildProcessHostImpl::TakeMetricsAllocator() { … }
void BrowserChildProcessHostImpl::SetName(const std::u16string& name) { … }
void BrowserChildProcessHostImpl::SetMetricsName(
const std::string& metrics_name) { … }
void BrowserChildProcessHostImpl::SetProcess(base::Process process) { … }
void BrowserChildProcessHostImpl::ForceShutdown() { … }
#if BUILDFLAG(CONTENT_ENABLE_LEGACY_IPC)
void BrowserChildProcessHostImpl::AddFilter(BrowserMessageFilter* filter) {
child_process_host_->AddFilter(filter->GetFilter());
}
#endif
void BrowserChildProcessHostImpl::LaunchWithFileData(
std::unique_ptr<SandboxedProcessLauncherDelegate> delegate,
std::unique_ptr<base::CommandLine> cmd_line,
std::unique_ptr<ChildProcessLauncherFileData> file_data,
bool terminate_on_shutdown) { … }
void BrowserChildProcessHostImpl::LaunchWithoutExtraCommandLineSwitches(
std::unique_ptr<SandboxedProcessLauncherDelegate> delegate,
std::unique_ptr<base::CommandLine> cmd_line,
std::unique_ptr<ChildProcessLauncherFileData> file_data,
bool terminate_on_shutdown) { … }
#if !BUILDFLAG(IS_ANDROID)
void BrowserChildProcessHostImpl::SetProcessPriority(
base::Process::Priority priority) { … }
#endif
#if BUILDFLAG(IS_ANDROID)
void BrowserChildProcessHostImpl::EnableWarmUpConnection() {
can_use_warm_up_connection_ = true;
}
void BrowserChildProcessHostImpl::DumpProcessStack() {
if (!child_process_launcher_) {
return;
}
child_process_launcher_->DumpProcessStack();
}
#endif
ChildProcessTerminationInfo BrowserChildProcessHostImpl::GetTerminationInfo(
bool known_dead) { … }
bool BrowserChildProcessHostImpl::OnMessageReceived(
const IPC::Message& message) { … }
void BrowserChildProcessHostImpl::OnChannelConnected(int32_t peer_pid) { … }
void BrowserChildProcessHostImpl::OnProcessConnected() { … }
void BrowserChildProcessHostImpl::OnChannelError() { … }
void BrowserChildProcessHostImpl::OnBadMessageReceived(
const IPC::Message& message) { … }
void BrowserChildProcessHostImpl::BindChildHistogramFetcherFactory(
mojo::PendingReceiver<metrics::mojom::ChildHistogramFetcherFactory>
factory) { … }
void BrowserChildProcessHostImpl::TerminateOnBadMessageReceived(
const std::string& error) { … }
void BrowserChildProcessHostImpl::OnChannelInitialized(IPC::Channel* channel) { … }
void BrowserChildProcessHostImpl::OnChildDisconnected() { … }
bool BrowserChildProcessHostImpl::Send(IPC::Message* message) { … }
void BrowserChildProcessHostImpl::CreateMetricsAllocator() { … }
void BrowserChildProcessHostImpl::ShareMetricsAllocatorToProcess() { … }
void BrowserChildProcessHostImpl::OnProcessLaunchFailed(int error_code) { … }
#if BUILDFLAG(IS_ANDROID)
bool BrowserChildProcessHostImpl::CanUseWarmUpConnection() {
return can_use_warm_up_connection_;
}
#endif
void BrowserChildProcessHostImpl::OnProcessLaunched() { … }
void BrowserChildProcessHostImpl::RegisterCoordinatorClient(
mojo::PendingReceiver<memory_instrumentation::mojom::Coordinator> receiver,
mojo::PendingRemote<memory_instrumentation::mojom::ClientProcess>
client_process) { … }
bool BrowserChildProcessHostImpl::IsProcessLaunched() const { … }
void BrowserChildProcessHostImpl::OnMojoError(
base::WeakPtr<BrowserChildProcessHostImpl> process,
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
const std::string& error) { … }
void BrowserChildProcessHostImpl::TerminateProcessForBadMessage(
base::WeakPtr<BrowserChildProcessHostImpl> process,
const std::string& error) { … }
#if BUILDFLAG(IS_WIN)
void BrowserChildProcessHostImpl::OnObjectSignaled(HANDLE object) {
OnChildDisconnected();
}
#endif
}