blob: 09ddfbd80af18eae46d39e7386e3b8bea2fb02e8 [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_SHELL_BROWSER_SHELL_CONTENT_BROWSER_CLIENT_H_
#define CONTENT_SHELL_BROWSER_SHELL_CONTENT_BROWSER_CLIENT_H_
#include <memory>
#include <string>
#include "base/files/file_path.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "content/public/browser/content_browser_client.h"
#include "content/shell/browser/shell_speech_recognition_manager_delegate.h"
#include "services/network/public/cpp/permissions_policy/permissions_policy_declaration.h"
#include "services/network/public/mojom/network_context.mojom-forward.h"
class PrefService;
#if BUILDFLAG(IS_IOS)
namespace permissions {
class BluetoothDelegateImpl;
}
#endif
namespace content {
class NavigationThrottleRegistry;
class ShellBrowserContext;
class ShellBrowserMainParts;
std::string GetShellLanguage();
blink::UserAgentMetadata GetShellUserAgentMetadata();
class ShellContentBrowserClient : public ContentBrowserClient {
public:
// Gets the current instance.
static ShellContentBrowserClient* Get();
ShellContentBrowserClient();
~ShellContentBrowserClient() override;
// The value supplied here is set when creating the NetworkContext.
// Specifically
// network::mojom::NetworkContext::allow_any_cors_exempt_header_for_browser.
static void set_allow_any_cors_exempt_header_for_browser(bool value) {
allow_any_cors_exempt_header_for_browser_ = value;
}
// ContentBrowserClient overrides.
std::unique_ptr<BrowserMainParts> CreateBrowserMainParts(
bool is_integration_test) override;
bool IsHandledURL(const GURL& url) override;
bool HasCustomSchemeHandler(content::BrowserContext* browser_context,
const std::string& scheme) override;
std::vector<std::unique_ptr<blink::URLLoaderThrottle>>
CreateURLLoaderThrottles(
const network::ResourceRequest& request,
BrowserContext* browser_context,
const base::RepeatingCallback<WebContents*()>& wc_getter,
NavigationUIData* navigation_ui_data,
FrameTreeNodeId frame_tree_node_id,
std::optional<int64_t> navigation_id) override;
bool AreIsolatedWebAppsEnabled(BrowserContext* browser_context) override;
void AppendExtraCommandLineSwitches(base::CommandLine* command_line,
int child_process_id) override;
std::string GetAcceptLangs(BrowserContext* context) override;
std::string GetDefaultDownloadName() override;
std::unique_ptr<WebContentsViewDelegate> GetWebContentsViewDelegate(
WebContents* web_contents) override;
bool IsIsolatedContextAllowedForUrl(BrowserContext* browser_context,
const GURL& lock_url) 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,
bool* out_block_is_site_setting_specific) override;
bool IsSharedStorageSelectURLAllowed(
content::BrowserContext* browser_context,
const url::Origin& top_frame_origin,
const url::Origin& accessing_origin,
std::string* out_debug_message,
bool* out_block_is_site_setting_specific) override;
bool IsFencedStorageReadAllowed(content::BrowserContext* browser_context,
content::RenderFrameHost* rfh,
const url::Origin& top_frame_origin,
const url::Origin& accessing_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;
GeneratedCodeCacheSettings GetGeneratedCodeCacheSettings(
content::BrowserContext* context) override;
base::OnceClosure SelectClientCertificate(
BrowserContext* browser_context,
int process_id,
WebContents* web_contents,
net::SSLCertRequestInfo* cert_request_info,
net::ClientCertIdentityList client_certs,
std::unique_ptr<ClientCertificateDelegate> delegate) override;
SpeechRecognitionManagerDelegate* CreateSpeechRecognitionManagerDelegate()
override;
void OverrideWebPreferences(WebContents* web_contents,
SiteInstance& main_frame_site,
blink::web_pref::WebPreferences* prefs) override;
std::unique_ptr<content::DevToolsManagerDelegate>
CreateDevToolsManagerDelegate() override;
void ExposeInterfacesToRenderer(
service_manager::BinderRegistry* registry,
blink::AssociatedInterfaceRegistry* associated_registry,
RenderProcessHost* render_process_host) override;
void ExposeInterfacesToChild(
mojo::BinderMapWithContext<content::BrowserChildProcessHost*>* map)
override;
mojo::Remote<::media::mojom::MediaService> RunSecondaryMediaService()
override;
void RegisterBrowserInterfaceBindersForFrame(
RenderFrameHost* render_frame_host,
mojo::BinderMapWithContext<RenderFrameHost*>* map) override;
void OpenURL(SiteInstance* site_instance,
const OpenURLParams& params,
base::OnceCallback<void(WebContents*)> callback) override;
void CreateThrottlesForNavigation(
NavigationThrottleRegistry& registry) override;
std::unique_ptr<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_navigation,
bool is_request_for_navigation,
const GURL& url,
scoped_refptr<net::HttpResponseHeaders> response_headers,
bool first_auth_attempt,
GuestPageHolder* guest,
LoginDelegate::LoginAuthRequiredCallback auth_required_callback) override;
base::Value::Dict GetNetLogConstants() override;
base::FilePath GetSandboxedStorageServiceDataDirectory() override;
base::FilePath GetFirstPartySetsDirectory() override;
std::optional<base::FilePath> GetLocalTracesDirectory() override;
std::string GetUserAgent() override;
blink::UserAgentMetadata GetUserAgentMetadata() override;
void OverrideURLLoaderFactoryParams(
BrowserContext* browser_context,
const url::Origin& origin,
bool is_for_isolated_world,
bool is_for_service_worker,
network::mojom::URLLoaderFactoryParams* factory_params) override;
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
void GetAdditionalMappedFilesForChildProcess(
const base::CommandLine& command_line,
int child_process_id,
content::PosixFileDescriptorInfo* mappings) override;
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) ||
// BUILDFLAG(IS_ANDROID)
device::GeolocationSystemPermissionManager*
GetGeolocationSystemPermissionManager() override;
void OnNetworkServiceCreated(
network::mojom::NetworkService* network_service) override;
void ConfigureNetworkContextParams(
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;
#if BUILDFLAG(IS_IOS)
BluetoothDelegate* GetBluetoothDelegate() override;
#endif
void BindBrowserControlInterface(mojo::ScopedMessagePipeHandle pipe) override;
void GetHyphenationDictionary(
base::OnceCallback<void(const base::FilePath&)>) override;
bool HasErrorPage(int http_status_code) override;
void OnWebContentsCreated(WebContents* web_contents) override;
// Turns on features via permissions policy for Isolated App
// Web Platform Tests.
std::optional<network::ParsedPermissionsPolicy>
GetPermissionsPolicyForIsolatedWebApp(WebContents* web_contents,
const url::Origin& app_origin) override;
void CreateFeatureListAndFieldTrials();
ShellBrowserContext* browser_context();
ShellBrowserContext* off_the_record_browser_context();
ShellBrowserMainParts* shell_browser_main_parts();
// Used for content_browsertests.
using SelectClientCertificateCallback = base::OnceCallback<base::OnceClosure(
content::WebContents* web_contents,
net::SSLCertRequestInfo* cert_request_info,
net::ClientCertIdentityList client_certs,
std::unique_ptr<content::ClientCertificateDelegate> delegate)>;
void set_select_client_certificate_callback(
SelectClientCertificateCallback select_client_certificate_callback) {
select_client_certificate_callback_ =
std::move(select_client_certificate_callback);
}
void set_login_request_callback(
base::OnceCallback<void(bool is_primary_main_frame_navigation,
bool is_navigation)> login_request_callback) {
login_request_callback_ = std::move(login_request_callback);
}
void set_url_loader_factory_params_callback(
base::RepeatingCallback<void(
const network::mojom::URLLoaderFactoryParams*,
const url::Origin&,
bool is_for_isolated_world,
bool is_for_service_worker)> url_loader_factory_params_callback) {
url_loader_factory_params_callback_ =
std::move(url_loader_factory_params_callback);
}
void set_create_throttles_for_navigation_callback(
base::RepeatingCallback<void(NavigationThrottleRegistry&)>
create_throttles_for_navigation_callback) {
create_throttles_for_navigation_callback_ =
create_throttles_for_navigation_callback;
}
#if BUILDFLAG(IS_IOS)
bool IsJITEnabled();
void SetJITEnabled(bool value);
#endif
protected:
// Call this if CreateBrowserMainParts() is overridden in a subclass.
void set_browser_main_parts(ShellBrowserMainParts* parts);
// Used by ConfigureNetworkContextParams(), and can be overridden to change
// the parameters used there.
virtual void ConfigureNetworkContextParamsForShell(
BrowserContext* context,
network::mojom::NetworkContextParams* context_params,
cert_verifier::mojom::CertVerifierCreationParams*
cert_verifier_creation_params);
private:
// For GetShellContentBrowserClientInstances().
friend class ContentBrowserTestContentBrowserClient;
// Needed so that content_shell can use fieldtrial_testing_config.
void SetUpFieldTrials();
// Returns the list of ShellContentBrowserClients ordered by time created.
// If a test overrides ContentBrowserClient, this list will have more than
// one item.
static const std::vector<ShellContentBrowserClient*>&
GetShellContentBrowserClientInstances();
static bool allow_any_cors_exempt_header_for_browser_;
SelectClientCertificateCallback select_client_certificate_callback_;
base::OnceCallback<void(bool is_primary_main_frame_navigation,
bool is_navigation)>
login_request_callback_;
base::RepeatingCallback<void(const network::mojom::URLLoaderFactoryParams*,
const url::Origin&,
bool is_for_isolated_world,
bool is_for_service_worker)>
url_loader_factory_params_callback_;
base::RepeatingCallback<void(NavigationThrottleRegistry&)>
create_throttles_for_navigation_callback_;
#if BUILDFLAG(IS_IOS)
std::unique_ptr<permissions::BluetoothDelegateImpl> bluetooth_delegate_;
#endif
// NOTE: Tests may install a second ShellContentBrowserClient that becomes
// the ContentBrowserClient used by content. This has subtle implications
// for any state (variables) that are needed by ShellContentBrowserClient.
// Any state that needs to be the same across all ShellContentBrowserClients
// should be placed in SharedState (declared in
// shell_content_browser_client.cc). Any state that is specific to a
// particular instance should be placed here.
};
// The delay for sending reports when running with --run-web-tests
constexpr base::TimeDelta kReportingDeliveryIntervalTimeForWebTests =
base::Milliseconds(100);
} // namespace content
#endif // CONTENT_SHELL_BROWSER_SHELL_CONTENT_BROWSER_CLIENT_H_