// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights // reserved. Use of this source code is governed by a BSD-style license that // can be found in the LICENSE file. #ifndef CEF_LIBCEF_BROWSER_REQUEST_CONTEXT_IMPL_H_ #define CEF_LIBCEF_BROWSER_REQUEST_CONTEXT_IMPL_H_ #pragma once #include "include/cef_request_context.h" #include "libcef/browser/browser_context.h" #include "libcef/browser/media_router/media_router_impl.h" #include "libcef/browser/net_service/cookie_manager_impl.h" #include "libcef/browser/thread_util.h" namespace content { struct GlobalRenderFrameHostId; } class CefBrowserContext; // Implementation of the CefRequestContext interface. All methods are thread- // safe unless otherwise indicated. Will be deleted on the UI thread. class CefRequestContextImpl : public CefRequestContext { public: CefRequestContextImpl(const CefRequestContextImpl&) = delete; CefRequestContextImpl& operator=(const CefRequestContextImpl&) = delete; ~CefRequestContextImpl() override; // Creates the singleton global RequestContext. Called from // AlloyBrowserMainParts::PreMainMessageLoopRun and // ChromeBrowserMainExtraPartsCef::PostProfileInit. static CefRefPtr CreateGlobalRequestContext( const CefRequestContextSettings& settings); // Returns a CefRequestContextImpl for the specified |request_context|. // Will return the global context if |request_context| is NULL. static CefRefPtr GetOrCreateForRequestContext( CefRefPtr request_context); // Verify that the browser context can be directly accessed (e.g. on the UI // thread and initialized). bool VerifyBrowserContext() const; // Returns the browser context object. Can only be called on the UI thread // after the browser context has been initialized. CefBrowserContext* GetBrowserContext(); // If the context is fully initialized execute |callback|, otherwise // store it until the context is fully initialized. void ExecuteWhenBrowserContextInitialized(base::OnceClosure callback); // Executes |callback| either synchronously or asynchronously after the // browser context object has been initialized. If |task_runner| is NULL the // callback will be executed on the originating thread. The resulting getter // can only be executed on the UI thread. using BrowserContextCallback = base::OnceCallback; void GetBrowserContext( scoped_refptr task_runner, BrowserContextCallback callback); bool IsSame(CefRefPtr other) override; bool IsSharingWith(CefRefPtr other) override; bool IsGlobal() override; CefRefPtr GetHandler() override; CefString GetCachePath() override; CefRefPtr GetCookieManager( CefRefPtr callback) override; bool RegisterSchemeHandlerFactory( const CefString& scheme_name, const CefString& domain_name, CefRefPtr factory) override; bool ClearSchemeHandlerFactories() override; bool HasPreference(const CefString& name) override; CefRefPtr GetPreference(const CefString& name) override; CefRefPtr GetAllPreferences( bool include_defaults) override; bool CanSetPreference(const CefString& name) override; bool SetPreference(const CefString& name, CefRefPtr value, CefString& error) override; void ClearCertificateExceptions( CefRefPtr callback) override; void ClearHttpAuthCredentials( CefRefPtr callback) override; void CloseAllConnections(CefRefPtr callback) override; void ResolveHost(const CefString& origin, CefRefPtr callback) override; void LoadExtension(const CefString& root_directory, CefRefPtr manifest, CefRefPtr handler) override; bool DidLoadExtension(const CefString& extension_id) override; bool HasExtension(const CefString& extension_id) override; bool GetExtensions(std::vector& extension_ids) override; CefRefPtr GetExtension(const CefString& extension_id) override; CefRefPtr GetMediaRouter( CefRefPtr callback) override; CefRefPtr GetWebsiteSetting( const CefString& requesting_url, const CefString& top_level_url, cef_content_setting_types_t content_type) override; void SetWebsiteSetting(const CefString& requesting_url, const CefString& top_level_url, cef_content_setting_types_t content_type, CefRefPtr value) override; cef_content_setting_values_t GetContentSetting( const CefString& requesting_url, const CefString& top_level_url, cef_content_setting_types_t content_type) override; void SetContentSetting(const CefString& requesting_url, const CefString& top_level_url, cef_content_setting_types_t content_type, cef_content_setting_values_t value) override; const CefRequestContextSettings& settings() const { return config_.settings; } // Called from CefBrowserContentsDelegate::RenderFrameCreated or // CefMimeHandlerViewGuestDelegate::OnGuestAttached when a render frame is // created. void OnRenderFrameCreated(const content::GlobalRenderFrameHostId& global_id, bool is_main_frame, bool is_guest_view); // Called from CefBrowserContentsDelegate::RenderFrameDeleted or // CefMimeHandlerViewGuestDelegate::OnGuestDetached when a render frame is // deleted. void OnRenderFrameDeleted(const content::GlobalRenderFrameHostId& global_id, bool is_main_frame, bool is_guest_view); private: friend class CefRequestContext; struct Config { // True if wrapping the global context. bool is_global = false; // |settings| or |other| will be set when creating a new CefRequestContext // via the API. When wrapping an existing CefBrowserContext* both will be // empty and Initialize(CefBrowserContext*) will be called immediately after // CefRequestContextImpl construction. CefRequestContextSettings settings; CefRefPtr other; // Optionally use this handler. CefRefPtr handler; // Used to uniquely identify CefRequestContext objects before an associated // CefBrowserContext has been created. Should be set when a new // CefRequestContext via the API. int unique_id = -1; }; static CefRefPtr GetOrCreateRequestContext( const Config& config); explicit CefRequestContextImpl(const Config& config); void Initialize(); void BrowserContextInitialized(); // Make sure the browser context exists. Only called on the UI thread. void EnsureBrowserContext(); void ClearCertificateExceptionsInternal( CefRefPtr callback, CefBrowserContext::Getter browser_context_getter); void ClearHttpAuthCredentialsInternal( CefRefPtr callback, CefBrowserContext::Getter browser_context_getter); void CloseAllConnectionsInternal( CefRefPtr callback, CefBrowserContext::Getter browser_context_getter); void ResolveHostInternal(const CefString& origin, CefRefPtr callback, CefBrowserContext::Getter browser_context_getter); void SetWebsiteSettingInternal( const CefString& requesting_url, const CefString& top_level_url, cef_content_setting_types_t content_type, CefRefPtr value, CefBrowserContext::Getter browser_context_getter); void SetContentSettingInternal( const CefString& requesting_url, const CefString& top_level_url, cef_content_setting_types_t content_type, cef_content_setting_values_t value, CefBrowserContext::Getter browser_context_getter); void InitializeCookieManagerInternal( CefRefPtr cookie_manager, CefRefPtr callback); void InitializeMediaRouterInternal(CefRefPtr media_router, CefRefPtr callback); CefBrowserContext* browser_context() const; // We must disassociate from this on destruction. CefBrowserContext* browser_context_ = nullptr; Config config_; IMPLEMENT_REFCOUNTING_DELETE_ON_UIT(CefRequestContextImpl); }; #endif // CEF_LIBCEF_BROWSER_REQUEST_CONTEXT_IMPL_H_