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