atom_browser_client.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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 ATOM_BROWSER_ATOM_BROWSER_CLIENT_H_
  5. #define ATOM_BROWSER_ATOM_BROWSER_CLIENT_H_
  6. #include <map>
  7. #include <memory>
  8. #include <set>
  9. #include <string>
  10. #include <vector>
  11. #include "base/synchronization/lock.h"
  12. #include "content/public/browser/content_browser_client.h"
  13. #include "content/public/browser/render_process_host_observer.h"
  14. #include "net/ssl/client_cert_identity.h"
  15. namespace content {
  16. class QuotaPermissionContext;
  17. class ClientCertificateDelegate;
  18. } // namespace content
  19. namespace net {
  20. class SSLCertRequestInfo;
  21. }
  22. namespace atom {
  23. class AtomResourceDispatcherHostDelegate;
  24. class NotificationPresenter;
  25. class PlatformNotificationService;
  26. class AtomBrowserClient : public content::ContentBrowserClient,
  27. public content::RenderProcessHostObserver {
  28. public:
  29. static AtomBrowserClient* Get();
  30. static void SetApplicationLocale(const std::string& locale);
  31. AtomBrowserClient();
  32. ~AtomBrowserClient() override;
  33. using Delegate = content::ContentBrowserClient;
  34. void set_delegate(Delegate* delegate) { delegate_ = delegate; }
  35. // Returns the WebContents for pending render processes.
  36. content::WebContents* GetWebContentsFromProcessID(int process_id);
  37. // Don't force renderer process to restart for once.
  38. static void SuppressRendererProcessRestartForOnce();
  39. NotificationPresenter* GetNotificationPresenter();
  40. void WebNotificationAllowed(int render_process_id,
  41. const base::Callback<void(bool, bool)>& callback);
  42. // content::NavigatorDelegate
  43. std::vector<std::unique_ptr<content::NavigationThrottle>>
  44. CreateThrottlesForNavigation(content::NavigationHandle* handle) override;
  45. // content::ContentBrowserClient:
  46. std::string GetApplicationLocale() override;
  47. // content::ContentBrowserClient:
  48. bool ShouldEnableStrictSiteIsolation() override;
  49. std::string GetUserAgent() const override;
  50. void SetUserAgent(const std::string& user_agent);
  51. void SetCanUseCustomSiteInstance(bool should_disable);
  52. bool CanUseCustomSiteInstance() override;
  53. protected:
  54. void RenderProcessWillLaunch(
  55. content::RenderProcessHost* host,
  56. service_manager::mojom::ServiceRequest* service_request) override;
  57. content::SpeechRecognitionManagerDelegate*
  58. CreateSpeechRecognitionManagerDelegate() override;
  59. content::TtsControllerDelegate* GetTtsControllerDelegate() override;
  60. void OverrideWebkitPrefs(content::RenderViewHost* render_view_host,
  61. content::WebPreferences* prefs) override;
  62. SiteInstanceForNavigationType ShouldOverrideSiteInstanceForNavigation(
  63. content::RenderFrameHost* current_rfh,
  64. content::RenderFrameHost* speculative_rfh,
  65. content::BrowserContext* browser_context,
  66. const GURL& url,
  67. bool has_navigation_started,
  68. bool has_request_started,
  69. content::SiteInstance** affinity_site_instance) const override;
  70. void RegisterPendingSiteInstance(
  71. content::RenderFrameHost* render_frame_host,
  72. content::SiteInstance* pending_site_instance) override;
  73. void AppendExtraCommandLineSwitches(base::CommandLine* command_line,
  74. int child_process_id) override;
  75. void AdjustUtilityServiceProcessCommandLine(
  76. const service_manager::Identity& identity,
  77. base::CommandLine* command_line) override;
  78. void DidCreatePpapiPlugin(content::BrowserPpapiHost* browser_host) override;
  79. std::string GetGeolocationApiKey() override;
  80. scoped_refptr<content::QuotaPermissionContext> CreateQuotaPermissionContext()
  81. override;
  82. content::GeneratedCodeCacheSettings GetGeneratedCodeCacheSettings(
  83. content::BrowserContext* context) override;
  84. void AllowCertificateError(
  85. content::WebContents* web_contents,
  86. int cert_error,
  87. const net::SSLInfo& ssl_info,
  88. const GURL& request_url,
  89. bool is_main_frame_request,
  90. bool strict_enforcement,
  91. bool expired_previous_decision,
  92. const base::Callback<void(content::CertificateRequestResultType)>&
  93. callback) override;
  94. void SelectClientCertificate(
  95. content::WebContents* web_contents,
  96. net::SSLCertRequestInfo* cert_request_info,
  97. net::ClientCertIdentityList client_certs,
  98. std::unique_ptr<content::ClientCertificateDelegate> delegate) override;
  99. void ResourceDispatcherHostCreated() override;
  100. bool CanCreateWindow(content::RenderFrameHost* opener,
  101. const GURL& opener_url,
  102. const GURL& opener_top_level_frame_url,
  103. const url::Origin& source_origin,
  104. content::mojom::WindowContainerType container_type,
  105. const GURL& target_url,
  106. const content::Referrer& referrer,
  107. const std::string& frame_name,
  108. WindowOpenDisposition disposition,
  109. const blink::mojom::WindowFeatures& features,
  110. const std::vector<std::string>& additional_features,
  111. const scoped_refptr<network::ResourceRequestBody>& body,
  112. bool user_gesture,
  113. bool opener_suppressed,
  114. bool* no_javascript_access) override;
  115. void GetAdditionalAllowedSchemesForFileSystem(
  116. std::vector<std::string>* additional_schemes) override;
  117. void GetAdditionalWebUISchemes(
  118. std::vector<std::string>* additional_schemes) override;
  119. void SiteInstanceDeleting(content::SiteInstance* site_instance) override;
  120. std::unique_ptr<net::ClientCertStore> CreateClientCertStore(
  121. content::ResourceContext* resource_context) override;
  122. std::unique_ptr<device::LocationProvider> OverrideSystemLocationProvider()
  123. override;
  124. network::mojom::NetworkContextPtr CreateNetworkContext(
  125. content::BrowserContext* browser_context,
  126. bool in_memory,
  127. const base::FilePath& relative_partition_path) override;
  128. network::mojom::NetworkContext* GetSystemNetworkContext() override;
  129. base::Optional<service_manager::Manifest> GetServiceManifestOverlay(
  130. base::StringPiece name) override;
  131. std::vector<service_manager::Manifest> GetExtraServiceManifests() override;
  132. net::NetLog* GetNetLog() override;
  133. content::MediaObserver* GetMediaObserver() override;
  134. content::DevToolsManagerDelegate* GetDevToolsManagerDelegate() override;
  135. content::PlatformNotificationService* GetPlatformNotificationService(
  136. content::BrowserContext* browser_context) override;
  137. std::unique_ptr<content::BrowserMainParts> CreateBrowserMainParts(
  138. const content::MainFunctionParams&) override;
  139. base::FilePath GetDefaultDownloadDirectory() override;
  140. scoped_refptr<network::SharedURLLoaderFactory>
  141. GetSystemSharedURLLoaderFactory() override;
  142. void OnNetworkServiceCreated(
  143. network::mojom::NetworkService* network_service) override;
  144. bool ShouldBypassCORB(int render_process_id) const override;
  145. std::string GetProduct() const override;
  146. #if defined(OS_WIN)
  147. bool PreSpawnRenderer(sandbox::TargetPolicy* policy) override;
  148. #endif
  149. // content::RenderProcessHostObserver:
  150. void RenderProcessHostDestroyed(content::RenderProcessHost* host) override;
  151. void RenderProcessReady(content::RenderProcessHost* host) override;
  152. void RenderProcessExited(
  153. content::RenderProcessHost* host,
  154. const content::ChildProcessTerminationInfo& info) override;
  155. bool HandleExternalProtocol(
  156. const GURL& url,
  157. content::ResourceRequestInfo::WebContentsGetter web_contents_getter,
  158. int child_id,
  159. content::NavigationUIData* navigation_data,
  160. bool is_main_frame,
  161. ui::PageTransition page_transition,
  162. bool has_user_gesture,
  163. network::mojom::URLLoaderFactoryRequest* factory_request,
  164. // clang-format off
  165. network::mojom::URLLoaderFactory*& out_factory) // NOLINT
  166. // clang-format on
  167. override;
  168. private:
  169. struct ProcessPreferences {
  170. bool sandbox = false;
  171. bool native_window_open = false;
  172. bool disable_popups = false;
  173. bool web_security = true;
  174. };
  175. bool ShouldForceNewSiteInstance(content::RenderFrameHost* current_rfh,
  176. content::RenderFrameHost* speculative_rfh,
  177. content::BrowserContext* browser_context,
  178. const GURL& dest_url,
  179. bool has_request_started) const;
  180. bool NavigationWasRedirectedCrossSite(
  181. content::BrowserContext* browser_context,
  182. content::SiteInstance* current_instance,
  183. content::SiteInstance* speculative_instance,
  184. const GURL& dest_url,
  185. bool has_request_started) const;
  186. void AddProcessPreferences(int process_id, ProcessPreferences prefs);
  187. void RemoveProcessPreferences(int process_id);
  188. bool IsProcessObserved(int process_id) const;
  189. bool IsRendererSandboxed(int process_id) const;
  190. bool RendererUsesNativeWindowOpen(int process_id) const;
  191. bool RendererDisablesPopups(int process_id) const;
  192. std::string GetAffinityPreference(content::RenderFrameHost* rfh) const;
  193. content::SiteInstance* GetSiteInstanceFromAffinity(
  194. content::BrowserContext* browser_context,
  195. const GURL& url,
  196. content::RenderFrameHost* rfh) const;
  197. void ConsiderSiteInstanceForAffinity(content::RenderFrameHost* rfh,
  198. content::SiteInstance* site_instance);
  199. // pending_render_process => web contents.
  200. std::map<int, content::WebContents*> pending_processes_;
  201. std::map<int, base::ProcessId> render_process_host_pids_;
  202. // list of site per affinity. weak_ptr to prevent instance locking
  203. std::map<std::string, content::SiteInstance*> site_per_affinities_;
  204. std::unique_ptr<AtomResourceDispatcherHostDelegate>
  205. resource_dispatcher_host_delegate_;
  206. std::unique_ptr<PlatformNotificationService> notification_service_;
  207. std::unique_ptr<NotificationPresenter> notification_presenter_;
  208. Delegate* delegate_ = nullptr;
  209. mutable base::Lock process_preferences_lock_;
  210. std::map<int, ProcessPreferences> process_preferences_;
  211. std::string user_agent_override_ = "";
  212. bool disable_process_restart_tricks_ = false;
  213. DISALLOW_COPY_AND_ASSIGN(AtomBrowserClient);
  214. };
  215. } // namespace atom
  216. #endif // ATOM_BROWSER_ATOM_BROWSER_CLIENT_H_