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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 for (const auto& it : scope_agents_map) | 80 for (const auto& it : scope_agents_map) |
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 render_frame_host_(nullptr) { | 91 render_frame_host_(nullptr) { |
91 } | 92 } |
92 | 93 |
93 TargetHandler::~TargetHandler() { | 94 TargetHandler::~TargetHandler() { |
94 Disable(); | 95 Disable(); |
95 } | 96 } |
96 | 97 |
97 void TargetHandler::SetRenderFrameHost(RenderFrameHostImpl* render_frame_host) { | 98 void TargetHandler::SetRenderFrameHost(RenderFrameHostImpl* render_frame_host) { |
98 render_frame_host_ = render_frame_host; | 99 render_frame_host_ = render_frame_host; |
99 } | 100 } |
100 | 101 |
101 void TargetHandler::SetClient(std::unique_ptr<Client> client) { | 102 void TargetHandler::SetClient(std::unique_ptr<Client> client) { |
102 client_.swap(client); | 103 client_.swap(client); |
103 } | 104 } |
104 | 105 |
105 void TargetHandler::Detached() { | 106 void TargetHandler::Detached() { |
106 Disable(); | 107 Disable(); |
107 } | 108 } |
108 | 109 |
109 void TargetHandler::UpdateServiceWorkers() { | 110 void TargetHandler::UpdateServiceWorkers() { |
| 111 UpdateServiceWorkers(false); |
| 112 } |
| 113 |
| 114 void TargetHandler::UpdateServiceWorkers(bool waiting_for_debugger) { |
110 if (!enabled_) | 115 if (!enabled_) |
111 return; | 116 return; |
112 | 117 |
113 frame_urls_.clear(); | 118 frame_urls_.clear(); |
114 BrowserContext* browser_context = nullptr; | 119 BrowserContext* browser_context = nullptr; |
115 if (render_frame_host_) { | 120 if (render_frame_host_) { |
116 // TODO(dgozman): do not traverse inside cross-process subframes. | 121 // TODO(dgozman): do not traverse inside cross-process subframes. |
117 for (FrameTreeNode* node : | 122 for (FrameTreeNode* node : |
118 render_frame_host_->frame_tree_node()->frame_tree()->Nodes()) { | 123 render_frame_host_->frame_tree_node()->frame_tree()->Nodes()) { |
119 frame_urls_.insert(node->current_url()); | 124 frame_urls_.insert(node->current_url()); |
120 } | 125 } |
121 browser_context = render_frame_host_->GetProcess()->GetBrowserContext(); | 126 browser_context = render_frame_host_->GetProcess()->GetBrowserContext(); |
122 } | 127 } |
123 | 128 |
124 std::map<std::string, scoped_refptr<DevToolsAgentHost>> old_hosts = | 129 std::map<std::string, scoped_refptr<DevToolsAgentHost>> old_hosts = |
125 attached_hosts_; | 130 attached_hosts_; |
126 ServiceWorkerDevToolsAgentHost::Map new_hosts = | 131 ServiceWorkerDevToolsAgentHost::Map new_hosts = |
127 GetMatchingServiceWorkers(browser_context, frame_urls_); | 132 GetMatchingServiceWorkers(browser_context, frame_urls_); |
128 | 133 |
129 for (const auto& pair : old_hosts) { | 134 for (const auto& pair : old_hosts) { |
130 if (pair.second->GetType() == DevToolsAgentHost::kTypeServiceWorker && | 135 if (pair.second->GetType() == DevToolsAgentHost::kTypeServiceWorker && |
131 new_hosts.find(pair.first) == new_hosts.end()) { | 136 new_hosts.find(pair.first) == new_hosts.end()) { |
132 DetachFromTargetInternal(pair.second.get()); | 137 DetachFromTargetInternal(pair.second.get()); |
133 } | 138 } |
134 } | 139 } |
135 | 140 |
136 for (const auto& pair : new_hosts) { | 141 for (const auto& pair : new_hosts) { |
137 if (old_hosts.find(pair.first) == old_hosts.end()) | 142 if (old_hosts.find(pair.first) == old_hosts.end()) |
138 AttachToTargetInternal(pair.second.get(), true); | 143 AttachToTargetInternal(pair.second.get(), waiting_for_debugger); |
139 } | 144 } |
140 } | 145 } |
141 | 146 |
142 void TargetHandler::AttachToTargetInternal( | 147 void TargetHandler::AttachToTargetInternal( |
143 DevToolsAgentHost* host, bool waiting_for_debugger) { | 148 DevToolsAgentHost* host, bool waiting_for_debugger) { |
144 if (host->IsAttached()) | 149 if (host->IsAttached()) |
145 return; | 150 return; |
146 attached_hosts_[host->GetId()] = host; | 151 attached_hosts_[host->GetId()] = host; |
147 host->AttachClient(this); | 152 host->AttachClient(this); |
148 client_->TargetCreated(TargetCreatedParams::Create() | 153 client_->TargetCreated(TargetCreatedParams::Create() |
(...skipping 21 matching lines...) Expand all Loading... |
170 enabled_ = true; | 175 enabled_ = true; |
171 ServiceWorkerDevToolsManager::GetInstance()->AddObserver(this); | 176 ServiceWorkerDevToolsManager::GetInstance()->AddObserver(this); |
172 UpdateServiceWorkers(); | 177 UpdateServiceWorkers(); |
173 return Response::OK(); | 178 return Response::OK(); |
174 } | 179 } |
175 | 180 |
176 Response TargetHandler::Disable() { | 181 Response TargetHandler::Disable() { |
177 if (!enabled_) | 182 if (!enabled_) |
178 return Response::OK(); | 183 return Response::OK(); |
179 enabled_ = false; | 184 enabled_ = false; |
| 185 wait_for_debugger_on_start_ = false; |
180 ServiceWorkerDevToolsManager::GetInstance()->RemoveObserver(this); | 186 ServiceWorkerDevToolsManager::GetInstance()->RemoveObserver(this); |
181 for (const auto& pair : attached_hosts_) | 187 for (const auto& pair : attached_hosts_) |
182 pair.second->DetachClient(this); | 188 pair.second->DetachClient(this); |
183 attached_hosts_.clear(); | 189 attached_hosts_.clear(); |
184 return Response::OK(); | 190 return Response::OK(); |
185 } | 191 } |
186 | 192 |
187 Response TargetHandler::SetWaitForDebuggerOnStart(bool value) { | 193 Response TargetHandler::SetWaitForDebuggerOnStart(bool value) { |
188 // TODO(dgozman): implement this. | 194 wait_for_debugger_on_start_ = value; |
189 return Response::OK(); | 195 return Response::OK(); |
190 } | 196 } |
191 | 197 |
192 Response TargetHandler::SendMessageToTarget( | 198 Response TargetHandler::SendMessageToTarget( |
193 const std::string& target_id, | 199 const std::string& target_id, |
194 const std::string& message) { | 200 const std::string& message) { |
195 auto it = attached_hosts_.find(target_id); | 201 auto it = attached_hosts_.find(target_id); |
196 if (it == attached_hosts_.end()) | 202 if (it == attached_hosts_.end()) |
197 return Response::InternalError("Not attached to the target"); | 203 return Response::InternalError("Not attached to the target"); |
198 it->second->DispatchProtocolMessage(this, message); | 204 it->second->DispatchProtocolMessage(this, message); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 | 254 |
249 // -------- ServiceWorkerDevToolsManager::Observer ---------- | 255 // -------- ServiceWorkerDevToolsManager::Observer ---------- |
250 | 256 |
251 void TargetHandler::WorkerCreated( | 257 void TargetHandler::WorkerCreated( |
252 ServiceWorkerDevToolsAgentHost* host) { | 258 ServiceWorkerDevToolsAgentHost* host) { |
253 BrowserContext* browser_context = nullptr; | 259 BrowserContext* browser_context = nullptr; |
254 if (render_frame_host_) | 260 if (render_frame_host_) |
255 browser_context = render_frame_host_->GetProcess()->GetBrowserContext(); | 261 browser_context = render_frame_host_->GetProcess()->GetBrowserContext(); |
256 auto hosts = GetMatchingServiceWorkers(browser_context, frame_urls_); | 262 auto hosts = GetMatchingServiceWorkers(browser_context, frame_urls_); |
257 if (hosts.find(host->GetId()) != hosts.end() && !host->IsAttached() && | 263 if (hosts.find(host->GetId()) != hosts.end() && !host->IsAttached() && |
258 !host->IsPausedForDebugOnStart()) { | 264 !host->IsPausedForDebugOnStart() && wait_for_debugger_on_start_) { |
259 host->PauseForDebugOnStart(); | 265 host->PauseForDebugOnStart(); |
260 } | 266 } |
261 } | 267 } |
262 | 268 |
263 void TargetHandler::WorkerReadyForInspection( | 269 void TargetHandler::WorkerReadyForInspection( |
264 ServiceWorkerDevToolsAgentHost* host) { | 270 ServiceWorkerDevToolsAgentHost* host) { |
265 if (ServiceWorkerDevToolsManager::GetInstance() | 271 if (ServiceWorkerDevToolsManager::GetInstance() |
266 ->debug_service_worker_on_start()) { | 272 ->debug_service_worker_on_start()) { |
267 // When debug_service_worker_on_start is true, a new DevTools window will | 273 // When debug_service_worker_on_start is true, a new DevTools window will |
268 // be opened in ServiceWorkerDevToolsManager::WorkerReadyForInspection. | 274 // be opened in ServiceWorkerDevToolsManager::WorkerReadyForInspection. |
269 return; | 275 return; |
270 } | 276 } |
271 UpdateServiceWorkers(); | 277 UpdateServiceWorkers(host->IsPausedForDebugOnStart()); |
272 } | 278 } |
273 | 279 |
274 void TargetHandler::WorkerVersionInstalled( | 280 void TargetHandler::WorkerVersionInstalled( |
275 ServiceWorkerDevToolsAgentHost* host) { | 281 ServiceWorkerDevToolsAgentHost* host) { |
276 UpdateServiceWorkers(); | 282 UpdateServiceWorkers(); |
277 } | 283 } |
278 | 284 |
279 void TargetHandler::WorkerVersionDoomed( | 285 void TargetHandler::WorkerVersionDoomed( |
280 ServiceWorkerDevToolsAgentHost* host) { | 286 ServiceWorkerDevToolsAgentHost* host) { |
281 UpdateServiceWorkers(); | 287 UpdateServiceWorkers(); |
282 } | 288 } |
283 | 289 |
284 void TargetHandler::WorkerDestroyed( | 290 void TargetHandler::WorkerDestroyed( |
285 ServiceWorkerDevToolsAgentHost* host) { | 291 ServiceWorkerDevToolsAgentHost* host) { |
286 UpdateServiceWorkers(); | 292 UpdateServiceWorkers(); |
287 } | 293 } |
288 | 294 |
289 } // namespace target | 295 } // namespace target |
290 } // namespace devtools | 296 } // namespace devtools |
291 } // namespace content | 297 } // namespace content |
OLD | NEW |