| // Copyright (c) 2011 The Chromium 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_BROWSER_CONTEXT_IMPL_H_ |
| #define CEF_LIBCEF_BROWSER_BROWSER_CONTEXT_IMPL_H_ |
| #pragma once |
| |
| #include <set> |
| |
| #include "include/cef_request_context_handler.h" |
| #include "libcef/browser/chrome_profile_stub.h" |
| #include "libcef/browser/request_context_handler_map.h" |
| #include "libcef/browser/resource_context.h" |
| |
| #include "base/callback.h" |
| #include "base/files/file_path.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/weak_ptr.h" |
| #include "chrome/browser/download/download_prefs.h" |
| #include "chrome/common/plugin.mojom.h" |
| #include "components/proxy_config/pref_proxy_config_tracker.h" |
| #include "components/visitedlink/browser/visitedlink_delegate.h" |
| #include "content/public/browser/browser_context.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/content_browser_client.h" |
| #include "url/origin.h" |
| |
| /* |
| // Classes used in request processing (network, storage, service, etc.): |
| // |
| // WC = WebContents |
| // Content API representation of a browser. Created by BHI or the system (for |
| // popups) and owned by BHI. Keeps a pointer to BC. |
| // |
| // BHI = CefBrowserHostImpl |
| // Implements the CefBrowser and CefBrowserHost interfaces which are exposed |
| // to clients. References an RCI instance. Owns a WC. Life span is controlled |
| // by client references and CefContentBrowserClient. |
| // |
| // RCI = CefRequestContextImpl |
| // Implements the CefRequestContext interface which is exposed to clients. |
| // References the isolated BC. |
| // |
| // BC = CefBrowserContext |
| // Entry point from WC when using an isolated RCI. Owns the RC and creates the |
| // SPI indirectly. Owned by CefBrowserMainParts for the global context or RCI |
| // for non-global contexts. |
| // |
| // SPI = content::StoragePartitionImpl |
| // Owns storage-related objects like Quota, IndexedDB, Cache, etc. Created by |
| // StoragePartitionImplMap::Get(). Provides access to the URCG. Life span is |
| // controlled indirectly by BC. |
| // |
| // RC = CefResourceContext |
| // Acts as a bridge for resource loading. Network request life span is tied to |
| // this object. Must be destroyed before the associated URCG. Life span is |
| // controlled by BC. |
| // |
| // |
| // Relationship diagram: |
| // ref = reference (CefRefPtr/scoped_refptr) |
| // own = ownership (std::unique_ptr) |
| // ptr = raw pointer |
| // |
| // CefBrowserMainParts |
| // | |
| // own |
| // v |
| // BHI -own-> WC -ptr-> BC -own-> SPI |
| // |
| // BHI -ref-> RCI -own-> BC -own-> RC |
| // |
| // |
| // How shutdown works: |
| // 1. CefBrowserHostImpl is destroyed on any thread due to browser close, |
| // ref release, etc. |
| // 2. CefRequestContextImpl is destroyed (possibly asynchronously) on the UI |
| // thread due to CefBrowserHostImpl destruction, ref release, etc. |
| // 3. CefBrowserContext is destroyed on the UI thread due to |
| // CefRequestContextImpl destruction or deletion in |
| // CefBrowserMainParts::PostMainMessageLoopRun(). |
| // 4. CefResourceContext is destroyed asynchronously on the IO thread due to |
| // CefBrowserContext destruction. This cancels/destroys any pending |
| // network requests. |
| */ |
| |
| class CefDownloadManagerDelegate; |
| class CefMediaRouterManager; |
| class CefRequestContextImpl; |
| class CefSSLHostStateDelegate; |
| class CefVisitedLinkListener; |
| class HostContentSettingsMap; |
| class PrefService; |
| |
| namespace extensions { |
| class CefExtensionSystem; |
| } |
| |
| namespace visitedlink { |
| class VisitedLinkWriter; |
| } |
| |
| // Main entry point for configuring behavior on a per-browser basis. An instance |
| // of this class is passed to WebContents::Create in CefBrowserHostImpl:: |
| // CreateInternal. Only accessed on the UI thread unless otherwise indicated. |
| class CefBrowserContext : public ChromeProfileStub, |
| public visitedlink::VisitedLinkDelegate { |
| public: |
| explicit CefBrowserContext(const CefRequestContextSettings& settings); |
| |
| // Returns the existing instance, if any, associated with the specified |
| // |cache_path|. |
| static CefBrowserContext* GetForCachePath(const base::FilePath& cache_path); |
| |
| // Returns the existing instance, if any, associated with the specified IDs. |
| // See comments on IsAssociatedContext() for usage. |
| static CefBrowserContext* GetForIDs(int render_process_id, |
| int render_frame_id, |
| int frame_tree_node_id, |
| bool require_frame_match); |
| |
| // Returns the underlying CefBrowserContext if any. |
| static CefBrowserContext* GetForContext(content::BrowserContext* context); |
| |
| // Returns all existing CefBrowserContext. |
| static std::vector<CefBrowserContext*> GetAll(); |
| |
| // Must be called immediately after this object is created. |
| void Initialize(); |
| |
| // Track associated CefRequestContextImpl objects. This object will delete |
| // itself when the count reaches zero. |
| void AddCefRequestContext(CefRequestContextImpl* context); |
| void RemoveCefRequestContext(CefRequestContextImpl* context); |
| |
| // BrowserContext methods. |
| content::ResourceContext* GetResourceContext() override; |
| content::ClientHintsControllerDelegate* GetClientHintsControllerDelegate() |
| override; |
| void SetCorsOriginAccessListForOrigin( |
| const url::Origin& source_origin, |
| std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns, |
| std::vector<network::mojom::CorsOriginPatternPtr> block_patterns, |
| base::OnceClosure closure) override; |
| base::FilePath GetPath() override; |
| base::FilePath GetPath() const override; |
| std::unique_ptr<content::ZoomLevelDelegate> CreateZoomLevelDelegate( |
| const base::FilePath& partition_path) override; |
| bool IsOffTheRecord() const override; |
| content::DownloadManagerDelegate* GetDownloadManagerDelegate() override; |
| content::BrowserPluginGuestManager* GetGuestManager() override; |
| storage::SpecialStoragePolicy* GetSpecialStoragePolicy() override; |
| content::PushMessagingService* GetPushMessagingService() override; |
| content::StorageNotificationService* GetStorageNotificationService() override; |
| content::SSLHostStateDelegate* GetSSLHostStateDelegate() override; |
| content::PermissionControllerDelegate* GetPermissionControllerDelegate() |
| override; |
| content::BackgroundFetchDelegate* GetBackgroundFetchDelegate() override; |
| content::BackgroundSyncController* GetBackgroundSyncController() override; |
| content::BrowsingDataRemoverDelegate* GetBrowsingDataRemoverDelegate() |
| override; |
| |
| // Profile methods. |
| ChromeZoomLevelPrefs* GetZoomLevelPrefs() override; |
| scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override; |
| PrefService* GetPrefs() override; |
| bool AllowsBrowserWindows() const override { return false; } |
| const PrefService* GetPrefs() const override; |
| ProfileKey* GetProfileKey() const override; |
| policy::SchemaRegistryService* GetPolicySchemaRegistryService() override; |
| policy::UserCloudPolicyManager* GetUserCloudPolicyManager() override; |
| policy::ProfilePolicyConnector* GetProfilePolicyConnector() override; |
| const policy::ProfilePolicyConnector* GetProfilePolicyConnector() |
| const override; |
| |
| // Values checked in ProfileNetworkContextService::CreateNetworkContextParams |
| // when creating the NetworkContext. |
| bool ShouldRestoreOldSessionCookies() override { |
| return should_persist_session_cookies_; |
| } |
| bool ShouldPersistSessionCookies() override { |
| return should_persist_session_cookies_; |
| } |
| base::Optional<std::vector<std::string>> GetCookieableSchemes() override { |
| return cookieable_schemes_; |
| } |
| |
| // visitedlink::VisitedLinkDelegate methods. |
| void RebuildTable(const scoped_refptr<URLEnumerator>& enumerator) override; |
| |
| // Returns the settings associated with this object. Safe to call from any |
| // thread. |
| const CefRequestContextSettings& GetSettings() const; |
| |
| // Settings for plugins and extensions. |
| HostContentSettingsMap* GetHostContentSettingsMap(); |
| |
| // Called from CefBrowserHostImpl::DidNavigateAnyFrame to update the table of |
| // visited links. |
| void AddVisitedURLs(const std::vector<GURL>& urls); |
| |
| // Called from CefRequestContextImpl::OnRenderFrameCreated. |
| void OnRenderFrameCreated(CefRequestContextImpl* request_context, |
| int render_process_id, |
| int render_frame_id, |
| int frame_tree_node_id, |
| bool is_main_frame, |
| bool is_guest_view); |
| |
| // Called from CefRequestContextImpl::OnRenderFrameDeleted. |
| void OnRenderFrameDeleted(CefRequestContextImpl* request_context, |
| int render_process_id, |
| int render_frame_id, |
| int frame_tree_node_id, |
| bool is_main_frame, |
| bool is_guest_view); |
| |
| // Returns the handler that matches the specified IDs. Pass -1 for unknown |
| // values. If |require_frame_match| is true only exact matches will be |
| // returned. If |require_frame_match| is false, and there is not an exact |
| // match, then the first handler for the same |render_process_id| will be |
| // returned. |
| CefRefPtr<CefRequestContextHandler> GetHandler( |
| int render_process_id, |
| int render_frame_id, |
| int frame_tree_node_id, |
| bool require_frame_match) const; |
| |
| // Returns true if this context is associated with the specified IDs. Pass -1 |
| // for unknown values. If |require_frame_match| is true only exact matches |
| // will qualify. If |require_frame_match| is false, and there is not an exact |
| // match, then any match for |render_process_id| will qualify. |
| bool IsAssociatedContext(int render_process_id, |
| int render_frame_id, |
| int frame_tree_node_id, |
| bool require_frame_match) const; |
| |
| // Remember the plugin load decision for plugin status requests that arrive |
| // via CefPluginServiceFilter::IsPluginAvailable. |
| void AddPluginLoadDecision(int render_process_id, |
| const base::FilePath& plugin_path, |
| bool is_main_frame, |
| const url::Origin& main_frame_origin, |
| chrome::mojom::PluginStatus status); |
| bool HasPluginLoadDecision(int render_process_id, |
| const base::FilePath& plugin_path, |
| bool is_main_frame, |
| const url::Origin& main_frame_origin, |
| chrome::mojom::PluginStatus* status) const; |
| |
| // Clear the plugin load decisions associated with |render_process_id|, or all |
| // plugin load decisions if |render_process_id| is -1. |
| void ClearPluginLoadDecision(int render_process_id); |
| |
| // Called from CefRequestContextImpl methods of the same name. |
| void RegisterSchemeHandlerFactory(const std::string& scheme_name, |
| const std::string& domain_name, |
| CefRefPtr<CefSchemeHandlerFactory> factory); |
| void ClearSchemeHandlerFactories(); |
| |
| network::mojom::NetworkContext* GetNetworkContext(); |
| |
| void set_should_persist_session_cookies(bool value) { |
| should_persist_session_cookies_ = value; |
| } |
| void set_cookieable_schemes( |
| base::Optional<std::vector<std::string>> schemes) { |
| cookieable_schemes_ = schemes; |
| } |
| |
| CefResourceContext* resource_context() const { |
| return resource_context_.get(); |
| } |
| extensions::CefExtensionSystem* extension_system() const { |
| return extension_system_; |
| } |
| |
| // Called from DownloadPrefs::FromBrowserContext. |
| DownloadPrefs* GetDownloadPrefs(); |
| |
| // Returns true if this context supports print preview. |
| bool IsPrintPreviewSupported() const; |
| |
| CefMediaRouterManager* GetMediaRouterManager(); |
| |
| // Returns the BrowserContext, or nullptr if the BrowserContext has already |
| // been destroyed. |
| using Getter = base::RepeatingCallback<CefBrowserContext*()>; |
| Getter getter() const { return getter_; } |
| |
| private: |
| // Allow deletion via std::unique_ptr(). |
| friend std::default_delete<CefBrowserContext>; |
| |
| ~CefBrowserContext() override; |
| |
| // Members initialized during construction are safe to access from any thread. |
| const CefRequestContextSettings settings_; |
| base::FilePath cache_path_; |
| |
| // CefRequestContextImpl objects referencing this object. |
| std::set<CefRequestContextImpl*> request_context_set_; |
| |
| std::unique_ptr<PrefService> pref_service_; |
| std::unique_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_; |
| |
| std::unique_ptr<CefDownloadManagerDelegate> download_manager_delegate_; |
| std::unique_ptr<CefSSLHostStateDelegate> ssl_host_state_delegate_; |
| scoped_refptr<HostContentSettingsMap> host_content_settings_map_; |
| std::unique_ptr<visitedlink::VisitedLinkWriter> visitedlink_master_; |
| // |visitedlink_listener_| is owned by visitedlink_master_. |
| CefVisitedLinkListener* visitedlink_listener_; |
| bool should_persist_session_cookies_ = false; |
| base::Optional<std::vector<std::string>> cookieable_schemes_; |
| |
| std::unique_ptr<CefResourceContext> resource_context_; |
| |
| // Owned by the KeyedService system. |
| extensions::CefExtensionSystem* extension_system_ = nullptr; |
| |
| // The key to index KeyedService instances created by |
| // SimpleKeyedServiceFactory. |
| std::unique_ptr<ProfileKey> key_; |
| |
| std::unique_ptr<DownloadPrefs> download_prefs_; |
| |
| std::unique_ptr<CefMediaRouterManager> media_router_manager_; |
| |
| // Map IDs to CefRequestContextHandler objects. |
| CefRequestContextHandlerMap handler_map_; |
| |
| // Map (render_process_id, plugin_path, is_main_frame, main_frame_origin) to |
| // plugin load decision. |
| typedef std::map< |
| std::pair<std::pair<int, base::FilePath>, std::pair<bool, url::Origin>>, |
| chrome::mojom::PluginStatus> |
| PluginLoadDecisionMap; |
| PluginLoadDecisionMap plugin_load_decision_map_; |
| |
| // Set of (render_process_id, render_frame_id) associated with this context. |
| typedef std::set<std::pair<int, int>> RenderIdSet; |
| RenderIdSet render_id_set_; |
| |
| // Set of frame_tree_node_id associated with this context. Keeping this list |
| // is necessary because, when navigating the main frame, a new (pre-commit) |
| // network request will be created before the RenderFrameHost. Consequently we |
| // can't rely on valid render IDs. See https://crbug.com/776884 for |
| // background. |
| typedef std::set<int> NodeIdSet; |
| NodeIdSet node_id_set_; |
| |
| Getter getter_; |
| base::WeakPtrFactory<CefBrowserContext> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(CefBrowserContext); |
| }; |
| |
| #endif // CEF_LIBCEF_BROWSER_BROWSER_CONTEXT_IMPL_H_ |