OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/devtools/protocol/target_handler.h" | 5 #include "content/browser/devtools/protocol/target_handler.h" |
6 | 6 |
7 #include "content/browser/devtools/service_worker_devtools_agent_host.h" | 7 #include "content/browser/devtools/service_worker_devtools_agent_host.h" |
8 #include "content/browser/frame_host/frame_tree.h" | 8 #include "content/browser/frame_host/frame_tree.h" |
9 #include "content/browser/frame_host/frame_tree_node.h" | 9 #include "content/browser/frame_host/frame_tree_node.h" |
10 #include "content/browser/frame_host/render_frame_host_impl.h" | 10 #include "content/browser/frame_host/render_frame_host_impl.h" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 AddEligibleHosts(*it.second.get(), &result); | 81 AddEligibleHosts(*it.second.get(), &result); |
82 | 82 |
83 return result; | 83 return result; |
84 } | 84 } |
85 | 85 |
86 } // namespace | 86 } // namespace |
87 | 87 |
88 TargetHandler::TargetHandler() | 88 TargetHandler::TargetHandler() |
89 : enabled_(false), | 89 : enabled_(false), |
90 wait_for_debugger_on_start_(false), | 90 wait_for_debugger_on_start_(false), |
| 91 attach_to_frames_(false), |
91 render_frame_host_(nullptr) { | 92 render_frame_host_(nullptr) { |
92 } | 93 } |
93 | 94 |
94 TargetHandler::~TargetHandler() { | 95 TargetHandler::~TargetHandler() { |
95 Disable(); | 96 Disable(); |
96 } | 97 } |
97 | 98 |
98 void TargetHandler::SetRenderFrameHost(RenderFrameHostImpl* render_frame_host) { | 99 void TargetHandler::SetRenderFrameHost(RenderFrameHostImpl* render_frame_host) { |
99 render_frame_host_ = render_frame_host; | 100 render_frame_host_ = render_frame_host; |
| 101 UpdateFrames(); |
100 } | 102 } |
101 | 103 |
102 void TargetHandler::SetClient(std::unique_ptr<Client> client) { | 104 void TargetHandler::SetClient(std::unique_ptr<Client> client) { |
103 client_.swap(client); | 105 client_.swap(client); |
104 } | 106 } |
105 | 107 |
106 void TargetHandler::Detached() { | 108 void TargetHandler::Detached() { |
107 Disable(); | 109 Disable(); |
108 } | 110 } |
109 | 111 |
110 void TargetHandler::UpdateServiceWorkers() { | 112 void TargetHandler::UpdateServiceWorkers() { |
111 UpdateServiceWorkers(false); | 113 UpdateServiceWorkers(false); |
112 } | 114 } |
113 | 115 |
| 116 void TargetHandler::UpdateFrames() { |
| 117 if (!enabled_ || !attach_to_frames_) |
| 118 return; |
| 119 |
| 120 HostsMap new_hosts; |
| 121 if (render_frame_host_) { |
| 122 FrameTreeNode* root = render_frame_host_->frame_tree_node(); |
| 123 std::queue<FrameTreeNode*> queue; |
| 124 queue.push(root); |
| 125 while (!queue.empty()) { |
| 126 FrameTreeNode* node = queue.front(); |
| 127 queue.pop(); |
| 128 bool cross_process = node->current_frame_host()->IsCrossProcessSubframe(); |
| 129 if (node != root && cross_process) { |
| 130 scoped_refptr<DevToolsAgentHost> new_host = |
| 131 DevToolsAgentHost::GetOrCreateFor(node->current_frame_host()); |
| 132 new_hosts[new_host->GetId()] = new_host; |
| 133 } else { |
| 134 for (size_t i = 0; i < node->child_count(); ++i) |
| 135 queue.push(node->child_at(i)); |
| 136 } |
| 137 } |
| 138 } |
| 139 |
| 140 // TODO(dgozman): support wait_for_debugger_on_start_. |
| 141 ReattachTargetsOfType(new_hosts, DevToolsAgentHost::kTypeFrame, false); |
| 142 } |
| 143 |
114 void TargetHandler::UpdateServiceWorkers(bool waiting_for_debugger) { | 144 void TargetHandler::UpdateServiceWorkers(bool waiting_for_debugger) { |
115 if (!enabled_) | 145 if (!enabled_) |
116 return; | 146 return; |
117 | 147 |
118 frame_urls_.clear(); | 148 frame_urls_.clear(); |
119 BrowserContext* browser_context = nullptr; | 149 BrowserContext* browser_context = nullptr; |
120 if (render_frame_host_) { | 150 if (render_frame_host_) { |
121 // TODO(dgozman): do not traverse inside cross-process subframes. | 151 // TODO(dgozman): do not traverse inside cross-process subframes. |
122 for (FrameTreeNode* node : | 152 for (FrameTreeNode* node : |
123 render_frame_host_->frame_tree_node()->frame_tree()->Nodes()) { | 153 render_frame_host_->frame_tree_node()->frame_tree()->Nodes()) { |
124 frame_urls_.insert(node->current_url()); | 154 frame_urls_.insert(node->current_url()); |
125 } | 155 } |
126 browser_context = render_frame_host_->GetProcess()->GetBrowserContext(); | 156 browser_context = render_frame_host_->GetProcess()->GetBrowserContext(); |
127 } | 157 } |
128 | 158 |
129 std::map<std::string, scoped_refptr<DevToolsAgentHost>> old_hosts = | 159 auto matching = GetMatchingServiceWorkers(browser_context, frame_urls_); |
130 attached_hosts_; | 160 HostsMap new_hosts; |
131 ServiceWorkerDevToolsAgentHost::Map new_hosts = | 161 for (const auto& pair : matching) |
132 GetMatchingServiceWorkers(browser_context, frame_urls_); | 162 new_hosts[pair.first] = pair.second; |
| 163 ReattachTargetsOfType( |
| 164 new_hosts, DevToolsAgentHost::kTypeServiceWorker, waiting_for_debugger); |
| 165 } |
133 | 166 |
| 167 void TargetHandler::ReattachTargetsOfType( |
| 168 const HostsMap& new_hosts, |
| 169 const std::string& type, |
| 170 bool waiting_for_debugger) { |
| 171 HostsMap old_hosts = attached_hosts_; |
134 for (const auto& pair : old_hosts) { | 172 for (const auto& pair : old_hosts) { |
135 if (pair.second->GetType() == DevToolsAgentHost::kTypeServiceWorker && | 173 if (pair.second->GetType() == type && |
136 new_hosts.find(pair.first) == new_hosts.end()) { | 174 new_hosts.find(pair.first) == new_hosts.end()) { |
137 DetachFromTargetInternal(pair.second.get()); | 175 DetachFromTargetInternal(pair.second.get()); |
138 } | 176 } |
139 } | 177 } |
140 | |
141 for (const auto& pair : new_hosts) { | 178 for (const auto& pair : new_hosts) { |
142 if (old_hosts.find(pair.first) == old_hosts.end()) | 179 if (old_hosts.find(pair.first) == old_hosts.end()) |
143 AttachToTargetInternal(pair.second.get(), waiting_for_debugger); | 180 AttachToTargetInternal(pair.second.get(), waiting_for_debugger); |
144 } | 181 } |
145 } | 182 } |
146 | 183 |
147 void TargetHandler::AttachToTargetInternal( | 184 void TargetHandler::AttachToTargetInternal( |
148 DevToolsAgentHost* host, bool waiting_for_debugger) { | 185 DevToolsAgentHost* host, bool waiting_for_debugger) { |
149 if (host->IsAttached()) | 186 if (host->IsAttached()) |
150 return; | 187 return; |
(...skipping 17 matching lines...) Expand all Loading... |
168 } | 205 } |
169 | 206 |
170 // ----------------- Protocol ---------------------- | 207 // ----------------- Protocol ---------------------- |
171 | 208 |
172 Response TargetHandler::Enable() { | 209 Response TargetHandler::Enable() { |
173 if (enabled_) | 210 if (enabled_) |
174 return Response::OK(); | 211 return Response::OK(); |
175 enabled_ = true; | 212 enabled_ = true; |
176 ServiceWorkerDevToolsManager::GetInstance()->AddObserver(this); | 213 ServiceWorkerDevToolsManager::GetInstance()->AddObserver(this); |
177 UpdateServiceWorkers(); | 214 UpdateServiceWorkers(); |
| 215 UpdateFrames(); |
178 return Response::OK(); | 216 return Response::OK(); |
179 } | 217 } |
180 | 218 |
181 Response TargetHandler::Disable() { | 219 Response TargetHandler::Disable() { |
182 if (!enabled_) | 220 if (!enabled_) |
183 return Response::OK(); | 221 return Response::OK(); |
184 enabled_ = false; | 222 enabled_ = false; |
185 wait_for_debugger_on_start_ = false; | 223 wait_for_debugger_on_start_ = false; |
186 ServiceWorkerDevToolsManager::GetInstance()->RemoveObserver(this); | 224 ServiceWorkerDevToolsManager::GetInstance()->RemoveObserver(this); |
187 for (const auto& pair : attached_hosts_) | 225 for (const auto& pair : attached_hosts_) |
188 pair.second->DetachClient(this); | 226 pair.second->DetachClient(this); |
189 attached_hosts_.clear(); | 227 attached_hosts_.clear(); |
190 return Response::OK(); | 228 return Response::OK(); |
191 } | 229 } |
192 | 230 |
193 Response TargetHandler::SetWaitForDebuggerOnStart(bool value) { | 231 Response TargetHandler::SetWaitForDebuggerOnStart(bool value) { |
194 wait_for_debugger_on_start_ = value; | 232 wait_for_debugger_on_start_ = value; |
195 return Response::OK(); | 233 return Response::OK(); |
196 } | 234 } |
197 | 235 |
| 236 Response TargetHandler::SetAttachToFrames(bool value) { |
| 237 if (attach_to_frames_ == value) |
| 238 return Response::OK(); |
| 239 attach_to_frames_ = value; |
| 240 if (attach_to_frames_) { |
| 241 UpdateFrames(); |
| 242 } else { |
| 243 HostsMap empty; |
| 244 ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeFrame, false); |
| 245 } |
| 246 return Response::OK(); |
| 247 } |
| 248 |
198 Response TargetHandler::SendMessageToTarget( | 249 Response TargetHandler::SendMessageToTarget( |
199 const std::string& target_id, | 250 const std::string& target_id, |
200 const std::string& message) { | 251 const std::string& message) { |
201 auto it = attached_hosts_.find(target_id); | 252 auto it = attached_hosts_.find(target_id); |
202 if (it == attached_hosts_.end()) | 253 if (it == attached_hosts_.end()) |
203 return Response::InternalError("Not attached to the target"); | 254 return Response::InternalError("Not attached to the target"); |
204 it->second->DispatchProtocolMessage(this, message); | 255 it->second->DispatchProtocolMessage(this, message); |
205 return Response::OK(); | 256 return Response::OK(); |
206 } | 257 } |
207 | 258 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 } | 339 } |
289 | 340 |
290 void TargetHandler::WorkerDestroyed( | 341 void TargetHandler::WorkerDestroyed( |
291 ServiceWorkerDevToolsAgentHost* host) { | 342 ServiceWorkerDevToolsAgentHost* host) { |
292 UpdateServiceWorkers(); | 343 UpdateServiceWorkers(); |
293 } | 344 } |
294 | 345 |
295 } // namespace target | 346 } // namespace target |
296 } // namespace devtools | 347 } // namespace devtools |
297 } // namespace content | 348 } // namespace content |
OLD | NEW |