electron_browser_client.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. // Copyright (c) 2013 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #ifndef ELECTRON_SHELL_BROWSER_ELECTRON_BROWSER_CLIENT_H_
  5. #define ELECTRON_SHELL_BROWSER_ELECTRON_BROWSER_CLIENT_H_
  6. #include <memory>
  7. #include <optional>
  8. #include <string>
  9. #include <string_view>
  10. #include <vector>
  11. #include "base/containers/flat_map.h"
  12. #include "base/containers/flat_set.h"
  13. #include "base/memory/raw_ptr.h"
  14. #include "base/synchronization/lock.h"
  15. #include "content/public/browser/content_browser_client.h"
  16. #include "content/public/browser/render_process_host_observer.h"
  17. #include "content/public/browser/web_contents.h"
  18. #include "electron/buildflags/buildflags.h"
  19. #include "net/ssl/client_cert_identity.h"
  20. #include "services/metrics/public/cpp/ukm_source_id.h"
  21. #include "third_party/blink/public/mojom/badging/badging.mojom-forward.h"
  22. namespace base {
  23. class FilePath;
  24. } // namespace base
  25. namespace content {
  26. class ClientCertificateDelegate;
  27. class PlatformNotificationService;
  28. class QuotaPermissionContext;
  29. } // namespace content
  30. namespace net {
  31. class SSLCertRequestInfo;
  32. }
  33. namespace electron {
  34. class ElectronBluetoothDelegate;
  35. class ElectronBrowserMainParts;
  36. class ElectronHidDelegate;
  37. class ElectronSerialDelegate;
  38. class ElectronUsbDelegate;
  39. class ElectronWebAuthenticationDelegate;
  40. class NotificationPresenter;
  41. class PlatformNotificationService;
  42. class ElectronBrowserClient : public content::ContentBrowserClient,
  43. private content::RenderProcessHostObserver {
  44. public:
  45. static ElectronBrowserClient* Get();
  46. static void SetApplicationLocale(const std::string& locale);
  47. ElectronBrowserClient();
  48. ~ElectronBrowserClient() override;
  49. // disable copy
  50. ElectronBrowserClient(const ElectronBrowserClient&) = delete;
  51. ElectronBrowserClient& operator=(const ElectronBrowserClient&) = delete;
  52. using Delegate = content::ContentBrowserClient;
  53. void set_delegate(Delegate* delegate) { delegate_ = delegate; }
  54. // Returns the WebContents for pending render processes.
  55. content::WebContents* GetWebContentsFromProcessID(int process_id);
  56. NotificationPresenter* GetNotificationPresenter();
  57. void WebNotificationAllowed(content::RenderFrameHost* rfh,
  58. base::OnceCallback<void(bool, bool)> callback);
  59. // content::NavigatorDelegate
  60. std::vector<std::unique_ptr<content::NavigationThrottle>>
  61. CreateThrottlesForNavigation(content::NavigationHandle* handle) override;
  62. // content::ContentBrowserClient:
  63. std::string GetApplicationLocale() override;
  64. bool ShouldEnableStrictSiteIsolation() override;
  65. void BindHostReceiverForRenderer(
  66. content::RenderProcessHost* render_process_host,
  67. mojo::GenericPendingReceiver receiver) override;
  68. void ExposeInterfacesToRenderer(
  69. service_manager::BinderRegistry* registry,
  70. blink::AssociatedInterfaceRegistry* associated_registry,
  71. content::RenderProcessHost* render_process_host) override;
  72. void RegisterBrowserInterfaceBindersForFrame(
  73. content::RenderFrameHost* render_frame_host,
  74. mojo::BinderMapWithContext<content::RenderFrameHost*>* map) override;
  75. void RegisterBrowserInterfaceBindersForServiceWorker(
  76. content::BrowserContext* browser_context,
  77. const content::ServiceWorkerVersionBaseInfo& service_worker_version_info,
  78. mojo::BinderMapWithContext<const content::ServiceWorkerVersionBaseInfo&>*
  79. map) override;
  80. #if BUILDFLAG(IS_LINUX)
  81. void GetAdditionalMappedFilesForChildProcess(
  82. const base::CommandLine& command_line,
  83. int child_process_id,
  84. content::PosixFileDescriptorInfo* mappings) override;
  85. #endif
  86. std::string GetUserAgent() override;
  87. void SetUserAgent(const std::string& user_agent);
  88. blink::UserAgentMetadata GetUserAgentMetadata() override;
  89. content::SerialDelegate* GetSerialDelegate() override;
  90. content::BluetoothDelegate* GetBluetoothDelegate() override;
  91. content::HidDelegate* GetHidDelegate() override;
  92. content::UsbDelegate* GetUsbDelegate() override;
  93. content::WebAuthenticationDelegate* GetWebAuthenticationDelegate() override;
  94. #if BUILDFLAG(IS_MAC)
  95. device::GeolocationSystemPermissionManager*
  96. GetGeolocationSystemPermissionManager() override;
  97. #endif
  98. content::PlatformNotificationService* GetPlatformNotificationService();
  99. protected:
  100. void RenderProcessWillLaunch(content::RenderProcessHost* host) override;
  101. content::SpeechRecognitionManagerDelegate*
  102. CreateSpeechRecognitionManagerDelegate() override;
  103. content::TtsPlatform* GetTtsPlatform() override;
  104. void OverrideWebkitPrefs(content::WebContents* web_contents,
  105. blink::web_pref::WebPreferences* prefs) override;
  106. void RegisterPendingSiteInstance(
  107. content::RenderFrameHost* render_frame_host,
  108. content::SiteInstance* pending_site_instance) override;
  109. void AppendExtraCommandLineSwitches(base::CommandLine* command_line,
  110. int child_process_id) override;
  111. std::string GetGeolocationApiKey() override;
  112. content::GeneratedCodeCacheSettings GetGeneratedCodeCacheSettings(
  113. content::BrowserContext* context) override;
  114. void AllowCertificateError(
  115. content::WebContents* web_contents,
  116. int cert_error,
  117. const net::SSLInfo& ssl_info,
  118. const GURL& request_url,
  119. bool is_main_frame_request,
  120. bool strict_enforcement,
  121. base::OnceCallback<void(content::CertificateRequestResultType)> callback)
  122. override;
  123. base::OnceClosure SelectClientCertificate(
  124. content::BrowserContext* browser_context,
  125. int process_id,
  126. content::WebContents* web_contents,
  127. net::SSLCertRequestInfo* cert_request_info,
  128. net::ClientCertIdentityList client_certs,
  129. std::unique_ptr<content::ClientCertificateDelegate> delegate) override;
  130. bool CanCreateWindow(content::RenderFrameHost* opener,
  131. const GURL& opener_url,
  132. const GURL& opener_top_level_frame_url,
  133. const url::Origin& source_origin,
  134. content::mojom::WindowContainerType container_type,
  135. const GURL& target_url,
  136. const content::Referrer& referrer,
  137. const std::string& frame_name,
  138. WindowOpenDisposition disposition,
  139. const blink::mojom::WindowFeatures& features,
  140. const std::string& raw_features,
  141. const scoped_refptr<network::ResourceRequestBody>& body,
  142. bool user_gesture,
  143. bool opener_suppressed,
  144. bool* no_javascript_access) override;
  145. std::unique_ptr<content::VideoOverlayWindow>
  146. CreateWindowForVideoPictureInPicture(
  147. content::VideoPictureInPictureWindowController* controller) override;
  148. void GetAdditionalAllowedSchemesForFileSystem(
  149. std::vector<std::string>* additional_schemes) override;
  150. void GetAdditionalWebUISchemes(
  151. std::vector<std::string>* additional_schemes) override;
  152. std::unique_ptr<net::ClientCertStore> CreateClientCertStore(
  153. content::BrowserContext* browser_context) override;
  154. std::unique_ptr<device::LocationProvider> OverrideSystemLocationProvider()
  155. override;
  156. void ConfigureNetworkContextParams(
  157. content::BrowserContext* browser_context,
  158. bool in_memory,
  159. const base::FilePath& relative_partition_path,
  160. network::mojom::NetworkContextParams* network_context_params,
  161. cert_verifier::mojom::CertVerifierCreationParams*
  162. cert_verifier_creation_params) override;
  163. network::mojom::NetworkContext* GetSystemNetworkContext() override;
  164. content::MediaObserver* GetMediaObserver() override;
  165. std::unique_ptr<content::DevToolsManagerDelegate>
  166. CreateDevToolsManagerDelegate() override;
  167. std::unique_ptr<content::BrowserMainParts> CreateBrowserMainParts(
  168. bool /* is_integration_test */) override;
  169. base::FilePath GetDefaultDownloadDirectory() override;
  170. scoped_refptr<network::SharedURLLoaderFactory>
  171. GetSystemSharedURLLoaderFactory() override;
  172. void OnNetworkServiceCreated(
  173. network::mojom::NetworkService* network_service) override;
  174. std::vector<base::FilePath> GetNetworkContextsParentDirectory() override;
  175. std::string GetProduct() override;
  176. mojo::PendingRemote<network::mojom::URLLoaderFactory>
  177. CreateNonNetworkNavigationURLLoaderFactory(const std::string& scheme,
  178. int frame_tree_node_id) override;
  179. void RegisterNonNetworkWorkerMainResourceURLLoaderFactories(
  180. content::BrowserContext* browser_context,
  181. NonNetworkURLLoaderFactoryMap* factories) override;
  182. void RegisterNonNetworkSubresourceURLLoaderFactories(
  183. int render_process_id,
  184. int render_frame_id,
  185. const std::optional<url::Origin>& request_initiator_origin,
  186. NonNetworkURLLoaderFactoryMap* factories) override;
  187. void RegisterNonNetworkServiceWorkerUpdateURLLoaderFactories(
  188. content::BrowserContext* browser_context,
  189. NonNetworkURLLoaderFactoryMap* factories) override;
  190. void CreateWebSocket(
  191. content::RenderFrameHost* frame,
  192. WebSocketFactory factory,
  193. const GURL& url,
  194. const net::SiteForCookies& site_for_cookies,
  195. const std::optional<std::string>& user_agent,
  196. mojo::PendingRemote<network::mojom::WebSocketHandshakeClient>
  197. handshake_client) override;
  198. bool WillInterceptWebSocket(content::RenderFrameHost*) override;
  199. void WillCreateURLLoaderFactory(
  200. content::BrowserContext* browser_context,
  201. content::RenderFrameHost* frame,
  202. int render_process_id,
  203. URLLoaderFactoryType type,
  204. const url::Origin& request_initiator,
  205. const net::IsolationInfo& isolation_info,
  206. std::optional<int64_t> navigation_id,
  207. ukm::SourceIdObj ukm_source_id,
  208. network::URLLoaderFactoryBuilder& factory_builder,
  209. mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
  210. header_client,
  211. bool* bypass_redirect_checks,
  212. bool* disable_secure_dns,
  213. network::mojom::URLLoaderFactoryOverridePtr* factory_override,
  214. scoped_refptr<base::SequencedTaskRunner> navigation_response_task_runner)
  215. override;
  216. std::vector<std::unique_ptr<content::URLLoaderRequestInterceptor>>
  217. WillCreateURLLoaderRequestInterceptors(
  218. content::NavigationUIData* navigation_ui_data,
  219. int frame_tree_node_id,
  220. int64_t navigation_id,
  221. bool force_no_https_upgrade,
  222. scoped_refptr<base::SequencedTaskRunner> navigation_response_task_runner)
  223. override;
  224. bool ShouldTreatURLSchemeAsFirstPartyWhenTopLevel(
  225. std::string_view scheme,
  226. bool is_embedded_origin_secure) override;
  227. void OverrideURLLoaderFactoryParams(
  228. content::BrowserContext* browser_context,
  229. const url::Origin& origin,
  230. bool is_for_isolated_world,
  231. network::mojom::URLLoaderFactoryParams* factory_params) override;
  232. void RegisterAssociatedInterfaceBindersForRenderFrameHost(
  233. content::RenderFrameHost& render_frame_host,
  234. blink::AssociatedInterfaceRegistry& associated_registry) override;
  235. void RegisterAssociatedInterfaceBindersForServiceWorker(
  236. const content::ServiceWorkerVersionBaseInfo& service_worker_version_info,
  237. blink::AssociatedInterfaceRegistry& associated_registry) override;
  238. bool HandleExternalProtocol(
  239. const GURL& url,
  240. content::WebContents::Getter web_contents_getter,
  241. int frame_tree_node_id,
  242. content::NavigationUIData* navigation_data,
  243. bool is_primary_main_frame,
  244. bool is_in_fenced_frame_tree,
  245. network::mojom::WebSandboxFlags sandbox_flags,
  246. ui::PageTransition page_transition,
  247. bool has_user_gesture,
  248. const std::optional<url::Origin>& initiating_origin,
  249. content::RenderFrameHost* initiator_document,
  250. mojo::PendingRemote<network::mojom::URLLoaderFactory>* out_factory)
  251. override;
  252. std::unique_ptr<content::LoginDelegate> CreateLoginDelegate(
  253. const net::AuthChallengeInfo& auth_info,
  254. content::WebContents* web_contents,
  255. content::BrowserContext* browser_context,
  256. const content::GlobalRequestID& request_id,
  257. bool is_main_frame,
  258. const GURL& url,
  259. scoped_refptr<net::HttpResponseHeaders> response_headers,
  260. bool first_auth_attempt,
  261. LoginAuthRequiredCallback auth_required_callback) override;
  262. void SiteInstanceGotProcessAndSite(
  263. content::SiteInstance* site_instance) override;
  264. std::vector<std::unique_ptr<blink::URLLoaderThrottle>>
  265. CreateURLLoaderThrottles(
  266. const network::ResourceRequest& request,
  267. content::BrowserContext* browser_context,
  268. const base::RepeatingCallback<content::WebContents*()>& wc_getter,
  269. content::NavigationUIData* navigation_ui_data,
  270. int frame_tree_node_id,
  271. std::optional<int64_t> navigation_id) override;
  272. base::flat_set<std::string> GetPluginMimeTypesWithExternalHandlers(
  273. content::BrowserContext* browser_context) override;
  274. bool IsSuitableHost(content::RenderProcessHost* process_host,
  275. const GURL& site_url) override;
  276. bool ShouldUseProcessPerSite(content::BrowserContext* browser_context,
  277. const GURL& effective_url) override;
  278. void GetMediaDeviceIDSalt(
  279. content::RenderFrameHost* rfh,
  280. const net::SiteForCookies& site_for_cookies,
  281. const blink::StorageKey& storage_key,
  282. base::OnceCallback<void(bool, const std::string&)> callback) override;
  283. base::FilePath GetLoggingFileName(const base::CommandLine& cmd_line) override;
  284. // content::RenderProcessHostObserver:
  285. void RenderProcessHostDestroyed(content::RenderProcessHost* host) override;
  286. void RenderProcessReady(content::RenderProcessHost* host) override;
  287. void RenderProcessExited(
  288. content::RenderProcessHost* host,
  289. const content::ChildProcessTerminationInfo& info) override;
  290. private:
  291. content::SiteInstance* GetSiteInstanceFromAffinity(
  292. content::BrowserContext* browser_context,
  293. const GURL& url,
  294. content::RenderFrameHost* rfh) const;
  295. bool IsRendererSubFrame(int process_id) const;
  296. // pending_render_process => web contents.
  297. base::flat_map<int, content::WebContents*> pending_processes_;
  298. base::flat_set<int> renderer_is_subframe_;
  299. std::unique_ptr<PlatformNotificationService> notification_service_;
  300. std::unique_ptr<NotificationPresenter> notification_presenter_;
  301. raw_ptr<Delegate> delegate_ = nullptr;
  302. std::string user_agent_override_ = "";
  303. // Simple shared ID generator, used by ProxyingURLLoaderFactory and
  304. // ProxyingWebSocket classes.
  305. uint64_t next_id_ = 0;
  306. std::unique_ptr<ElectronSerialDelegate> serial_delegate_;
  307. std::unique_ptr<ElectronBluetoothDelegate> bluetooth_delegate_;
  308. std::unique_ptr<ElectronUsbDelegate> usb_delegate_;
  309. std::unique_ptr<ElectronHidDelegate> hid_delegate_;
  310. std::unique_ptr<ElectronWebAuthenticationDelegate>
  311. web_authentication_delegate_;
  312. };
  313. } // namespace electron
  314. #endif // ELECTRON_SHELL_BROWSER_ELECTRON_BROWSER_CLIENT_H_