1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
content / browser / devtools / render_frame_devtools_agent_host.h [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_DEVTOOLS_RENDER_FRAME_DEVTOOLS_AGENT_HOST_H_
#define CONTENT_BROWSER_DEVTOOLS_RENDER_FRAME_DEVTOOLS_AGENT_HOST_H_
#include <map>
#include <memory>
#include <optional>
#include <vector>
#include "base/containers/flat_set.h"
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "content/browser/devtools/devtools_agent_host_impl.h"
#include "content/common/content_export.h"
#include "content/public/browser/render_process_host_observer.h"
#include "content/public/browser/web_contents_observer.h"
#include "net/base/net_errors.h"
#include "services/network/public/mojom/content_security_policy.mojom.h"
#if BUILDFLAG(IS_ANDROID)
#include "mojo/public/cpp/bindings/remote.h"
#include "services/device/public/mojom/wake_lock.mojom.h"
#include "ui/android/view_android.h"
#endif // BUILDFLAG(IS_ANDROID)
namespace content {
class BrowserContext;
class FencedFrame;
class FrameTreeNode;
class FrameAutoAttacher;
class NavigationRequest;
class RenderFrameHostImpl;
class CONTENT_EXPORT RenderFrameDevToolsAgentHost
: public DevToolsAgentHostImpl,
private WebContentsObserver,
private RenderProcessHostObserver {
public:
// Returns true when DevTools was ever attached to any RenderFrameHost.
// TODO(crbug.com/40264958): Remove this method after the experiment
// associated with the bug entry.
static bool WasEverAttachedToAnyFrame();
static bool IsDebuggerAttached(WebContents* web_contents);
static void AddAllAgentHosts(DevToolsAgentHost::List* result);
// Returns appropriate agent host for given frame tree node, traversing
// up to local root as needed.
static DevToolsAgentHostImpl* GetFor(FrameTreeNode* frame_tree_node);
// Returns appropriate agent host for given RenderFrameHost, traversing
// up to local root as needed. This will have an effect different from
// calling the above overload as GetFor(rfh->frame_tree_node()) when
// given RFH is a pending local root.
static DevToolsAgentHostImpl* GetFor(RenderFrameHostImpl* rfh);
// Similar to GetFor(), but creates a host if it doesn't exist yet.
static scoped_refptr<DevToolsAgentHost> GetOrCreateFor(
FrameTreeNode* frame_tree_node);
// Whether the RFH passed may have associated DevTools agent host
// (i.e. the specified RFH is a local root). This does not indicate
// whether DevToolsAgentHost has actually been created.
static bool ShouldCreateDevToolsForHost(RenderFrameHostImpl* rfh);
// This method is called when new frame is created for an embedded page
// (fenced frame) or local root navigation.
static scoped_refptr<RenderFrameDevToolsAgentHost>
CreateForLocalRootOrEmbeddedPageNavigation(NavigationRequest* request);
static scoped_refptr<RenderFrameDevToolsAgentHost> FindForDangling(
FrameTreeNode* frame_tree_node);
RenderFrameDevToolsAgentHost(const RenderFrameDevToolsAgentHost&) = delete;
RenderFrameDevToolsAgentHost& operator=(const RenderFrameDevToolsAgentHost&) =
delete;
static void AttachToWebContents(WebContents* web_contents);
static bool ShouldAllowSession(RenderFrameHost* frame_host,
DevToolsSession* session);
FrameTreeNode* frame_tree_node() { return frame_tree_node_; }
void OnNavigationRequestWillBeSent(
const NavigationRequest& navigation_request);
void DidCreateFencedFrame(FencedFrame* fenced_frame);
// DevToolsAgentHost overrides.
// TODO(caseq): remove (Dis)connectWebContents() on frame targets once
// front-end uses tab target mode.
void DisconnectWebContents() override;
void ConnectWebContents(WebContents* web_contents) override;
BrowserContext* GetBrowserContext() override;
WebContents* GetWebContents() override;
std::string GetParentId() override;
std::string GetOpenerId() override;
std::string GetOpenerFrameId() override;
bool CanAccessOpener() override;
std::string GetType() override;
std::string GetTitle() override;
std::string GetDescription() override;
GURL GetURL() override;
GURL GetFaviconURL() override;
bool Activate() override;
void Reload() override;
bool Close() override;
base::TimeTicks GetLastActivityTime() override;
std::optional<network::CrossOriginEmbedderPolicy>
cross_origin_embedder_policy(const std::string& id) override;
std::optional<network::CrossOriginOpenerPolicy> cross_origin_opener_policy(
const std::string& id) override;
std::optional<std::vector<network::mojom::ContentSecurityPolicyHeader>>
content_security_policy(const std::string& id) override;
// This is used to enable compatibility shims, including disabling some
// features that are incompatible with older clients.
bool HasSessionsWithoutTabTargetSupport() const;
void SetFrameTreeNode(FrameTreeNode* frame_tree_node);
RenderFrameHostImpl* GetFrameHostForTesting() { return frame_host_; }
private:
friend class DevToolsAgentHost;
friend class RenderFrameDevToolsAgentHostFencedFrameBrowserTest;
static void UpdateRawHeadersAccess(RenderFrameHostImpl* rfh);
RenderFrameDevToolsAgentHost(FrameTreeNode*, RenderFrameHostImpl*);
~RenderFrameDevToolsAgentHost() override;
// DevToolsAgentHostImpl overrides.
bool AttachSession(DevToolsSession* session, bool acquire_wake_lock) override;
void DetachSession(DevToolsSession* session) override;
void InspectElement(RenderFrameHost* frame_host, int x, int y) override;
void UpdateRendererChannel(bool force) override;
protocol::TargetAutoAttacher* auto_attacher() override;
std::string GetSubtype() override;
RenderProcessHost* GetProcessHost() override;
void MainThreadDebuggerPaused() override;
void MainThreadDebuggerResumed() override;
// WebContentsObserver overrides.
void DidStartNavigation(NavigationHandle* navigation_handle) override;
void ReadyToCommitNavigation(NavigationHandle* navigation_handle) override;
void DidFinishNavigation(NavigationHandle* navigation_handle) override;
void RenderFrameHostChanged(RenderFrameHost* old_host,
RenderFrameHost* new_host) override;
void FrameDeleted(FrameTreeNodeId frame_tree_node_id) override;
void RenderFrameDeleted(RenderFrameHost* rfh) override;
void OnVisibilityChanged(content::Visibility visibility) override;
// RenderProcessHostObserver overrides.
void RenderProcessExited(RenderProcessHost* host,
const ChildProcessTerminationInfo& info) override;
bool IsChildFrame();
void DestroyOnRenderFrameGone();
void UpdateFrameHost(RenderFrameHostImpl* frame_host);
void ChangeFrameHostAndObservedProcess(RenderFrameHostImpl* frame_host);
void UpdateFrameAlive();
#if BUILDFLAG(IS_ANDROID)
device::mojom::WakeLock* GetWakeLock();
#endif
void UpdateResourceLoaderFactories();
#if BUILDFLAG(IS_ANDROID)
mojo::Remote<device::mojom::WakeLock> wake_lock_;
#endif
std::unique_ptr<FrameAutoAttacher> auto_attacher_;
// The active host we are talking to.
raw_ptr<RenderFrameHostImpl> frame_host_ = nullptr;
base::flat_set<raw_ptr<NavigationRequest, CtnExperimental>>
navigation_requests_;
bool render_frame_alive_ = false;
bool render_frame_crashed_ = false;
// TODO(crbug.com/40269649): Remove these fields once we collect enough
// data.
bool is_debugger_paused_ = false;
bool is_debugger_pause_situation_recorded_ = false;
// The FrameTreeNode associated with this agent.
raw_ptr<FrameTreeNode> frame_tree_node_;
};
// Returns the ancestor FrameTreeNode* for which a RenderFrameDevToolsAgentHost
// should be created (i.e. the next local root).
FrameTreeNode* GetFrameTreeNodeAncestor(FrameTreeNode* frame_tree_node);
} // namespace content
#endif // CONTENT_BROWSER_DEVTOOLS_RENDER_FRAME_DEVTOOLS_AGENT_HOST_H_