blob: fe275e80765d28164967a9ebc01c3c5fcb7e60a3 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CHROME_CONTENT_BROWSER_CLIENT_H_
#define CHROME_BROWSER_CHROME_CONTENT_BROWSER_CLIENT_H_
#include <stddef.h>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/functional/callback.h"
#include "base/gtest_prod_util.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/strings/string_piece.h"
#include "base/task/sequenced_task_runner.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "base/values.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/startup_data.h"
#include "components/file_access/scoped_file_access.h"
#include "components/safe_browsing/buildflags.h"
#include "components/safe_browsing/content/browser/web_api_handshake_checker.h"
#include "content/public/browser/child_process_security_policy.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/legacy_tech_cookie_issue_details.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/alternative_error_page_override_info.mojom-forward.h"
#include "extensions/buildflags/buildflags.h"
#include "media/media_buildflags.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "services/device/public/cpp/geolocation/buildflags.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
#include "services/video_effects/public/mojom/video_effects_processor.mojom-forward.h"
#include "third_party/blink/public/mojom/worker/shared_worker_info.mojom.h"
class ChromeContentBrowserClientParts;
class PrefRegistrySimple;
class ScopedKeepAlive;
namespace base {
class CommandLine;
} // namespace base
namespace blink {
namespace mojom {
class WindowFeatures;
} // namespace mojom
namespace web_pref {
struct WebPreferences;
} // namespace web_pref
class StorageKey;
class URLLoaderThrottle;
} // namespace blink
namespace blocked_content {
class PopupNavigationDelegate;
} // namespace blocked_content
namespace content {
class BrowserContext;
class RenderFrameHost;
enum class SmsFetchFailureType;
struct ServiceWorkerVersionBaseInfo;
} // namespace content
namespace net {
class IsolationInfo;
class SiteForCookies;
} // namespace net
namespace permissions {
class BluetoothDelegateImpl;
} // namespace permissions
namespace safe_browsing {
class AsyncCheckTracker;
class RealTimeUrlLookupServiceBase;
class SafeBrowsingService;
class UrlCheckerDelegate;
namespace hash_realtime_utils {
enum class HashRealTimeSelection;
}
} // namespace safe_browsing
namespace sandbox {
class SandboxCompiler;
} // namespace sandbox
namespace ui {
class NativeTheme;
} // namespace ui
namespace url {
class Origin;
} // namespace url
namespace user_prefs {
class PrefRegistrySyncable;
} // namespace user_prefs
namespace version_info {
enum class Channel;
} // namespace version_info
class ChromeDirectSocketsDelegate;
class ChromeHidDelegate;
class ChromePrivateNetworkDeviceDelegate;
class ChromeSerialDelegate;
class ChromeUsbDelegate;
class ChromeWebAuthenticationDelegate;
class HttpAuthCoordinator;
struct NavigateParams;
#if BUILDFLAG(ENABLE_VR)
namespace vr {
class ChromeXrIntegrationClient;
}
#endif
class ChromeContentBrowserClient : public content::ContentBrowserClient {
public:
using PopupNavigationDelegateFactory =
std::unique_ptr<blocked_content::PopupNavigationDelegate> (*)(
NavigateParams);
using ClipboardPasteData = content::ClipboardPasteData;
static PopupNavigationDelegateFactory&
GetPopupNavigationDelegateFactoryForTesting();
ChromeContentBrowserClient();
ChromeContentBrowserClient(const ChromeContentBrowserClient&) = delete;
ChromeContentBrowserClient& operator=(const ChromeContentBrowserClient&) =
delete;
~ChromeContentBrowserClient() override;
// TODO(crbug.com/41356866): This file is about calls from content/ out
// to chrome/ to get values or notify about events, but both of these
// functions are from chrome/ to chrome/ and don't involve content/ at all.
// That suggests they belong somewhere else at the chrome/ layer.
static void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
// Notification that the application locale has changed. This allows us to
// update our I/O thread cache of this value.
static void SetApplicationLocale(const std::string& locale);
// content::ContentBrowserClient:
std::unique_ptr<content::BrowserMainParts> CreateBrowserMainParts(
bool is_integration_test) override;
void PostAfterStartupTask(
const base::Location& from_here,
const scoped_refptr<base::SequencedTaskRunner>& task_runner,
base::OnceClosure task) override;
bool IsBrowserStartupComplete() override;
void SetBrowserStartupIsCompleteForTesting() override;
bool IsShuttingDown() override;
content::StoragePartitionConfig GetStoragePartitionConfigForSite(
content::BrowserContext* browser_context,
const GURL& site) override;
std::unique_ptr<content::WebContentsViewDelegate> GetWebContentsViewDelegate(
content::WebContents* web_contents) override;
void RenderProcessWillLaunch(content::RenderProcessHost* host) override;
bool AllowGpuLaunchRetryOnIOThread() override;
GURL GetEffectiveURL(content::BrowserContext* browser_context,
const GURL& url) override;
bool ShouldCompareEffectiveURLsForSiteInstanceSelection(
content::BrowserContext* browser_context,
content::SiteInstance* candidate_site_instance,
bool is_outermost_main_frame,
const GURL& candidate_url,
const GURL& destination_url) override;
bool ShouldUseProcessPerSite(content::BrowserContext* browser_context,
const GURL& site_url) override;
bool ShouldUseSpareRenderProcessHost(content::BrowserContext* browser_context,
const GURL& site_url) override;
bool DoesSiteRequireDedicatedProcess(content::BrowserContext* browser_context,
const GURL& effective_site_url) override;
bool DoesWebUIUrlRequireProcessLock(const GURL& url) override;
bool ShouldTreatURLSchemeAsFirstPartyWhenTopLevel(
base::StringPiece scheme,
bool is_embedded_origin_secure) override;
bool ShouldIgnoreSameSiteCookieRestrictionsWhenTopLevel(
base::StringPiece scheme,
bool is_embedded_origin_secure) override;
std::string GetSiteDisplayNameForCdmProcess(
content::BrowserContext* browser_context,
const GURL& site_url) override;
void OverrideURLLoaderFactoryParams(
content::BrowserContext* browser_context,
const url::Origin& origin,
bool is_for_isolated_world,
network::mojom::URLLoaderFactoryParams* factory_params) override;
void GetAdditionalWebUISchemes(
std::vector<std::string>* additional_schemes) override;
void GetAdditionalViewSourceSchemes(
std::vector<std::string>* additional_schemes) override;
network::mojom::IPAddressSpace DetermineAddressSpaceFromURL(
const GURL& url) override;
bool LogWebUIUrl(const GURL& web_ui_url) override;
bool IsWebUIAllowedToMakeNetworkRequests(const url::Origin& origin) override;
bool IsHandledURL(const GURL& url) override;
bool HasCustomSchemeHandler(content::BrowserContext* browser_context,
const std::string& scheme) override;
bool CanCommitURL(content::RenderProcessHost* process_host,
const GURL& url) override;
void OverrideNavigationParams(
std::optional<GURL> source_process_site_url,
ui::PageTransition* transition,
bool* is_renderer_initiated,
content::Referrer* referrer,
std::optional<url::Origin>* initiator_origin) override;
bool ShouldStayInParentProcessForNTP(const GURL& url,
const GURL& parent_site_url) override;
bool IsSuitableHost(content::RenderProcessHost* process_host,
const GURL& site_url) override;
bool MayReuseHost(content::RenderProcessHost* process_host) override;
size_t GetProcessCountToIgnoreForLimit() override;
std::optional<blink::ParsedPermissionsPolicy>
GetPermissionsPolicyForIsolatedWebApp(content::WebContents* web_contents,
const url::Origin& app_origin) override;
bool ShouldTryToUseExistingProcessHost(
content::BrowserContext* browser_context,
const GURL& url) override;
bool ShouldEmbeddedFramesTryToReuseExistingProcess(
content::RenderFrameHost* outermost_main_frame) override;
void SiteInstanceGotProcessAndSite(
content::SiteInstance* site_instance) override;
bool ShouldSwapBrowsingInstancesForNavigation(
content::SiteInstance* site_instance,
const GURL& current_effective_url,
const GURL& destination_effective_url) override;
bool ShouldIsolateErrorPage(bool in_main_frame) override;
std::vector<url::Origin> GetOriginsRequiringDedicatedProcess() override;
bool ShouldEnableStrictSiteIsolation() override;
bool ShouldDisableSiteIsolation(
content::SiteIsolationMode site_isolation_mode) override;
std::vector<std::string> GetAdditionalSiteIsolationModes() override;
void PersistIsolatedOrigin(
content::BrowserContext* context,
const url::Origin& origin,
content::ChildProcessSecurityPolicy::IsolatedOriginSource source)
override;
bool ShouldUrlUseApplicationIsolationLevel(
content::BrowserContext* browser_context,
const GURL& url) override;
bool IsIsolatedContextAllowedForUrl(content::BrowserContext* browser_context,
const GURL& lock_url) override;
void CheckGetAllScreensMediaAllowed(
content::RenderFrameHost* render_frame_host,
base::OnceCallback<void(bool)> callback) override;
bool IsFileAccessAllowed(const base::FilePath& path,
const base::FilePath& absolute_path,
const base::FilePath& profile_path) override;
void AppendExtraCommandLineSwitches(base::CommandLine* command_line,
int child_process_id) override;
std::string GetApplicationClientGUIDForQuarantineCheck() override;
download::QuarantineConnectionCallback GetQuarantineConnectionCallback()
override;
std::string GetApplicationLocale() override;
std::string GetAcceptLangs(content::BrowserContext* context) override;
gfx::ImageSkia GetDefaultFavicon() override;
bool IsDataSaverEnabled(content::BrowserContext* context) override;
void UpdateRendererPreferencesForWorker(
content::BrowserContext* browser_context,
blink::RendererPreferences* out_prefs) override;
content::AllowServiceWorkerResult AllowServiceWorker(
const GURL& scope,
const net::SiteForCookies& site_for_cookies,
const std::optional<url::Origin>& top_frame_origin,
const GURL& script_url,
content::BrowserContext* context) override;
bool MayDeleteServiceWorkerRegistration(
const GURL& scope,
content::BrowserContext* browser_context) override;
bool ShouldTryToUpdateServiceWorkerRegistration(
const GURL& scope,
content::BrowserContext* browser_context) override;
bool AllowSharedWorker(
const GURL& worker_url,
const net::SiteForCookies& site_for_cookies,
const std::optional<url::Origin>& top_frame_origin,
const std::string& name,
const blink::StorageKey& storage_key,
const blink::mojom::SharedWorkerSameSiteCookies same_site_cookies,
content::BrowserContext* context,
int render_process_id,
int render_frame_id) override;
bool DoesSchemeAllowCrossOriginSharedWorker(
const std::string& scheme) override;
bool AllowSignedExchange(content::BrowserContext* browser_context) override;
bool AllowCompressionDictionaryTransport(
content::BrowserContext* context) override;
void RequestFilesAccess(
const std::vector<base::FilePath>& files,
const GURL& destination_url,
base::OnceCallback<void(file_access::ScopedFileAccess)>
continuation_callback) override;
void AllowWorkerFileSystem(
const GURL& url,
content::BrowserContext* browser_context,
const std::vector<content::GlobalRenderFrameHostId>& render_frames,
base::OnceCallback<void(bool)> callback) override;
bool AllowWorkerIndexedDB(const GURL& url,
content::BrowserContext* browser_context,
const std::vector<content::GlobalRenderFrameHostId>&
render_frames) override;
bool AllowWorkerCacheStorage(
const GURL& url,
content::BrowserContext* browser_context,
const std::vector<content::GlobalRenderFrameHostId>& render_frames)
override;
bool AllowWorkerWebLocks(const GURL& url,
content::BrowserContext* browser_context,
const std::vector<content::GlobalRenderFrameHostId>&
render_frames) override;
AllowWebBluetoothResult AllowWebBluetooth(
content::BrowserContext* browser_context,
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) override;
std::string GetWebBluetoothBlocklist() override;
bool IsInterestGroupAPIAllowed(content::RenderFrameHost* render_frame_host,
InterestGroupApiOperation operation,
const url::Origin& top_frame_origin,
const url::Origin& api_origin) override;
bool IsPrivacySandboxReportingDestinationAttested(
content::BrowserContext* browser_context,
const url::Origin& destination_origin,
content::PrivacySandboxInvokingAPI invoking_api,
bool post_impression_reporting) override;
void OnAuctionComplete(content::RenderFrameHost* render_frame_host,
content::InterestGroupManager::InterestGroupDataKey
winner_data_key) override;
bool IsAttributionReportingOperationAllowed(
content::BrowserContext* browser_context,
AttributionReportingOperation operation,
content::RenderFrameHost* rfh,
const url::Origin* impression_origin,
const url::Origin* conversion_origin,
const url::Origin* reporting_origin,
bool* can_bypass) override;
bool IsAttributionReportingAllowedForContext(
content::BrowserContext* browser_context,
content::RenderFrameHost* rfh,
const url::Origin& context_origin,
const url::Origin& reporting_origin) override;
bool IsSharedStorageAllowed(
content::BrowserContext* browser_context,
content::RenderFrameHost* rfh,
const url::Origin& top_frame_origin,
const url::Origin& accessing_origin,
std::string* out_debug_message = nullptr) override;
bool IsSharedStorageSelectURLAllowed(
content::BrowserContext* browser_context,
const url::Origin& top_frame_origin,
const url::Origin& accessing_origin,
std::string* out_debug_message = nullptr) override;
bool IsPrivateAggregationAllowed(
content::BrowserContext* browser_context,
const url::Origin& top_frame_origin,
const url::Origin& reporting_origin) override;
bool IsPrivateAggregationDebugModeAllowed(
content::BrowserContext* browser_context,
const url::Origin& top_frame_origin,
const url::Origin& reporting_origin) override;
bool IsCookieDeprecationLabelAllowed(
content::BrowserContext* browser_context) override;
bool IsCookieDeprecationLabelAllowedForContext(
content::BrowserContext* browser_context,
const url::Origin& top_frame_origin,
const url::Origin& context_origin) override;
bool IsFullCookieAccessAllowed(content::BrowserContext* browser_context,
const GURL& url,
const blink::StorageKey& storage_key) override;
#if BUILDFLAG(IS_CHROMEOS)
void OnTrustAnchorUsed(content::BrowserContext* browser_context) override;
#endif
bool CanSendSCTAuditingReport(
content::BrowserContext* browser_context) override;
void OnNewSCTAuditingReportSent(
content::BrowserContext* browser_context) override;
scoped_refptr<network::SharedURLLoaderFactory>
GetSystemSharedURLLoaderFactory() override;
network::mojom::NetworkContext* GetSystemNetworkContext() override;
std::string GetGeolocationApiKey() override;
#if BUILDFLAG(OS_LEVEL_GEOLOCATION_PERMISSION_SUPPORTED)
device::GeolocationSystemPermissionManager*
GetGeolocationSystemPermissionManager() override;
#endif
#if BUILDFLAG(IS_ANDROID)
bool ShouldUseGmsCoreGeolocationProvider() override;
#endif
content::GeneratedCodeCacheSettings GetGeneratedCodeCacheSettings(
content::BrowserContext* context) override;
void AllowCertificateError(
content::WebContents* web_contents,
int cert_error,
const net::SSLInfo& ssl_info,
const GURL& request_url,
bool is_primary_main_frame_request,
bool strict_enforcement,
base::OnceCallback<void(content::CertificateRequestResultType)> callback)
override;
#if !BUILDFLAG(IS_ANDROID)
bool ShouldDenyRequestOnCertificateError(const GURL main_page_url) override;
#endif
base::OnceClosure SelectClientCertificate(
content::BrowserContext* browser_context,
content::WebContents* web_contents,
net::SSLCertRequestInfo* cert_request_info,
net::ClientCertIdentityList client_certs,
std::unique_ptr<content::ClientCertificateDelegate> delegate) override;
content::MediaObserver* GetMediaObserver() override;
content::FeatureObserverClient* GetFeatureObserverClient() override;
bool CanCreateWindow(content::RenderFrameHost* opener,
const GURL& opener_url,
const GURL& opener_top_level_frame_url,
const url::Origin& source_origin,
content::mojom::WindowContainerType container_type,
const GURL& target_url,
const content::Referrer& referrer,
const std::string& frame_name,
WindowOpenDisposition disposition,
const blink::mojom::WindowFeatures& features,
bool user_gesture,
bool opener_suppressed,
bool* no_javascript_access) override;
content::SpeechRecognitionManagerDelegate*
CreateSpeechRecognitionManagerDelegate() override;
#if BUILDFLAG(IS_CHROMEOS_ASH)
content::TtsControllerDelegate* GetTtsControllerDelegate() override;
#endif
void MaybeOverrideManifest(content::RenderFrameHost* render_frame_host,
blink::mojom::ManifestPtr& manifest) override;
content::TtsPlatform* GetTtsPlatform() override;
void OverrideWebkitPrefs(content::WebContents* web_contents,
blink::web_pref::WebPreferences* prefs) override;
bool OverrideWebPreferencesAfterNavigation(
content::WebContents* web_contents,
blink::web_pref::WebPreferences* prefs) override;
void BrowserURLHandlerCreated(content::BrowserURLHandler* handler) override;
base::FilePath GetDefaultDownloadDirectory() override;
std::string GetDefaultDownloadName() override;
base::FilePath GetShaderDiskCacheDirectory() override;
base::FilePath GetGrShaderDiskCacheDirectory() override;
base::FilePath GetGraphiteDawnDiskCacheDirectory() override;
base::FilePath GetNetLogDefaultDirectory() override;
base::FilePath GetFirstPartySetsDirectory() override;
std::optional<base::FilePath> GetLocalTracesDirectory() override;
void DidCreatePpapiPlugin(content::BrowserPpapiHost* browser_host) override;
content::BrowserPpapiHost* GetExternalBrowserPpapiHost(
int plugin_process_id) override;
bool AllowPepperSocketAPI(
content::BrowserContext* browser_context,
const GURL& url,
bool private_api,
const content::SocketPermissionRequest* params) override;
bool IsPepperVpnProviderAPIAllowed(content::BrowserContext* browser_context,
const GURL& url) override;
std::unique_ptr<content::VpnServiceProxy> GetVpnServiceProxy(
content::BrowserContext* browser_context) override;
std::unique_ptr<ui::SelectFilePolicy> CreateSelectFilePolicy(
content::WebContents* web_contents) override;
void GetAdditionalAllowedSchemesForFileSystem(
std::vector<std::string>* additional_schemes) override;
void GetSchemesBypassingSecureContextCheckAllowlist(
std::set<std::string>* schemes) override;
void GetURLRequestAutoMountHandlers(
std::vector<storage::URLRequestAutoMountHandler>* handlers) override;
void GetAdditionalFileSystemBackends(
content::BrowserContext* browser_context,
const base::FilePath& storage_partition_path,
std::vector<std::unique_ptr<storage::FileSystemBackend>>*
additional_backends) override;
std::unique_ptr<content::DevToolsManagerDelegate>
CreateDevToolsManagerDelegate() override;
void UpdateDevToolsBackgroundServiceExpiration(
content::BrowserContext* browser_context,
int service,
base::Time expiration_time) override;
base::flat_map<int, base::Time> GetDevToolsBackgroundServiceExpirations(
content::BrowserContext* browser_context) override;
std::optional<base::TimeDelta> GetSpareRendererDelayForSiteURL(
const GURL& site_url) override;
std::unique_ptr<content::TracingDelegate> CreateTracingDelegate() override;
bool IsSystemWideTracingEnabled() override;
bool IsPluginAllowedToCallRequestOSFileHandle(
content::BrowserContext* browser_context,
const GURL& url) override;
bool IsPluginAllowedToUseDevChannelAPIs(
content::BrowserContext* browser_context,
const GURL& url) override;
#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)
void GetAdditionalMappedFilesForChildProcess(
const base::CommandLine& command_line,
int child_process_id,
content::PosixFileDescriptorInfo* mappings) override;
#endif // BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)
#if BUILDFLAG(IS_CHROMEOS_LACROS)
void GetAdditionalMappedFilesForZygote(
base::CommandLine* command_line,
content::PosixFileDescriptorInfo* mappings) override;
#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
#if BUILDFLAG(IS_WIN)
bool PreSpawnChild(sandbox::TargetConfig* config,
sandbox::mojom::Sandbox sandbox_type,
ChildSpawnFlags flags) override;
std::wstring GetAppContainerSidForSandboxType(
sandbox::mojom::Sandbox sandbox_type,
AppContainerFlags flags) override;
bool IsRendererAppContainerDisabled() override;
std::wstring GetLPACCapabilityNameForNetworkService() override;
bool IsUtilityCetCompatible(const std::string& utility_sub_type) override;
bool IsRendererCodeIntegrityEnabled() override;
void SessionEnding(std::optional<DWORD> control_type) override;
bool ShouldEnableAudioProcessHighPriority() override;
#endif
void ExposeInterfacesToRenderer(
service_manager::BinderRegistry* registry,
blink::AssociatedInterfaceRegistry* associated_registry,
content::RenderProcessHost* render_process_host) override;
void BindMediaServiceReceiver(content::RenderFrameHost* render_frame_host,
mojo::GenericPendingReceiver receiver) override;
void RegisterBrowserInterfaceBindersForFrame(
content::RenderFrameHost* render_frame_host,
mojo::BinderMapWithContext<content::RenderFrameHost*>* map) override;
void RegisterWebUIInterfaceBrokers(
content::WebUIBrowserInterfaceBrokerRegistry& registry) override;
void RegisterMojoBinderPoliciesForSameOriginPrerendering(
content::MojoBinderPolicyMap& policy_map) override;
void RegisterMojoBinderPoliciesForPreview(
content::MojoBinderPolicyMap& policy_map) override;
void RegisterBrowserInterfaceBindersForServiceWorker(
content::BrowserContext* browser_context,
const content::ServiceWorkerVersionBaseInfo& service_worker_version_info,
mojo::BinderMapWithContext<const content::ServiceWorkerVersionBaseInfo&>*
map) override;
void RegisterAssociatedInterfaceBindersForServiceWorker(
const content::ServiceWorkerVersionBaseInfo& service_worker_version_info,
blink::AssociatedInterfaceRegistry& associated_registry) override;
void RegisterAssociatedInterfaceBindersForRenderFrameHost(
content::RenderFrameHost& render_frame_host,
blink::AssociatedInterfaceRegistry& associated_registry) override;
void BindGpuHostReceiver(mojo::GenericPendingReceiver receiver) override;
void BindUtilityHostReceiver(mojo::GenericPendingReceiver receiver) override;
void BindHostReceiverForRenderer(
content::RenderProcessHost* render_process_host,
mojo::GenericPendingReceiver receiver) override;
void OpenURL(
content::SiteInstance* site_instance,
const content::OpenURLParams& params,
base::OnceCallback<void(content::WebContents*)> callback) override;
content::ControllerPresentationServiceDelegate*
GetControllerPresentationServiceDelegate(
content::WebContents* web_contents) override;
content::ReceiverPresentationServiceDelegate*
GetReceiverPresentationServiceDelegate(
content::WebContents* web_contents) override;
void AddPresentationObserver(content::PresentationObserver* observer,
content::WebContents* web_contents) override;
void RemovePresentationObserver(content::PresentationObserver* observer,
content::WebContents* web_contents) override;
bool AddPrivacySandboxAttestationsObserver(
content::PrivacySandboxAttestationsObserver* observer) override;
void RemovePrivacySandboxAttestationsObserver(
content::PrivacySandboxAttestationsObserver* observer) override;
std::vector<std::unique_ptr<content::NavigationThrottle>>
CreateThrottlesForNavigation(content::NavigationHandle* handle) override;
std::vector<std::unique_ptr<content::CommitDeferringCondition>>
CreateCommitDeferringConditionsForNavigation(
content::NavigationHandle* navigation_handle,
content::CommitDeferringCondition::NavigationType type) override;
std::unique_ptr<content::NavigationUIData> GetNavigationUIData(
content::NavigationHandle* navigation_handle) override;
std::unique_ptr<media::ScreenEnumerator> CreateScreenEnumerator()
const override;
bool EnforceSystemAudioEchoCancellation() override;
#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
void CreateMediaRemoter(
content::RenderFrameHost* render_frame_host,
mojo::PendingRemote<media::mojom::RemotingSource> source,
mojo::PendingReceiver<media::mojom::Remoter> receiver) final;
#endif // BUILDFLAG(ENABLE_MEDIA_REMOTING)
base::FilePath GetLoggingFileName(
const base::CommandLine& command_line) override;
std::vector<std::unique_ptr<blink::URLLoaderThrottle>>
CreateURLLoaderThrottles(
const network::ResourceRequest& request,
content::BrowserContext* browser_context,
const base::RepeatingCallback<content::WebContents*()>& wc_getter,
content::NavigationUIData* navigation_ui_data,
int frame_tree_node_id,
std::optional<int64_t> navigation_id) override;
std::vector<std::unique_ptr<blink::URLLoaderThrottle>>
CreateURLLoaderThrottlesForKeepAlive(
const network::ResourceRequest& request,
content::BrowserContext* browser_context,
const base::RepeatingCallback<content::WebContents*()>& wc_getter,
int frame_tree_node_id) override;
mojo::PendingRemote<network::mojom::URLLoaderFactory>
CreateNonNetworkNavigationURLLoaderFactory(const std::string& scheme,
int frame_tree_node_id) override;
void RegisterNonNetworkWorkerMainResourceURLLoaderFactories(
content::BrowserContext* browser_context,
NonNetworkURLLoaderFactoryMap* factories) override;
void RegisterNonNetworkServiceWorkerUpdateURLLoaderFactories(
content::BrowserContext* browser_context,
NonNetworkURLLoaderFactoryMap* factories) override;
void RegisterNonNetworkSubresourceURLLoaderFactories(
int render_process_id,
int render_frame_id,
const std::optional<url::Origin>& request_initiator_origin,
NonNetworkURLLoaderFactoryMap* factories) override;
void WillCreateURLLoaderFactory(
content::BrowserContext* browser_context,
content::RenderFrameHost* frame,
int render_process_id,
URLLoaderFactoryType type,
const url::Origin& request_initiator,
const net::IsolationInfo& isolation_info,
std::optional<int64_t> navigation_id,
ukm::SourceIdObj ukm_source_id,
network::URLLoaderFactoryBuilder& factory_builder,
mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
header_client,
bool* bypass_redirect_checks,
bool* disable_secure_dns,
network::mojom::URLLoaderFactoryOverridePtr* factory_override,
scoped_refptr<base::SequencedTaskRunner> navigation_response_task_runner)
override;
std::vector<std::unique_ptr<content::URLLoaderRequestInterceptor>>
WillCreateURLLoaderRequestInterceptors(
content::NavigationUIData* navigation_ui_data,
int frame_tree_node_id,
int64_t navigation_id,
scoped_refptr<base::SequencedTaskRunner> navigation_response_task_runner)
override;
content::ContentBrowserClient::URLLoaderRequestHandler
CreateURLLoaderHandlerForServiceWorkerNavigationPreload(
int frame_tree_node_id,
const network::ResourceRequest& resource_request) override;
bool WillInterceptWebSocket(content::RenderFrameHost* frame) override;
void CreateWebSocket(
content::RenderFrameHost* frame,
WebSocketFactory factory,
const GURL& url,
const net::SiteForCookies& site_for_cookies,
const std::optional<std::string>& user_agent,
mojo::PendingRemote<network::mojom::WebSocketHandshakeClient>
handshake_client) override;
void WillCreateWebTransport(
int process_id,
int frame_routing_id,
const GURL& url,
const url::Origin& initiator_origin,
mojo::PendingRemote<network::mojom::WebTransportHandshakeClient>
handshake_client,
WillCreateWebTransportCallback callback) override;
bool WillCreateRestrictedCookieManager(
network::mojom::RestrictedCookieManagerRole role,
content::BrowserContext* browser_context,
const url::Origin& origin,
const net::IsolationInfo& isolation_info,
bool is_service_worker,
int process_id,
int routing_id,
mojo::PendingReceiver<network::mojom::RestrictedCookieManager>* receiver)
override;
void OnNetworkServiceCreated(
network::mojom::NetworkService* network_service) override;
void ConfigureNetworkContextParams(
content::BrowserContext* context,
bool in_memory,
const base::FilePath& relative_partition_path,
network::mojom::NetworkContextParams* network_context_params,
cert_verifier::mojom::CertVerifierCreationParams*
cert_verifier_creation_params) override;
std::vector<base::FilePath> GetNetworkContextsParentDirectory() override;
base::Value::Dict GetNetLogConstants() override;
bool AllowRenderingMhtmlOverHttp(
content::NavigationUIData* navigation_ui_data) override;
bool ShouldForceDownloadResource(content::BrowserContext* browser_context,
const GURL& url,
const std::string& mime_type) override;
content::BluetoothDelegate* GetBluetoothDelegate() override;
content::UsbDelegate* GetUsbDelegate() override;
content::PrivateNetworkDeviceDelegate* GetPrivateNetworkDeviceDelegate()
override;
bool IsSecurityLevelAcceptableForWebAuthn(
content::RenderFrameHost* rfh,
const url::Origin& caller_origin) override;
#if !BUILDFLAG(IS_ANDROID)
void CreateDeviceInfoService(
content::RenderFrameHost* render_frame_host,
mojo::PendingReceiver<blink::mojom::DeviceAPIService> receiver) override;
void CreateManagedConfigurationService(
content::RenderFrameHost* render_frame_host,
mojo::PendingReceiver<blink::mojom::ManagedConfigurationService> receiver)
override;
content::SerialDelegate* GetSerialDelegate() override;
content::HidDelegate* GetHidDelegate() override;
content::DirectSocketsDelegate* GetDirectSocketsDelegate() override;
content::WebAuthenticationDelegate* GetWebAuthenticationDelegate() override;
std::unique_ptr<content::AuthenticatorRequestClientDelegate>
GetWebAuthenticationRequestDelegate(
content::RenderFrameHost* render_frame_host) override;
#endif
void CreatePaymentCredential(
content::RenderFrameHost* render_frame_host,
mojo::PendingReceiver<payments::mojom::PaymentCredential> receiver)
override;
#if BUILDFLAG(IS_CHROMEOS)
content::SmartCardDelegate* GetSmartCardDelegate() override;
#endif
bool ShowPaymentHandlerWindow(
content::BrowserContext* browser_context,
const GURL& url,
base::OnceCallback<void(bool, int, int)> callback) override;
std::unique_ptr<net::ClientCertStore> CreateClientCertStore(
content::BrowserContext* browser_context) override;
std::unique_ptr<content::LoginDelegate> CreateLoginDelegate(
const net::AuthChallengeInfo& auth_info,
content::WebContents* web_contents,
content::BrowserContext* browser_context,
const content::GlobalRequestID& request_id,
bool is_request_for_primary_main_frame,
const GURL& url,
scoped_refptr<net::HttpResponseHeaders> response_headers,
bool first_auth_attempt,
LoginAuthRequiredCallback auth_required_callback) override;
bool HandleExternalProtocol(
const GURL& url,
content::WebContents::Getter web_contents_getter,
int frame_tree_node_id,
content::NavigationUIData* navigation_data,
bool is_primary_main_frame,
bool is_in_fenced_frame_tree,
network::mojom::WebSandboxFlags sandbox_flags,
ui::PageTransition page_transition,
bool has_user_gesture,
const std::optional<url::Origin>& initiating_origin,
content::RenderFrameHost* initiator_document,
mojo::PendingRemote<network::mojom::URLLoaderFactory>* out_factory)
override;
std::unique_ptr<content::VideoOverlayWindow>
CreateWindowForVideoPictureInPicture(
content::VideoPictureInPictureWindowController* controller) override;
void RegisterRendererPreferenceWatcher(
content::BrowserContext* browser_context,
mojo::PendingRemote<blink::mojom::RendererPreferenceWatcher> watcher)
override;
bool CanAcceptUntrustedExchangesIfNeeded() override;
void OnNetworkServiceDataUseUpdate(
content::GlobalRenderFrameHostId render_frame_host_id,
int32_t network_traffic_annotation_id_hash,
int64_t recv_bytes,
int64_t sent_bytes) override;
base::FilePath GetSandboxedStorageServiceDataDirectory() override;
bool ShouldSandboxAudioService() override;
bool ShouldSandboxNetworkService() override;
bool ShouldRunOutOfProcessSystemDnsResolution() override;
void LogWebFeatureForCurrentPage(content::RenderFrameHost* render_frame_host,
blink::mojom::WebFeature feature) override;
std::string GetProduct() override;
std::string GetUserAgent() override;
std::string GetUserAgentBasedOnPolicy(
content::BrowserContext* context) override;
blink::UserAgentMetadata GetUserAgentMetadata() override;
std::optional<gfx::ImageSkia> GetProductLogo() override;
bool IsBuiltinComponent(content::BrowserContext* browser_context,
const url::Origin& origin) override;
bool ShouldBlockRendererDebugURL(
const GURL& url,
content::BrowserContext* context,
content::RenderFrameHost* render_frame_host) override;
#if BUILDFLAG(IS_ANDROID)
ContentBrowserClient::WideColorGamutHeuristic GetWideColorGamutHeuristic()
override;
#endif
base::flat_set<std::string> GetPluginMimeTypesWithExternalHandlers(
content::BrowserContext* browser_context) override;
void AugmentNavigationDownloadPolicy(
content::RenderFrameHost* frame_host,
bool user_gesture,
blink::NavigationDownloadPolicy* download_policy) override;
bool HandleTopicsWebApi(
const url::Origin& context_origin,
content::RenderFrameHost* main_frame,
browsing_topics::ApiCallerSource caller_source,
bool get_topics,
bool observe,
std::vector<blink::mojom::EpochTopicPtr>& topics) override;
int NumVersionsInTopicsEpochs(
content::RenderFrameHost* main_frame) const override;
bool IsBluetoothScanningBlocked(content::BrowserContext* browser_context,
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) override;
void BlockBluetoothScanning(content::BrowserContext* browser_context,
const url::Origin& requesting_origin,
const url::Origin& embedding_origin) override;
void GetMediaDeviceIDSalt(
content::RenderFrameHost* rfh,
const net::SiteForCookies& site_for_cookies,
const blink::StorageKey& storage_key,
base::OnceCallback<void(bool, const std::string&)> callback) override;
#if !BUILDFLAG(IS_ANDROID)
base::OnceClosure FetchRemoteSms(
content::WebContents* web_contents,
const std::vector<url::Origin>& origin_list,
base::OnceCallback<void(std::optional<std::vector<url::Origin>>,
std::optional<std::string>,
std::optional<content::SmsFetchFailureType>)>
callback) override;
#endif
bool IsClipboardPasteAllowed(
content::RenderFrameHost* render_frame_host) override;
void IsClipboardPasteAllowedByPolicy(
const content::ClipboardEndpoint& source,
const content::ClipboardEndpoint& destination,
const content::ClipboardMetadata& metadata,
ClipboardPasteData clipboard_paste_data,
IsClipboardPasteAllowedCallback callback) override;
void IsClipboardCopyAllowedByPolicy(
const content::ClipboardEndpoint& source,
const content::ClipboardMetadata& metadata,
const ClipboardPasteData& data,
IsClipboardCopyAllowedCallback callback) override;
#if BUILDFLAG(ENABLE_VR)
content::XrIntegrationClient* GetXrIntegrationClient() override;
#endif
void BindBrowserControlInterface(mojo::ScopedMessagePipeHandle pipe) override;
bool ShouldInheritCrossOriginEmbedderPolicyImplicitly(
const GURL& url) override;
bool ShouldServiceWorkerInheritPolicyContainerFromCreator(
const GURL& url) override;
PrivateNetworkRequestPolicyOverride ShouldOverridePrivateNetworkRequestPolicy(
content::BrowserContext* browser_context,
const url::Origin& origin) override;
bool IsJitDisabledForSite(content::BrowserContext* browser_context,
const GURL& site_url) override;
ukm::UkmService* GetUkmService() override;
blink::mojom::OriginTrialsSettingsPtr GetOriginTrialsSettings() override;
void OnKeepaliveRequestStarted(
content::BrowserContext* browser_context) override;
void OnKeepaliveRequestFinished() override;
#if BUILDFLAG(IS_MAC)
bool SetupEmbedderSandboxParameters(
sandbox::mojom::Sandbox sandbox_type,
sandbox::SandboxCompiler* compiler) override;
#endif // BUILDFLAG(IS_MAC)
void GetHyphenationDictionary(
base::OnceCallback<void(const base::FilePath&)>) override;
bool HasErrorPage(int http_status_code) override;
StartupData* startup_data() { return &startup_data_; }
std::unique_ptr<content::IdentityRequestDialogController>
CreateIdentityRequestDialogController(
content::WebContents* web_contents) override;
#if BUILDFLAG(IS_ANDROID)
void ShowDigitalIdentityInterstitialIfNeeded(
content::WebContents& web_contents,
const url::Origin& origin,
DigitalIdentityInterstitialCallback callback) override;
#endif
#if !BUILDFLAG(IS_ANDROID)
base::TimeDelta GetKeepaliveTimerTimeout(content::BrowserContext* context);
#endif // !BUILDFLAG(IS_ANDROID)
bool SuppressDifferentOriginSubframeJSDialogs(
content::BrowserContext* browser_context) override;
std::unique_ptr<content::AnchorElementPreconnectDelegate>
CreateAnchorElementPreconnectDelegate(
content::RenderFrameHost& render_frame_host) override;
std::unique_ptr<content::SpeculationHostDelegate>
CreateSpeculationHostDelegate(
content::RenderFrameHost& render_frame_host) override;
std::unique_ptr<content::PrefetchServiceDelegate>
CreatePrefetchServiceDelegate(
content::BrowserContext* browser_context) override;
std::unique_ptr<content::PrerenderWebContentsDelegate>
CreatePrerenderWebContentsDelegate() override;
void OnWebContentsCreated(content::WebContents* web_contents) override;
bool IsFindInPageDisabledForOrigin(const url::Origin& origin) override;
bool WillProvidePublicFirstPartySets() override;
bool ShouldPreconnectNavigation(
content::RenderFrameHost* render_frame_host) override;
bool ShouldDisableOriginAgentClusterDefault(
content::BrowserContext* browser_context) override;
content::mojom::AlternativeErrorPageOverrideInfoPtr
GetAlternativeErrorPageOverrideInfo(
const GURL& url,
content::RenderFrameHost* render_frame_host,
content::BrowserContext* browser_context,
int32_t error_code) override;
void OnSharedStorageWorkletHostCreated(
content::RenderFrameHost* rfh) override;
void OnSharedStorageSelectURLCalled(
content::RenderFrameHost* main_rfh) override;
bool ShouldSendOutermostOriginToRenderer(
const url::Origin& outermost_origin) override;
bool IsFileSystemURLNavigationAllowed(
content::BrowserContext* browser_context,
const GURL& url) override;
bool AreIsolatedWebAppsEnabled(
content::BrowserContext* browser_context) override;
bool IsThirdPartyStoragePartitioningAllowed(
content::BrowserContext* browser_context,
const url::Origin& top_level_origin) override;
bool AreDeprecatedAutomaticBeaconCredentialsAllowed(
content::BrowserContext* browser_context,
const GURL& destination_url,
const url::Origin& top_frame_origin) override;
bool IsTransientActivationRequiredForShowFileOrDirectoryPicker(
content::WebContents* web_contents) override;
bool IsTransientActivationRequiredForHtmlFullscreen(
content::RenderFrameHost* render_frame_host) override;
bool ShouldUseFirstPartyStorageKey(const url::Origin& origin) override;
std::unique_ptr<content::ResponsivenessCalculatorDelegate>
CreateResponsivenessCalculatorDelegate() override;
bool CanBackForwardCachedPageReceiveCookieChanges(
content::BrowserContext& browser_context,
const GURL& url,
const net::SiteForCookies& site_for_cookies,
const std::optional<url::Origin>& top_frame_origin,
const net::CookieSettingOverrides overrides) override;
void GetCloudIdentifiers(
const storage::FileSystemURL& url,
content::FileSystemAccessPermissionContext::HandleType handle_type,
GetCloudIdentifiersCallback callback) override;
bool ShouldAllowBackForwardCacheForCacheControlNoStorePage(
content::BrowserContext* browser_context) override;
void SetIsMinimalMode(bool minimal) override;
bool UseOutermostMainFrameOrEmbedderForSubCaptureTargets() const override;
#if !BUILDFLAG(IS_ANDROID)
void BindVideoEffectsManager(
const std::string& device_id,
content::BrowserContext* browser_context,
mojo::PendingReceiver<media::mojom::VideoEffectsManager>
video_effects_manager) override;
void BindVideoEffectsProcessor(
const std::string& device_id,
content::BrowserContext* browser_context,
mojo::PendingReceiver<video_effects::mojom::VideoEffectsProcessor>
video_effects_processor) override;
#endif // !BUILDFLAG(IS_ANDROID)
void PreferenceRankAudioDeviceInfos(
content::BrowserContext* browser_context,
blink::WebMediaDeviceInfoArray& infos) override;
void PreferenceRankVideoDeviceInfos(
content::BrowserContext* browser_context,
blink::WebMediaDeviceInfoArray& infos) override;
network::mojom::IpProtectionProxyBypassPolicy
GetIpProtectionProxyBypassPolicy() override;
void MaybePrewarmHttpDiskCache(content::BrowserContext& browser_context,
const GURL& navigation_url) override;
#if BUILDFLAG(IS_CHROMEOS)
void NotifyMultiCaptureStateChanged(
content::GlobalRenderFrameHostId capturer_rfh_id,
const std::string& label,
MultiCaptureChanged state) override;
#endif // BUILDFLAG(IS_CHROMEOS)
std::unique_ptr<content::DipsDelegate> CreateDipsDelegate() override;
bool ShouldSuppressAXLoadComplete(content::RenderFrameHost* rfh) override;
void BindModelManager(
content::RenderFrameHost* rfh,
mojo::PendingReceiver<blink::mojom::ModelManager> receiver) override;
protected:
static bool HandleWebUI(GURL* url, content::BrowserContext* browser_context);
static bool HandleWebUIReverse(GURL* url,
content::BrowserContext* browser_context);
virtual const ui::NativeTheme* GetWebTheme() const; // For testing.
// Used by subclasses (e.g. implemented by downstream embedders) to add
// their own extra part objects.
// TODO: This should receive unique_ptr<ChromeContentBrowserClientParts>.
void AddExtraPart(ChromeContentBrowserClientParts* part);
// Exposed for tests to perform dependency injection.
virtual std::unique_ptr<HttpAuthCoordinator> CreateHttpAuthCoordinator();
private:
friend class DisableWebRtcEncryptionFlagTest;
friend class InProcessBrowserTest;
FRIEND_TEST_ALL_PREFIXES(ChromeSiteIsolationPolicyTest,
IsolatedOriginsContainChromeOrigins);
// Initializes `network_contexts_parent_directory_` and
// `safe_browsing_service_` on the UI thread.
void InitOnUIThread();
// Copies disable WebRTC encryption switch depending on the channel.
static void MaybeCopyDisableWebRtcEncryptionSwitch(
base::CommandLine* to_command_line,
const base::CommandLine& from_command_line,
version_info::Channel channel);
void FileSystemAccessed(
const GURL& url,
const std::vector<content::GlobalRenderFrameHostId>& render_frames,
base::OnceCallback<void(bool)> callback,
bool allow);
#if BUILDFLAG(ENABLE_EXTENSIONS)
void GuestPermissionRequestHelper(
const GURL& url,
const std::vector<content::GlobalRenderFrameHostId>& render_frames,
base::OnceCallback<void(bool)> callback,
bool allow);
#endif
// Returns the existing UrlCheckerDelegate object if it is already created.
// Otherwise, creates a new one and returns it. Updates the
// |allowlist_domains| in the UrlCheckerDelegate object before returning. It
// returns nullptr if |safe_browsing_enabled_for_profile| is false, because it
// should bypass safe browsing check when safe browsing is disabled. Set
// |should_check_on_sb_disabled| to true if you still want to perform safe
// browsing check when safe browsing is disabled(e.g. for enterprise real time
// URL check).
scoped_refptr<safe_browsing::UrlCheckerDelegate>
GetSafeBrowsingUrlCheckerDelegate(
bool safe_browsing_enabled_for_profile,
bool should_check_on_sb_disabled,
const std::vector<std::string>& allowlist_domains);
// Returns a RealTimeUrlLookupServiceBase object used for real time URL check.
// Returns an enterprise version if |is_enterprise_lookup_enabled| is true.
// Returns a consumer version if |is_enterprise_lookup_enabled| is false and
// |is_consumer_lookup_enabled| is true. Returns nullptr if both are false.
safe_browsing::RealTimeUrlLookupServiceBase* GetUrlLookupService(
content::BrowserContext* browser_context,
bool is_enterprise_lookup_enabled,
bool is_consumer_lookup_enabled);
// Returns an AsyncCheckTracker object used for holding URL checkers for async
// Safe Browsing check. It may return nullptr if the WebContents is null,
// the ui_manager is null, the real-time check is not enabled, or the loader
// is for no-state prefetch or frame prerender.
safe_browsing::AsyncCheckTracker* GetAsyncCheckTracker(
const base::RepeatingCallback<content::WebContents*()>& wc_getter,
bool is_enterprise_lookup_enabled,
bool is_consumer_lookup_enabled,
safe_browsing::hash_realtime_utils::HashRealTimeSelection
hash_realtime_selection,
int frame_tree_node_id);
// Try to upload an enterprise legacy tech event to the enterprise management
// server for admins.
void ReportLegacyTechEvent(
content::RenderFrameHost* render_frame_host,
const std::string type,
const GURL& url,
const GURL& frame_url,
const std::string& filename,
uint64_t line,
uint64_t column,
std::optional<content::LegacyTechCookieIssueDetails> cookie_issue_details)
override;
void SafeBrowsingWebApiHandshakeChecked(
std::unique_ptr<safe_browsing::WebApiHandshakeChecker> checker,
int process_id,
int frame_routing_id,
const GURL& url,
const url::Origin& initiator_origin,
mojo::PendingRemote<network::mojom::WebTransportHandshakeClient>
handshake_client,
WillCreateWebTransportCallback callback,
safe_browsing::WebApiHandshakeChecker::CheckResult result);
void MaybeInterceptWebTransport(
int process_id,
int frame_routing_id,
const GURL& url,
const url::Origin& initiator_origin,
mojo::PendingRemote<network::mojom::WebTransportHandshakeClient>
handshake_client,
WillCreateWebTransportCallback callback);
#if BUILDFLAG(SAFE_BROWSING_AVAILABLE)
std::unique_ptr<blink::URLLoaderThrottle>
MaybeCreateSafeBrowsingURLLoaderThrottle(
const network::ResourceRequest& request,
content::BrowserContext* browser_context,
const base::RepeatingCallback<content::WebContents*()>& wc_getter,
int frame_tree_node_id,
std::optional<int64_t> navigation_id,
Profile* profile);
#endif
#if !BUILDFLAG(IS_ANDROID)
void OnKeepaliveTimerFired(
std::unique_ptr<ScopedKeepAlive> keep_alive_handle);
#endif
// True if the Gaia origin should be isolated in a dedicated process.
static bool DoesGaiaOriginRequireDedicatedProcess();
// Vector of additional ChromeContentBrowserClientParts.
// Parts are deleted in the reverse order they are added.
std::vector<std::unique_ptr<ChromeContentBrowserClientParts>> extra_parts_;
scoped_refptr<safe_browsing::SafeBrowsingService> safe_browsing_service_;
scoped_refptr<safe_browsing::UrlCheckerDelegate>
safe_browsing_url_checker_delegate_;
StartupData startup_data_;
#if !BUILDFLAG(IS_ANDROID)
std::unique_ptr<ChromeSerialDelegate> serial_delegate_;
std::unique_ptr<ChromeHidDelegate> hid_delegate_;
std::unique_ptr<ChromeDirectSocketsDelegate> direct_sockets_delegate_;
std::unique_ptr<ChromeWebAuthenticationDelegate> web_authentication_delegate_;
#endif
std::unique_ptr<permissions::BluetoothDelegateImpl> bluetooth_delegate_;
std::unique_ptr<ChromeUsbDelegate> usb_delegate_;
std::unique_ptr<ChromePrivateNetworkDeviceDelegate>
private_network_device_delegate_;
#if BUILDFLAG(IS_CHROMEOS)
std::unique_ptr<content::SmartCardDelegate> smart_card_delegate_;
#endif // BUILDFLAG(IS_CHROMEOS)
#if BUILDFLAG(ENABLE_VR)
std::unique_ptr<vr::ChromeXrIntegrationClient> xr_integration_client_;
#endif
// Returned from GetNetworkContextsParentDirectory() but created on the UI
// thread because it needs to access the Local State prefs.
std::vector<base::FilePath> network_contexts_parent_directory_;
// Handles web-browser implementation of the http auth feature.
std::unique_ptr<HttpAuthCoordinator> http_auth_coordinator_;
#if !BUILDFLAG(IS_ANDROID)
uint64_t num_keepalive_requests_ = 0;
base::OneShotTimer keepalive_timer_;
base::TimeTicks keepalive_deadline_;
#endif
#if BUILDFLAG(IS_MAC)
std::string GetChildProcessSuffix(int child_flags) override;
#endif // BUILDFLAG(IS_MAC)
// Tracks whether the browser was started in "minimal" mode (as opposed to
// full browser mode), where most subsystems are not initialized.
bool is_minimal_mode_ = false;
base::WeakPtrFactory<ChromeContentBrowserClient> weak_factory_{this};
};
#endif // CHROME_BROWSER_CHROME_CONTENT_BROWSER_CLIENT_H_