#include "chrome/browser/browser_process_impl.h"
#include <stddef.h>
#include <stdio.h>
#include <algorithm>
#include <map>
#include <optional>
#include <utility>
#include <vector>
#include "base/atomic_ref_count.h"
#include "base/command_line.h"
#include "base/debug/leak_annotations.h"
#include "base/files/file_path.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/functional/callback_helpers.h"
#include "base/location.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/notreached.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/synchronization/waitable_event.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/single_thread_task_runner.h"
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
#include "base/threading/thread.h"
#include "base/threading/thread_restrictions.h"
#include "base/time/default_clock.h"
#include "base/time/default_tick_clock.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/accessibility/soda_installer_impl.h"
#include "chrome/browser/battery/battery_metrics.h"
#include "chrome/browser/browser_process_platform_part.h"
#include "chrome/browser/chrome_browser_main.h"
#include "chrome/browser/chrome_content_browser_client.h"
#include "chrome/browser/component_updater/chrome_component_updater_configurator.h"
#include "chrome/browser/controlled_frame/controlled_frame_extensions_browser_api_provider.h"
#include "chrome/browser/defaults.h"
#include "chrome/browser/devtools/remote_debugging_server.h"
#include "chrome/browser/download/download_request_limiter.h"
#include "chrome/browser/download/download_status_updater.h"
#include "chrome/browser/global_features.h"
#include "chrome/browser/google/google_brand.h"
#include "chrome/browser/gpu/gpu_mode_manager.h"
#include "chrome/browser/icon_manager.h"
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/lifetime/browser_shutdown.h"
#include "chrome/browser/lifetime/switch_utils.h"
#include "chrome/browser/media/chrome_media_session_client.h"
#include "chrome/browser/media/router/providers/cast/dual_media_sink_service.h"
#include "chrome/browser/media/webrtc/webrtc_event_log_manager.h"
#include "chrome/browser/media/webrtc/webrtc_log_uploader.h"
#include "chrome/browser/metrics/chrome_feature_list_creator.h"
#include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
#include "chrome/browser/metrics/chrome_metrics_services_manager_client.h"
#include "chrome/browser/metrics/metrics_reporting_state.h"
#include "chrome/browser/net/system_network_context_manager.h"
#include "chrome/browser/notifications/notification_platform_bridge.h"
#include "chrome/browser/notifications/system_notification_helper.h"
#include "chrome/browser/permissions/chrome_permissions_client.h"
#include "chrome/browser/policy/chrome_browser_policy_connector.h"
#include "chrome/browser/prefs/browser_prefs.h"
#include "chrome/browser/prefs/chrome_pref_service_factory.h"
#include "chrome/browser/printing/background_printing_manager.h"
#include "chrome/browser/printing/print_job_manager.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/resource_coordinator/resource_coordinator_parts.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/browser/shell_integration.h"
#include "chrome/browser/site_isolation/prefs_observer.h"
#include "chrome/browser/ssl/secure_origin_prefs_observer.h"
#include "chrome/browser/startup_data.h"
#include "chrome/browser/status_icons/status_tray.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/update_client/chrome_update_query_params_delegate.h"
#include "chrome/common/buildflags.h"
#include "chrome/common/channel_info.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/branded_strings.h"
#include "chrome/installer/util/google_update_settings.h"
#include "components/breadcrumbs/core/application_breadcrumbs_logger.h"
#include "components/breadcrumbs/core/breadcrumb_persistent_storage_util.h"
#include "components/breadcrumbs/core/breadcrumbs_status.h"
#include "components/breadcrumbs/core/crash_reporter_breadcrumb_observer.h"
#include "components/component_updater/component_updater_service.h"
#include "components/component_updater/timer_update_scheduler.h"
#include "components/crash/core/common/crash_key.h"
#include "components/embedder_support/origin_trials/origin_trials_settings_storage.h"
#include "components/fingerprinting_protection_filter/common/fingerprinting_protection_filter_constants.h"
#include "components/fingerprinting_protection_filter/common/fingerprinting_protection_filter_features.h"
#include "components/gcm_driver/gcm_driver.h"
#include "components/language/core/browser/pref_names.h"
#include "components/metrics/metrics_pref_names.h"
#include "components/metrics/metrics_service.h"
#include "components/metrics_services_manager/metrics_services_manager.h"
#include "components/metrics_services_manager/metrics_services_manager_client.h"
#include "components/network_time/network_time_tracker.h"
#include "components/os_crypt/async/browser/os_crypt_async.h"
#include "components/permissions/permissions_client.h"
#include "components/policy/core/common/policy_service.h"
#include "components/prefs/json_pref_store.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
#include "components/safe_browsing/content/browser/safe_browsing_service_interface.h"
#include "components/sessions/core/session_id_generator.h"
#include "components/signin/core/browser/active_primary_accounts_metrics_recorder.h"
#include "components/subresource_filter/content/browser/safe_browsing_ruleset_publisher.h"
#include "components/subresource_filter/content/shared/browser/ruleset_service.h"
#include "components/subresource_filter/core/browser/subresource_filter_features.h"
#include "components/subresource_filter/core/common/constants.h"
#include "components/translate/core/browser/translate_download_manager.h"
#include "components/ukm/ukm_service.h"
#include "components/update_client/update_query_params.h"
#include "components/variations/service/variations_service.h"
#include "components/web_resource/web_resource_pref_names.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/child_process_security_policy.h"
#include "content/public/browser/network_quality_observer_factory.h"
#include "content/public/browser/network_service_instance.h"
#include "content/public/browser/process_visibility_util.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/service_worker_context.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/common/content_switches.h"
#include "extensions/buildflags/buildflags.h"
#include "extensions/common/constants.h"
#include "media/media_buildflags.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "ppapi/buildflags/buildflags.h"
#include "printing/buildflags/buildflags.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/cpp/network_switches.h"
#include "ui/base/idle/idle.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/ui_base_features.h"
#if BUILDFLAG(IS_WIN)
#include "base/win/windows_version.h"
#include "chrome/browser/browser_features.h"
#include "chrome/browser/os_crypt/app_bound_encryption_provider_win.h"
#include "components/app_launch_prefetch/app_launch_prefetch.h"
#include "components/os_crypt/async/browser/dpapi_key_provider.h"
#elif BUILDFLAG(IS_MAC)
#include "chrome/browser/chrome_browser_main_mac.h"
#include "chrome/browser/media/webrtc/system_media_capture_permissions_stats_mac.h"
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "components/soda/soda_installer_impl_chromeos.h"
#else
#include "ui/message_center/message_center.h"
#endif
#if BUILDFLAG(IS_ANDROID)
#include "chrome/browser/accessibility/accessibility_prefs/android/accessibility_prefs_controller.h"
#include "chrome/browser/flags/android/chrome_feature_list.h"
#include "chrome/browser/ssl/chrome_security_state_client.h"
#include "chrome/browser/webapps/webapps_client_android.h"
#include "chrome/browser/webauthn/android/chrome_webauthn_client_android.h"
#include "components/webauthn/android/webauthn_client_android.h"
#else
#include "chrome/browser/devtools/devtools_auto_opener.h"
#include "chrome/browser/gcm/gcm_product_util.h"
#include "chrome/browser/hid/hid_system_tray_icon.h"
#include "chrome/browser/intranet_redirect_detector.h"
#include "chrome/browser/lifetime/application_lifetime_desktop.h"
#include "chrome/browser/resource_coordinator/tab_manager.h"
#include "chrome/browser/serial/serial_policy_allowed_ports.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/usb/usb_system_tray_icon.h"
#include "chrome/browser/web_applications/isolated_web_apps/iwa_identity_validator.h"
#include "chrome/browser/webapps/webapps_client_desktop.h"
#include "components/gcm_driver/gcm_client_factory.h"
#include "components/gcm_driver/gcm_desktop_utils.h"
#include "components/keep_alive_registry/keep_alive_registry.h"
#endif
#if BUILDFLAG(ENABLE_BACKGROUND_MODE)
#include "chrome/browser/background/background_mode_manager.h"
#endif
#if BUILDFLAG(ENABLE_EXTENSIONS_CORE)
#include "chrome/common/initialize_extensions_client.h"
#endif
#if BUILDFLAG(ENABLE_EXTENSIONS)
#include "chrome/browser/apps/platform_apps/chrome_apps_browser_api_provider.h"
#include "chrome/browser/extensions/chrome_extensions_browser_client.h"
#include "chrome/browser/media_galleries/media_file_system_registry.h"
#include "chrome/browser/ui/apps/chrome_app_window_client.h"
#include "chrome/common/extensions/chrome_extensions_client.h"
#include "components/storage_monitor/storage_monitor.h"
#include "extensions/common/context_data.h"
#include "extensions/common/extension_l10n_util.h"
#endif
#if BUILDFLAG(ENABLE_DESKTOP_ANDROID_EXTENSIONS)
#include "chrome/browser/extensions/desktop_android/desktop_android_extensions_browser_client.h"
#endif
#if BUILDFLAG(ENABLE_PLUGINS)
#include "chrome/browser/plugins/chrome_plugin_service_filter.h"
#include "content/public/browser/plugin_service.h"
#endif
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
#include "chrome/browser/printing/print_preview_dialog_controller.h"
#endif
#if BUILDFLAG(ENABLE_SESSION_SERVICE)
#include "chrome/browser/sessions/exit_type_service.h"
#endif
#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/first_run/upgrade_util.h"
#include "chrome/browser/ui/profiles/profile_picker.h"
#endif
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
#include "chrome/browser/error_reporting/chrome_js_error_report_processor.h"
#endif
#if BUILDFLAG(ENABLE_CHROME_NOTIFICATIONS)
#include "chrome/browser/notifications/notification_ui_manager.h"
#endif
#if BUILDFLAG(IS_CHROMEOS)
#include "chrome/browser/chromeos/extensions/telemetry/chromeos_telemetry_extensions_browser_api_provider.h"
#include "chrome/browser/hid/hid_pinned_notification.h"
#include "chrome/browser/screen_ai/screen_ai_downloader_chromeos.h"
#include "chrome/browser/usb/usb_pinned_notification.h"
#include "components/crash/core/app/crashpad.h"
#elif !BUILDFLAG(IS_ANDROID)
#include "chrome/browser/hid/hid_status_icon.h"
#include "chrome/browser/screen_ai/screen_ai_downloader_non_chromeos.h"
#include "chrome/browser/usb/usb_status_icon.h"
#include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
#endif
#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
static const int kUpdateCheckIntervalHours = …;
#endif
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_OZONE)
static constexpr base::TimeDelta kEndSessionTimeout = …;
#endif
BrowserThread;
ChildProcessSecurityPolicy;
BrowserProcessImpl::BrowserProcessImpl(StartupData* startup_data)
: … { … }
void BrowserProcessImpl::Init() { … }
#if !BUILDFLAG(IS_ANDROID)
void BrowserProcessImpl::SetQuitClosure(base::OnceClosure quit_closure) { … }
#endif
#if BUILDFLAG(IS_MAC)
void BrowserProcessImpl::ClearQuitClosure() {
quit_closure_.Reset();
}
#endif
BrowserProcessImpl::~BrowserProcessImpl() { … }
#if !BUILDFLAG(IS_ANDROID)
void BrowserProcessImpl::StartTearDown() { … }
void BrowserProcessImpl::PostDestroyThreads() { … }
#endif
void BrowserProcessImpl::SetMetricsServices(
std::unique_ptr<metrics_services_manager::MetricsServicesManager> manager,
metrics_services_manager::MetricsServicesManagerClient* client) { … }
namespace {
class RundownTaskCounter :
public base::RefCountedThreadSafe<RundownTaskCounter> { … };
RundownTaskCounter::RundownTaskCounter() = default;
base::OnceClosure RundownTaskCounter::GetRundownClosure() { … }
void RundownTaskCounter::Decrement() { … }
void RundownTaskCounter::TimedWait(base::TimeDelta timeout) { … }
#if !BUILDFLAG(IS_ANDROID)
void RequestProxyResolvingSocketFactoryOnUIThread(
mojo::PendingReceiver<network::mojom::ProxyResolvingSocketFactory>
receiver) { … }
void RequestProxyResolvingSocketFactory(
mojo::PendingReceiver<network::mojom::ProxyResolvingSocketFactory>
receiver) { … }
#endif
}
void BrowserProcessImpl::FlushLocalStateAndReply(base::OnceClosure reply) { … }
void BrowserProcessImpl::EndSession() { … }
metrics_services_manager::MetricsServicesManager*
BrowserProcessImpl::GetMetricsServicesManager() { … }
metrics::MetricsService* BrowserProcessImpl::metrics_service() { … }
embedder_support::OriginTrialsSettingsStorage*
BrowserProcessImpl::GetOriginTrialsSettingsStorage() { … }
SystemNetworkContextManager*
BrowserProcessImpl::system_network_context_manager() { … }
scoped_refptr<network::SharedURLLoaderFactory>
BrowserProcessImpl::shared_url_loader_factory() { … }
network::NetworkQualityTracker* BrowserProcessImpl::network_quality_tracker() { … }
ProfileManager* BrowserProcessImpl::profile_manager() { … }
PrefService* BrowserProcessImpl::local_state() { … }
signin::ActivePrimaryAccountsMetricsRecorder*
BrowserProcessImpl::active_primary_accounts_metrics_recorder() { … }
variations::VariationsService* BrowserProcessImpl::variations_service() { … }
BrowserProcessPlatformPart* BrowserProcessImpl::platform_part() { … }
NotificationUIManager* BrowserProcessImpl::notification_ui_manager() { … }
NotificationPlatformBridge* BrowserProcessImpl::notification_platform_bridge() { … }
policy::ChromeBrowserPolicyConnector*
BrowserProcessImpl::browser_policy_connector() { … }
policy::PolicyService* BrowserProcessImpl::policy_service() { … }
IconManager* BrowserProcessImpl::icon_manager() { … }
GpuModeManager* BrowserProcessImpl::gpu_mode_manager() { … }
void BrowserProcessImpl::CreateDevToolsProtocolHandler() { … }
void BrowserProcessImpl::CreateDevToolsAutoOpener() { … }
bool BrowserProcessImpl::IsShuttingDown() { … }
printing::PrintJobManager* BrowserProcessImpl::print_job_manager() { … }
printing::PrintPreviewDialogController*
BrowserProcessImpl::print_preview_dialog_controller() { … }
printing::BackgroundPrintingManager*
BrowserProcessImpl::background_printing_manager() { … }
#if !BUILDFLAG(IS_ANDROID)
IntranetRedirectDetector* BrowserProcessImpl::intranet_redirect_detector() { … }
#endif
const std::string& BrowserProcessImpl::GetApplicationLocale() { … }
void BrowserProcessImpl::SetApplicationLocale(
const std::string& actual_locale) { … }
DownloadStatusUpdater* BrowserProcessImpl::download_status_updater() { … }
MediaFileSystemRegistry* BrowserProcessImpl::media_file_system_registry() { … }
WebRtcLogUploader* BrowserProcessImpl::webrtc_log_uploader() { … }
network_time::NetworkTimeTracker* BrowserProcessImpl::network_time_tracker() { … }
#if !BUILDFLAG(IS_ANDROID)
gcm::GCMDriver* BrowserProcessImpl::gcm_driver() { … }
#endif
resource_coordinator::TabManager* BrowserProcessImpl::GetTabManager() { … }
resource_coordinator::ResourceCoordinatorParts*
BrowserProcessImpl::resource_coordinator_parts() { … }
#if !BUILDFLAG(IS_ANDROID)
SerialPolicyAllowedPorts* BrowserProcessImpl::serial_policy_allowed_ports() { … }
HidSystemTrayIcon* BrowserProcessImpl::hid_system_tray_icon() { … }
UsbSystemTrayIcon* BrowserProcessImpl::usb_system_tray_icon() { … }
#endif
os_crypt_async::OSCryptAsync* BrowserProcessImpl::os_crypt_async() { … }
void BrowserProcessImpl::set_additional_os_crypt_async_provider_for_test(
size_t precedence,
std::unique_ptr<os_crypt_async::KeyProvider> provider) { … }
BuildState* BrowserProcessImpl::GetBuildState() { … }
void BrowserProcessImpl::RegisterPrefs(PrefRegistrySimple* registry) { … }
GlobalFeatures* BrowserProcessImpl::GetFeatures() { … }
DownloadRequestLimiter* BrowserProcessImpl::download_request_limiter() { … }
BackgroundModeManager* BrowserProcessImpl::background_mode_manager() { … }
#if BUILDFLAG(ENABLE_BACKGROUND_MODE)
void BrowserProcessImpl::set_background_mode_manager_for_test(
std::unique_ptr<BackgroundModeManager> manager) { … }
#endif
StatusTray* BrowserProcessImpl::status_tray() { … }
safe_browsing::SafeBrowsingService*
BrowserProcessImpl::safe_browsing_service() { … }
subresource_filter::RulesetService*
BrowserProcessImpl::subresource_filter_ruleset_service() { … }
subresource_filter::RulesetService*
BrowserProcessImpl::fingerprinting_protection_ruleset_service() { … }
StartupData* BrowserProcessImpl::startup_data() { … }
#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
void BrowserProcessImpl::StartAutoupdateTimer() { … }
#endif
component_updater::ComponentUpdateService*
BrowserProcessImpl::component_updater() { … }
void BrowserProcessImpl::OnKeepAliveStateChanged(bool is_keeping_alive) { … }
void BrowserProcessImpl::CreateNetworkQualityObserver() { … }
void BrowserProcessImpl::OnKeepAliveRestartStateChanged(bool can_restart) { … }
void BrowserProcessImpl::CreateProfileManager() { … }
void BrowserProcessImpl::PreCreateThreads() { … }
void BrowserProcessImpl::PreMainMessageLoopRun() { … }
void BrowserProcessImpl::CreateIconManager() { … }
void BrowserProcessImpl::CreateNotificationPlatformBridge() { … }
void BrowserProcessImpl::CreateNotificationUIManager() { … }
void BrowserProcessImpl::CreateBackgroundModeManager() { … }
void BrowserProcessImpl::CreateStatusTray() { … }
void BrowserProcessImpl::CreatePrintPreviewDialogController() { … }
void BrowserProcessImpl::CreateBackgroundPrintingManager() { … }
void BrowserProcessImpl::CreateSafeBrowsingService() { … }
void BrowserProcessImpl::CreateSubresourceFilterRulesetService() { … }
void BrowserProcessImpl::CreateFingerprintingProtectionRulesetService() { … }
#if !BUILDFLAG(IS_ANDROID)
void BrowserProcessImpl::CreateGCMDriver() { … }
#endif
void BrowserProcessImpl::CreateNetworkTimeTracker() { … }
void BrowserProcessImpl::ApplyDefaultBrowserPolicy() { … }
void BrowserProcessImpl::Pin() { … }
void BrowserProcessImpl::Unpin() { … }
#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
bool BrowserProcessImpl::IsRunningInBackground() const { … }
void BrowserProcessImpl::RestartBackgroundInstance() { … }
void BrowserProcessImpl::OnAutoupdateTimer() { … }
void BrowserProcessImpl::OnPendingRestartResult(
bool is_update_pending_restart) { … }
#endif