// Copyright (c) 2013 GitHub, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #ifndef ATOM_BROWSER_ATOM_BROWSER_CLIENT_H_ #define ATOM_BROWSER_ATOM_BROWSER_CLIENT_H_ #include #include #include #include #include "brightray/browser/browser_client.h" #include "content/public/browser/render_process_host_observer.h" #include "content/public/browser/web_contents_observer.h" namespace content { class QuotaPermissionContext; class ClientCertificateDelegate; } namespace net { class SSLCertRequestInfo; } namespace atom { class AtomResourceDispatcherHostDelegate; class AtomBrowserClient : public brightray::BrowserClient, public content::RenderProcessHostObserver { public: AtomBrowserClient(); virtual ~AtomBrowserClient(); using Delegate = content::ContentBrowserClient; void set_delegate(Delegate* delegate) { delegate_ = delegate; } // Returns the WebContents for pending render processes. content::WebContents* GetWebContentsFromProcessID(int process_id); // Don't force renderer process to restart for once. static void SuppressRendererProcessRestartForOnce(); // Custom schemes to be registered to handle service worker. static void SetCustomServiceWorkerSchemes( const std::vector& schemes); protected: // content::ContentBrowserClient: void RenderProcessWillLaunch(content::RenderProcessHost* host) override; content::SpeechRecognitionManagerDelegate* CreateSpeechRecognitionManagerDelegate() override; void OverrideWebkitPrefs(content::RenderViewHost* render_view_host, content::WebPreferences* prefs) override; std::string GetApplicationLocale() override; void OverrideSiteInstanceForNavigation( content::RenderFrameHost* render_frame_host, content::BrowserContext* browser_context, content::SiteInstance* current_instance, const GURL& dest_url, content::SiteInstance** new_instance) override; void AppendExtraCommandLineSwitches(base::CommandLine* command_line, int child_process_id) override; void DidCreatePpapiPlugin(content::BrowserPpapiHost* browser_host) override; content::QuotaPermissionContext* CreateQuotaPermissionContext() override; void AllowCertificateError( content::WebContents* web_contents, int cert_error, const net::SSLInfo& ssl_info, const GURL& request_url, content::ResourceType resource_type, bool overridable, bool strict_enforcement, bool expired_previous_decision, const base::Callback& callback) override; void SelectClientCertificate( content::WebContents* web_contents, net::SSLCertRequestInfo* cert_request_info, std::unique_ptr delegate) override; void ResourceDispatcherHostCreated() override; bool CanCreateWindow( const GURL& opener_url, const GURL& opener_top_level_frame_url, const GURL& source_origin, WindowContainerType container_type, const GURL& target_url, const content::Referrer& referrer, const std::string& frame_name, WindowOpenDisposition disposition, const blink::WebWindowFeatures& features, const std::vector& additional_features, const scoped_refptr& body, bool user_gesture, bool opener_suppressed, content::ResourceContext* context, int render_process_id, int opener_render_view_id, int opener_render_frame_id, bool* no_javascript_access) override; void GetAdditionalAllowedSchemesForFileSystem( std::vector* schemes) override; // brightray::BrowserClient: brightray::BrowserMainParts* OverrideCreateBrowserMainParts( const content::MainFunctionParams&) override; void WebNotificationAllowed( int render_process_id, const base::Callback& callback) override; // content::RenderProcessHostObserver: void RenderProcessHostDestroyed(content::RenderProcessHost* host) override; private: bool ShouldCreateNewSiteInstance(content::RenderFrameHost* render_frame_host, content::BrowserContext* browser_context, content::SiteInstance* current_instance, const GURL& dest_url); struct ProcessPreferences { bool sandbox; bool native_window_open; }; void AddProcessPreferences(int process_id, ProcessPreferences prefs); void RemoveProcessPreferences(int process_id); bool IsRendererSandboxed(int process_id); bool RendererUsesNativeWindowOpen(int process_id); // pending_render_process => current_render_process. std::map pending_processes_; std::map process_preferences_; base::Lock process_preferences_lock_; std::unique_ptr resource_dispatcher_host_delegate_; Delegate* delegate_; class RootWebContentsTracker : public content::WebContentsObserver { public: RootWebContentsTracker(content::WebContents* web_contents, AtomBrowserClient* client); void WebContentsDestroyed() override; private: AtomBrowserClient* client_; }; std::set root_web_contents_; DISALLOW_COPY_AND_ASSIGN(AtomBrowserClient); }; } // namespace atom #endif // ATOM_BROWSER_ATOM_BROWSER_CLIENT_H_