electron_browser_client.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  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 SHELL_BROWSER_ELECTRON_BROWSER_CLIENT_H_
  5. #define SHELL_BROWSER_ELECTRON_BROWSER_CLIENT_H_
  6. #include <map>
  7. #include <memory>
  8. #include <set>
  9. #include <string>
  10. #include <vector>
  11. #include "base/files/file_path.h"
  12. #include "base/synchronization/lock.h"
  13. #include "content/public/browser/content_browser_client.h"
  14. #include "content/public/browser/render_process_host_observer.h"
  15. #include "content/public/browser/web_contents.h"
  16. #include "electron/buildflags/buildflags.h"
  17. #include "net/ssl/client_cert_identity.h"
  18. namespace content {
  19. class ClientCertificateDelegate;
  20. class QuotaPermissionContext;
  21. } // namespace content
  22. namespace net {
  23. class SSLCertRequestInfo;
  24. }
  25. namespace electron {
  26. class NotificationPresenter;
  27. class PlatformNotificationService;
  28. class ElectronBrowserClient : public content::ContentBrowserClient,
  29. public content::RenderProcessHostObserver {
  30. public:
  31. static ElectronBrowserClient* Get();
  32. static void SetApplicationLocale(const std::string& locale);
  33. ElectronBrowserClient();
  34. ~ElectronBrowserClient() override;
  35. using Delegate = content::ContentBrowserClient;
  36. void set_delegate(Delegate* delegate) { delegate_ = delegate; }
  37. // Returns the WebContents for pending render processes.
  38. content::WebContents* GetWebContentsFromProcessID(int process_id);
  39. // Don't force renderer process to restart for once.
  40. static void SuppressRendererProcessRestartForOnce();
  41. NotificationPresenter* GetNotificationPresenter();
  42. void WebNotificationAllowed(int render_process_id,
  43. base::OnceCallback<void(bool, bool)> callback);
  44. // content::NavigatorDelegate
  45. std::vector<std::unique_ptr<content::NavigationThrottle>>
  46. CreateThrottlesForNavigation(content::NavigationHandle* handle) override;
  47. // content::ContentBrowserClient:
  48. std::string GetApplicationLocale() override;
  49. base::FilePath GetFontLookupTableCacheDir() override;
  50. bool ShouldEnableStrictSiteIsolation() override;
  51. void BindHostReceiverForRenderer(
  52. content::RenderProcessHost* render_process_host,
  53. mojo::GenericPendingReceiver receiver) override;
  54. void RegisterBrowserInterfaceBindersForFrame(
  55. content::RenderFrameHost* render_frame_host,
  56. mojo::BinderMapWithContext<content::RenderFrameHost*>* map) override;
  57. #if defined(OS_LINUX)
  58. void GetAdditionalMappedFilesForChildProcess(
  59. const base::CommandLine& command_line,
  60. int child_process_id,
  61. content::PosixFileDescriptorInfo* mappings) override;
  62. #endif
  63. std::string GetUserAgent() override;
  64. void SetUserAgent(const std::string& user_agent);
  65. void SetCanUseCustomSiteInstance(bool should_disable);
  66. bool CanUseCustomSiteInstance() override;
  67. protected:
  68. void RenderProcessWillLaunch(content::RenderProcessHost* host) override;
  69. content::SpeechRecognitionManagerDelegate*
  70. CreateSpeechRecognitionManagerDelegate() override;
  71. content::TtsPlatform* GetTtsPlatform() override;
  72. void OverrideWebkitPrefs(content::RenderViewHost* render_view_host,
  73. blink::web_pref::WebPreferences* prefs) override;
  74. SiteInstanceForNavigationType ShouldOverrideSiteInstanceForNavigation(
  75. content::RenderFrameHost* current_rfh,
  76. content::RenderFrameHost* speculative_rfh,
  77. content::BrowserContext* browser_context,
  78. const GURL& url,
  79. bool has_navigation_started,
  80. bool has_request_started,
  81. content::SiteInstance** affinity_site_instance) const override;
  82. void RegisterPendingSiteInstance(
  83. content::RenderFrameHost* render_frame_host,
  84. content::SiteInstance* pending_site_instance) override;
  85. void AppendExtraCommandLineSwitches(base::CommandLine* command_line,
  86. int child_process_id) override;
  87. void DidCreatePpapiPlugin(content::BrowserPpapiHost* browser_host) override;
  88. std::string GetGeolocationApiKey() override;
  89. scoped_refptr<content::QuotaPermissionContext> CreateQuotaPermissionContext()
  90. override;
  91. content::GeneratedCodeCacheSettings GetGeneratedCodeCacheSettings(
  92. content::BrowserContext* context) override;
  93. void AllowCertificateError(
  94. content::WebContents* web_contents,
  95. int cert_error,
  96. const net::SSLInfo& ssl_info,
  97. const GURL& request_url,
  98. bool is_main_frame_request,
  99. bool strict_enforcement,
  100. base::OnceCallback<void(content::CertificateRequestResultType)> callback)
  101. override;
  102. base::OnceClosure SelectClientCertificate(
  103. content::WebContents* web_contents,
  104. net::SSLCertRequestInfo* cert_request_info,
  105. net::ClientCertIdentityList client_certs,
  106. std::unique_ptr<content::ClientCertificateDelegate> delegate) override;
  107. bool CanCreateWindow(content::RenderFrameHost* opener,
  108. const GURL& opener_url,
  109. const GURL& opener_top_level_frame_url,
  110. const url::Origin& source_origin,
  111. content::mojom::WindowContainerType container_type,
  112. const GURL& target_url,
  113. const content::Referrer& referrer,
  114. const std::string& frame_name,
  115. WindowOpenDisposition disposition,
  116. const blink::mojom::WindowFeatures& features,
  117. const std::string& raw_features,
  118. const scoped_refptr<network::ResourceRequestBody>& body,
  119. bool user_gesture,
  120. bool opener_suppressed,
  121. bool* no_javascript_access) override;
  122. #if BUILDFLAG(ENABLE_PICTURE_IN_PICTURE)
  123. std::unique_ptr<content::OverlayWindow> CreateWindowForPictureInPicture(
  124. content::PictureInPictureWindowController* controller) override;
  125. #endif
  126. void GetAdditionalAllowedSchemesForFileSystem(
  127. std::vector<std::string>* additional_schemes) override;
  128. void GetAdditionalWebUISchemes(
  129. std::vector<std::string>* additional_schemes) override;
  130. void SiteInstanceDeleting(content::SiteInstance* site_instance) override;
  131. std::unique_ptr<net::ClientCertStore> CreateClientCertStore(
  132. content::BrowserContext* browser_context) override;
  133. std::unique_ptr<device::LocationProvider> OverrideSystemLocationProvider()
  134. override;
  135. void ConfigureNetworkContextParams(
  136. content::BrowserContext* browser_context,
  137. bool in_memory,
  138. const base::FilePath& relative_partition_path,
  139. network::mojom::NetworkContextParams* network_context_params,
  140. network::mojom::CertVerifierCreationParams* cert_verifier_creation_params)
  141. override;
  142. network::mojom::NetworkContext* GetSystemNetworkContext() override;
  143. base::Optional<service_manager::Manifest> GetServiceManifestOverlay(
  144. base::StringPiece name) override;
  145. content::MediaObserver* GetMediaObserver() override;
  146. content::DevToolsManagerDelegate* GetDevToolsManagerDelegate() override;
  147. content::PlatformNotificationService* GetPlatformNotificationService(
  148. content::BrowserContext* browser_context) override;
  149. std::unique_ptr<content::BrowserMainParts> CreateBrowserMainParts(
  150. const content::MainFunctionParams&) override;
  151. base::FilePath GetDefaultDownloadDirectory() override;
  152. scoped_refptr<network::SharedURLLoaderFactory>
  153. GetSystemSharedURLLoaderFactory() override;
  154. void OnNetworkServiceCreated(
  155. network::mojom::NetworkService* network_service) override;
  156. std::vector<base::FilePath> GetNetworkContextsParentDirectory() override;
  157. std::string GetProduct() override;
  158. void RegisterNonNetworkNavigationURLLoaderFactories(
  159. int frame_tree_node_id,
  160. base::UkmSourceId ukm_source_id,
  161. NonNetworkURLLoaderFactoryDeprecatedMap* uniquely_owned_factories,
  162. NonNetworkURLLoaderFactoryMap* factories) override;
  163. void RegisterNonNetworkWorkerMainResourceURLLoaderFactories(
  164. content::BrowserContext* browser_context,
  165. NonNetworkURLLoaderFactoryMap* factories) override;
  166. void RegisterNonNetworkSubresourceURLLoaderFactories(
  167. int render_process_id,
  168. int render_frame_id,
  169. NonNetworkURLLoaderFactoryDeprecatedMap* uniquely_owned_factories,
  170. NonNetworkURLLoaderFactoryMap* factories) override;
  171. void CreateWebSocket(
  172. content::RenderFrameHost* frame,
  173. WebSocketFactory factory,
  174. const GURL& url,
  175. const net::SiteForCookies& site_for_cookies,
  176. const base::Optional<std::string>& user_agent,
  177. mojo::PendingRemote<network::mojom::WebSocketHandshakeClient>
  178. handshake_client) override;
  179. bool WillInterceptWebSocket(content::RenderFrameHost*) override;
  180. bool WillCreateURLLoaderFactory(
  181. content::BrowserContext* browser_context,
  182. content::RenderFrameHost* frame,
  183. int render_process_id,
  184. URLLoaderFactoryType type,
  185. const url::Origin& request_initiator,
  186. base::Optional<int64_t> navigation_id,
  187. base::UkmSourceId ukm_source_id,
  188. mojo::PendingReceiver<network::mojom::URLLoaderFactory>* factory_receiver,
  189. mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
  190. header_client,
  191. bool* bypass_redirect_checks,
  192. bool* disable_secure_dns,
  193. network::mojom::URLLoaderFactoryOverridePtr* factory_override) override;
  194. bool ShouldTreatURLSchemeAsFirstPartyWhenTopLevel(
  195. base::StringPiece scheme,
  196. bool is_embedded_origin_secure) override;
  197. void OverrideURLLoaderFactoryParams(
  198. content::BrowserContext* browser_context,
  199. const url::Origin& origin,
  200. bool is_for_isolated_world,
  201. network::mojom::URLLoaderFactoryParams* factory_params) override;
  202. #if defined(OS_WIN)
  203. bool PreSpawnRenderer(sandbox::TargetPolicy* policy,
  204. RendererSpawnFlags flags) override;
  205. #endif
  206. bool BindAssociatedReceiverFromFrame(
  207. content::RenderFrameHost* render_frame_host,
  208. const std::string& interface_name,
  209. mojo::ScopedInterfaceEndpointHandle* handle) override;
  210. bool HandleExternalProtocol(
  211. const GURL& url,
  212. content::WebContents::OnceGetter web_contents_getter,
  213. int child_id,
  214. content::NavigationUIData* navigation_data,
  215. bool is_main_frame,
  216. ui::PageTransition page_transition,
  217. bool has_user_gesture,
  218. const base::Optional<url::Origin>& initiating_origin,
  219. mojo::PendingRemote<network::mojom::URLLoaderFactory>* out_factory)
  220. override;
  221. std::unique_ptr<content::LoginDelegate> CreateLoginDelegate(
  222. const net::AuthChallengeInfo& auth_info,
  223. content::WebContents* web_contents,
  224. const content::GlobalRequestID& request_id,
  225. bool is_main_frame,
  226. const GURL& url,
  227. scoped_refptr<net::HttpResponseHeaders> response_headers,
  228. bool first_auth_attempt,
  229. LoginAuthRequiredCallback auth_required_callback) override;
  230. void SiteInstanceGotProcess(content::SiteInstance* site_instance) override;
  231. std::vector<std::unique_ptr<blink::URLLoaderThrottle>>
  232. CreateURLLoaderThrottles(
  233. const network::ResourceRequest& request,
  234. content::BrowserContext* browser_context,
  235. const base::RepeatingCallback<content::WebContents*()>& wc_getter,
  236. content::NavigationUIData* navigation_ui_data,
  237. int frame_tree_node_id) override;
  238. base::flat_set<std::string> GetPluginMimeTypesWithExternalHandlers(
  239. content::BrowserContext* browser_context) override;
  240. bool IsSuitableHost(content::RenderProcessHost* process_host,
  241. const GURL& site_url) override;
  242. bool ShouldUseProcessPerSite(content::BrowserContext* browser_context,
  243. const GURL& effective_url) override;
  244. bool ArePersistentMediaDeviceIDsAllowed(
  245. content::BrowserContext* browser_context,
  246. const GURL& scope,
  247. const GURL& site_for_cookies,
  248. const base::Optional<url::Origin>& top_frame_origin) override;
  249. // content::RenderProcessHostObserver:
  250. void RenderProcessHostDestroyed(content::RenderProcessHost* host) override;
  251. void RenderProcessReady(content::RenderProcessHost* host) override;
  252. void RenderProcessExited(
  253. content::RenderProcessHost* host,
  254. const content::ChildProcessTerminationInfo& info) override;
  255. private:
  256. struct ProcessPreferences {
  257. bool sandbox = false;
  258. bool native_window_open = false;
  259. bool disable_popups = false;
  260. bool web_security = true;
  261. content::BrowserContext* browser_context = nullptr;
  262. };
  263. bool ShouldForceNewSiteInstance(content::RenderFrameHost* current_rfh,
  264. content::RenderFrameHost* speculative_rfh,
  265. content::BrowserContext* browser_context,
  266. const GURL& dest_url,
  267. bool has_request_started) const;
  268. bool NavigationWasRedirectedCrossSite(
  269. content::BrowserContext* browser_context,
  270. content::SiteInstance* current_instance,
  271. content::SiteInstance* speculative_instance,
  272. const GURL& dest_url,
  273. bool has_request_started) const;
  274. void AddProcessPreferences(int process_id, ProcessPreferences prefs);
  275. void RemoveProcessPreferences(int process_id);
  276. bool IsProcessObserved(int process_id) const;
  277. bool IsRendererSandboxed(int process_id) const;
  278. bool RendererUsesNativeWindowOpen(int process_id) const;
  279. bool RendererDisablesPopups(int process_id) const;
  280. std::string GetAffinityPreference(content::RenderFrameHost* rfh) const;
  281. content::SiteInstance* GetSiteInstanceFromAffinity(
  282. content::BrowserContext* browser_context,
  283. const GURL& url,
  284. content::RenderFrameHost* rfh) const;
  285. void ConsiderSiteInstanceForAffinity(content::RenderFrameHost* rfh,
  286. content::SiteInstance* site_instance);
  287. bool IsRendererSubFrame(int process_id) const;
  288. // pending_render_process => web contents.
  289. std::map<int, content::WebContents*> pending_processes_;
  290. std::map<int, base::ProcessId> render_process_host_pids_;
  291. std::set<int> renderer_is_subframe_;
  292. // list of site per affinity. weak_ptr to prevent instance locking
  293. std::map<std::string, content::SiteInstance*> site_per_affinities_;
  294. std::unique_ptr<PlatformNotificationService> notification_service_;
  295. std::unique_ptr<NotificationPresenter> notification_presenter_;
  296. Delegate* delegate_ = nullptr;
  297. std::map<int, ProcessPreferences> process_preferences_;
  298. std::string user_agent_override_ = "";
  299. bool disable_process_restart_tricks_ = true;
  300. // Simple shared ID generator, used by ProxyingURLLoaderFactory and
  301. // ProxyingWebSocket classes.
  302. uint64_t next_id_ = 0;
  303. DISALLOW_COPY_AND_ASSIGN(ElectronBrowserClient);
  304. };
  305. } // namespace electron
  306. #endif // SHELL_BROWSER_ELECTRON_BROWSER_CLIENT_H_