1 // Copyright 2015 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef HEADLESS_LIB_BROWSER_HEADLESS_BROWSER_CONTEXT_IMPL_H_ 6 #define HEADLESS_LIB_BROWSER_HEADLESS_BROWSER_CONTEXT_IMPL_H_ 7 8 #include <memory> 9 #include <string> 10 #include <unordered_map> 11 #include <vector> 12 13 #include "base/files/file_path.h" 14 #include "base/unguessable_token.h" 15 #include "components/keyed_service/core/simple_factory_key.h" 16 #include "content/public/browser/browser_context.h" 17 #include "content/public/browser/global_routing_id.h" 18 #include "content/public/browser/resource_context.h" 19 #include "headless/lib/browser/headless_browser_context_options.h" 20 #include "headless/lib/browser/headless_request_context_manager.h" 21 #include "headless/public/headless_browser.h" 22 #include "headless/public/headless_browser_context.h" 23 #include "headless/public/headless_export.h" 24 #include "mojo/public/cpp/bindings/remote.h" 25 26 namespace headless { 27 class HeadlessBrowserImpl; 28 class HeadlessWebContentsImpl; 29 30 class HEADLESS_EXPORT HeadlessBrowserContextImpl final 31 : public HeadlessBrowserContext, 32 public content::BrowserContext { 33 public: 34 ~HeadlessBrowserContextImpl() override; 35 36 static HeadlessBrowserContextImpl* From( 37 HeadlessBrowserContext* browser_context); 38 static HeadlessBrowserContextImpl* From( 39 content::BrowserContext* browser_context); 40 41 static std::unique_ptr<HeadlessBrowserContextImpl> Create( 42 HeadlessBrowserContext::Builder* builder); 43 44 // HeadlessBrowserContext implementation: 45 HeadlessWebContents::Builder CreateWebContentsBuilder() override; 46 std::vector<HeadlessWebContents*> GetAllWebContents() override; 47 HeadlessWebContents* GetWebContentsForDevToolsAgentHostId( 48 const std::string& devtools_agent_host_id) override; 49 void Close() override; 50 const std::string& Id() override; 51 52 void SetDevToolsFrameToken(int render_process_id, 53 int render_frame_routing_id, 54 const base::UnguessableToken& devtools_frame_token, 55 int frame_tree_node_id); 56 57 void RemoveDevToolsFrameToken(int render_process_id, 58 int render_frame_routing_id, 59 int frame_tree_node_id); 60 61 // BrowserContext implementation: 62 std::unique_ptr<content::ZoomLevelDelegate> CreateZoomLevelDelegate( 63 const base::FilePath& partition_path) override; 64 base::FilePath GetPath() override; 65 bool IsOffTheRecord() override; 66 content::ResourceContext* GetResourceContext() override; 67 content::DownloadManagerDelegate* GetDownloadManagerDelegate() override; 68 content::BrowserPluginGuestManager* GetGuestManager() override; 69 ::storage::SpecialStoragePolicy* GetSpecialStoragePolicy() override; 70 content::PushMessagingService* GetPushMessagingService() override; 71 content::StorageNotificationService* GetStorageNotificationService() override; 72 content::SSLHostStateDelegate* GetSSLHostStateDelegate() override; 73 content::PermissionControllerDelegate* GetPermissionControllerDelegate() 74 override; 75 content::ClientHintsControllerDelegate* GetClientHintsControllerDelegate() 76 override; 77 content::BackgroundFetchDelegate* GetBackgroundFetchDelegate() override; 78 content::BackgroundSyncController* GetBackgroundSyncController() override; 79 content::BrowsingDataRemoverDelegate* GetBrowsingDataRemoverDelegate() 80 override; 81 82 HeadlessWebContents* CreateWebContents(HeadlessWebContents::Builder* builder); 83 // Register web contents which were created not through Headless API 84 // (calling window.open() is a best example for this). 85 void RegisterWebContents( 86 std::unique_ptr<HeadlessWebContentsImpl> web_contents); 87 void DestroyWebContents(HeadlessWebContentsImpl* web_contents); 88 89 HeadlessBrowserImpl* browser() const; 90 const HeadlessBrowserContextOptions* options() const; 91 92 // Returns the DevTools frame token for the corresponding RenderFrameHost or 93 // null if can't be found. Can be called on any thread. 94 const base::UnguessableToken* GetDevToolsFrameToken( 95 int render_process_id, 96 int render_frame_id) const; 97 98 // Returns the DevTools frame token for the corresponding frame tree node id 99 // or null if can't be found. Can be called on any thread. 100 const base::UnguessableToken* GetDevToolsFrameTokenForFrameTreeNodeId( 101 int frame_tree_node_id) const; 102 103 void ConfigureNetworkContextParams( 104 bool in_memory, 105 const base::FilePath& relative_partition_path, 106 ::network::mojom::NetworkContextParams* network_context_params, 107 ::network::mojom::CertVerifierCreationParams* 108 cert_verifier_creation_params); 109 110 private: 111 HeadlessBrowserContextImpl( 112 HeadlessBrowserImpl* browser, 113 std::unique_ptr<HeadlessBrowserContextOptions> context_options); 114 115 // Performs initialization of the HeadlessBrowserContextImpl while IO is still 116 // allowed on the current thread. 117 void InitWhileIOAllowed(); 118 119 HeadlessBrowserImpl* browser_; // Not owned. 120 std::unique_ptr<HeadlessBrowserContextOptions> context_options_; 121 base::FilePath path_; 122 123 std::unordered_map<std::string, std::unique_ptr<HeadlessWebContents>> 124 web_contents_map_; 125 126 // Guards |devtools_frame_token_map_| from being concurrently written on the 127 // UI thread and read on the IO thread. 128 // TODO(alexclarke): Remove if we can add DevTools frame token ID to 129 // ResourceRequestInfo. See https://crbug.com/715541 130 mutable base::Lock devtools_frame_token_map_lock_; 131 base::flat_map<content::GlobalFrameRoutingId, base::UnguessableToken> 132 devtools_frame_token_map_; 133 base::flat_map<int, base::UnguessableToken> 134 frame_tree_node_id_to_devtools_frame_token_map_; 135 136 std::unique_ptr<content::PermissionControllerDelegate> 137 permission_controller_delegate_; 138 139 std::unique_ptr<HeadlessRequestContextManager> request_context_manager_; 140 std::unique_ptr<SimpleFactoryKey> simple_factory_key_; 141 142 DISALLOW_COPY_AND_ASSIGN(HeadlessBrowserContextImpl); 143 }; 144 145 } // namespace headless 146 147 #endif // HEADLESS_LIB_BROWSER_HEADLESS_BROWSER_CONTEXT_IMPL_H_ 148