Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(286)

Side by Side Diff: content/browser/devtools/protocol/target_auto_attacher.cc

Issue 2969753002: [DevTools] Split auto-attach part of TargetHandler into a separate class (Closed)
Patch Set: rebased, addressed comment Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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_auto_attacher.h"
6 6
7 #include "content/browser/devtools/devtools_manager.h"
8 #include "content/browser/devtools/devtools_session.h"
9 #include "content/browser/devtools/render_frame_devtools_agent_host.h" 7 #include "content/browser/devtools/render_frame_devtools_agent_host.h"
10 #include "content/browser/devtools/service_worker_devtools_agent_host.h" 8 #include "content/browser/devtools/service_worker_devtools_agent_host.h"
11 #include "content/browser/frame_host/frame_tree.h" 9 #include "content/browser/frame_host/frame_tree.h"
12 #include "content/browser/frame_host/frame_tree_node.h" 10 #include "content/browser/frame_host/frame_tree_node.h"
13 #include "content/browser/frame_host/render_frame_host_impl.h" 11 #include "content/browser/frame_host/render_frame_host_impl.h"
14 12
15 namespace content { 13 namespace content {
16 namespace protocol { 14 namespace protocol {
17 15
18 namespace { 16 namespace {
19 17
20 using ScopeAgentsMap = 18 using ScopeAgentsMap =
21 std::map<GURL, std::unique_ptr<ServiceWorkerDevToolsAgentHost::List>>; 19 std::map<GURL, std::unique_ptr<ServiceWorkerDevToolsAgentHost::List>>;
22 20
23 void GetMatchingHostsByScopeMap( 21 void GetMatchingHostsByScopeMap(
24 const ServiceWorkerDevToolsAgentHost::List& agent_hosts, 22 const ServiceWorkerDevToolsAgentHost::List& agent_hosts,
25 const std::set<GURL>& urls, 23 const base::flat_set<GURL>& urls,
26 ScopeAgentsMap* scope_agents_map) { 24 ScopeAgentsMap* scope_agents_map) {
27 std::set<base::StringPiece> host_name_set; 25 base::flat_set<base::StringPiece> host_name_set;
28 for (const GURL& url : urls) 26 for (const GURL& url : urls)
29 host_name_set.insert(url.host_piece()); 27 host_name_set.insert(url.host_piece());
30 for (const auto& host : agent_hosts) { 28 for (const auto& host : agent_hosts) {
31 if (host_name_set.find(host->scope().host_piece()) == host_name_set.end()) 29 if (host_name_set.find(host->scope().host_piece()) == host_name_set.end())
32 continue; 30 continue;
33 const auto& it = scope_agents_map->find(host->scope()); 31 const auto& it = scope_agents_map->find(host->scope());
34 if (it == scope_agents_map->end()) { 32 if (it == scope_agents_map->end()) {
35 std::unique_ptr<ServiceWorkerDevToolsAgentHost::List> new_list( 33 std::unique_ptr<ServiceWorkerDevToolsAgentHost::List> new_list(
36 new ServiceWorkerDevToolsAgentHost::List()); 34 new ServiceWorkerDevToolsAgentHost::List());
37 new_list->push_back(host); 35 new_list->push_back(host);
(...skipping 20 matching lines...) Expand all
58 if (host->version_doomed_time().is_null() || 56 if (host->version_doomed_time().is_null() ||
59 (last_installed_time < last_doomed_time && 57 (last_installed_time < last_doomed_time &&
60 last_doomed_time == host->version_doomed_time())) { 58 last_doomed_time == host->version_doomed_time())) {
61 (*result)[host->GetId()] = host; 59 (*result)[host->GetId()] = host;
62 } 60 }
63 } 61 }
64 } 62 }
65 63
66 ServiceWorkerDevToolsAgentHost::Map GetMatchingServiceWorkers( 64 ServiceWorkerDevToolsAgentHost::Map GetMatchingServiceWorkers(
67 BrowserContext* browser_context, 65 BrowserContext* browser_context,
68 const std::set<GURL>& urls) { 66 const base::flat_set<GURL>& urls) {
69 ServiceWorkerDevToolsAgentHost::Map result; 67 ServiceWorkerDevToolsAgentHost::Map result;
70 if (!browser_context) 68 if (!browser_context)
71 return result; 69 return result;
72 70
73 ServiceWorkerDevToolsAgentHost::List agent_hosts; 71 ServiceWorkerDevToolsAgentHost::List agent_hosts;
74 ServiceWorkerDevToolsManager::GetInstance() 72 ServiceWorkerDevToolsManager::GetInstance()
75 ->AddAllAgentHostsForBrowserContext(browser_context, &agent_hosts); 73 ->AddAllAgentHostsForBrowserContext(browser_context, &agent_hosts);
76 74
77 ScopeAgentsMap scope_agents_map; 75 ScopeAgentsMap scope_agents_map;
78 GetMatchingHostsByScopeMap(agent_hosts, urls, &scope_agents_map); 76 GetMatchingHostsByScopeMap(agent_hosts, urls, &scope_agents_map);
79 77
80 for (const auto& it : scope_agents_map) 78 for (const auto& it : scope_agents_map)
81 AddEligibleHosts(*it.second.get(), &result); 79 AddEligibleHosts(*it.second.get(), &result);
82 80
83 return result; 81 return result;
84 } 82 }
85 83
86 std::unique_ptr<Target::TargetInfo> CreateInfo(DevToolsAgentHost* host) {
87 return Target::TargetInfo::Create()
88 .SetTargetId(host->GetId())
89 .SetTitle(host->GetTitle())
90 .SetUrl(host->GetURL().spec())
91 .SetType(host->GetType())
92 .SetAttached(host->IsAttached())
93 .Build();
94 }
95
96 } // namespace 84 } // namespace
97 85
98 TargetHandler::TargetHandler() 86 TargetAutoAttacher::TargetAutoAttacher(AttachCallback attach_callback,
99 : DevToolsDomainHandler(Target::Metainfo::domainName), 87 DetachCallback detach_callback)
100 discover_(false), 88 : attach_callback_(attach_callback),
89 detach_callback_(detach_callback),
90 render_frame_host_(nullptr),
101 auto_attach_(false), 91 auto_attach_(false),
102 wait_for_debugger_on_start_(false), 92 wait_for_debugger_on_start_(false),
103 attach_to_frames_(false), 93 attach_to_frames_(false) {}
104 render_frame_host_(nullptr) { 94
95 TargetAutoAttacher::~TargetAutoAttacher() {}
96
97 void TargetAutoAttacher::SetRenderFrameHost(
98 RenderFrameHostImpl* render_frame_host) {
99 render_frame_host_ = render_frame_host;
100 UpdateFrames();
101 ReattachServiceWorkers(false);
105 } 102 }
106 103
107 TargetHandler::~TargetHandler() { 104 void TargetAutoAttacher::UpdateServiceWorkers() {
105 ReattachServiceWorkers(false);
108 } 106 }
109 107
110 // static 108 void TargetAutoAttacher::UpdateFrames() {
111 std::vector<TargetHandler*> TargetHandler::ForAgentHost(
112 DevToolsAgentHostImpl* host) {
113 return DevToolsSession::HandlersForAgentHost<TargetHandler>(
114 host, Target::Metainfo::domainName);
115 }
116
117 void TargetHandler::Wire(UberDispatcher* dispatcher) {
118 frontend_.reset(new Target::Frontend(dispatcher->channel()));
119 Target::Dispatcher::wire(dispatcher, this);
120 }
121
122 void TargetHandler::SetRenderFrameHost(RenderFrameHostImpl* render_frame_host) {
123 render_frame_host_ = render_frame_host;
124 UpdateFrames();
125 }
126
127 Response TargetHandler::Disable() {
128 SetAutoAttach(false, false);
129 SetDiscoverTargets(false);
130 for (const auto& id_host : attached_hosts_)
131 id_host.second->DetachClient(this);
132 attached_hosts_.clear();
133 return Response::OK();
134 }
135
136 void TargetHandler::UpdateServiceWorkers() {
137 UpdateServiceWorkers(false);
138 }
139
140 void TargetHandler::UpdateFrames() {
141 if (!auto_attach_ || !attach_to_frames_) 109 if (!auto_attach_ || !attach_to_frames_)
142 return; 110 return;
143 111
144 HostsMap new_hosts; 112 Hosts new_hosts;
145 if (render_frame_host_) { 113 if (render_frame_host_) {
146 FrameTreeNode* root = render_frame_host_->frame_tree_node(); 114 FrameTreeNode* root = render_frame_host_->frame_tree_node();
147 std::queue<FrameTreeNode*> queue; 115 std::queue<FrameTreeNode*> queue;
148 queue.push(root); 116 queue.push(root);
149 while (!queue.empty()) { 117 while (!queue.empty()) {
150 FrameTreeNode* node = queue.front(); 118 FrameTreeNode* node = queue.front();
151 queue.pop(); 119 queue.pop();
152 bool cross_process = node->current_frame_host()->IsCrossProcessSubframe(); 120 bool cross_process = node->current_frame_host()->IsCrossProcessSubframe();
153 if (node != root && cross_process) { 121 if (node != root && cross_process) {
154 scoped_refptr<DevToolsAgentHost> new_host = 122 scoped_refptr<DevToolsAgentHost> new_host =
155 RenderFrameDevToolsAgentHost::GetOrCreateFor(node); 123 RenderFrameDevToolsAgentHost::GetOrCreateFor(node);
156 new_hosts[new_host->GetId()] = new_host; 124 new_hosts.insert(new_host);
157 } else { 125 } else {
158 for (size_t i = 0; i < node->child_count(); ++i) 126 for (size_t i = 0; i < node->child_count(); ++i)
159 queue.push(node->child_at(i)); 127 queue.push(node->child_at(i));
160 } 128 }
161 } 129 }
162 } 130 }
163 131
164 // TODO(dgozman): support wait_for_debugger_on_start_. 132 // TODO(dgozman): support wait_for_debugger_on_start_.
165 ReattachTargetsOfType(new_hosts, DevToolsAgentHost::kTypeFrame, false); 133 ReattachTargetsOfType(new_hosts, DevToolsAgentHost::kTypeFrame, false);
166 } 134 }
167 135
168 void TargetHandler::UpdateServiceWorkers(bool waiting_for_debugger) { 136 void TargetAutoAttacher::AgentHostClosed(DevToolsAgentHost* host) {
137 auto_attached_hosts_.erase(host);
138 }
139
140 void TargetAutoAttacher::ReattachServiceWorkers(bool waiting_for_debugger) {
169 if (!auto_attach_) 141 if (!auto_attach_)
170 return; 142 return;
171 143
172 frame_urls_.clear(); 144 frame_urls_.clear();
173 BrowserContext* browser_context = nullptr; 145 BrowserContext* browser_context = nullptr;
174 if (render_frame_host_) { 146 if (render_frame_host_) {
175 // TODO(dgozman): do not traverse inside cross-process subframes. 147 // TODO(dgozman): do not traverse inside cross-process subframes.
176 for (FrameTreeNode* node : 148 for (FrameTreeNode* node :
177 render_frame_host_->frame_tree_node()->frame_tree()->Nodes()) { 149 render_frame_host_->frame_tree_node()->frame_tree()->Nodes()) {
178 frame_urls_.insert(node->current_url()); 150 frame_urls_.insert(node->current_url());
179 } 151 }
180 browser_context = render_frame_host_->GetProcess()->GetBrowserContext(); 152 browser_context = render_frame_host_->GetProcess()->GetBrowserContext();
181 } 153 }
182 154
183 auto matching = GetMatchingServiceWorkers(browser_context, frame_urls_); 155 auto matching = GetMatchingServiceWorkers(browser_context, frame_urls_);
184 HostsMap new_hosts; 156 Hosts new_hosts;
185 for (const auto& pair : matching) { 157 for (const auto& pair : matching) {
186 if (pair.second->IsReadyForInspection()) 158 if (pair.second->IsReadyForInspection())
187 new_hosts[pair.first] = pair.second; 159 new_hosts.insert(pair.second);
188 } 160 }
189 ReattachTargetsOfType( 161 ReattachTargetsOfType(new_hosts, DevToolsAgentHost::kTypeServiceWorker,
190 new_hosts, DevToolsAgentHost::kTypeServiceWorker, waiting_for_debugger); 162 waiting_for_debugger);
191 } 163 }
192 164
193 void TargetHandler::ReattachTargetsOfType( 165 void TargetAutoAttacher::ReattachTargetsOfType(const Hosts& new_hosts,
194 const HostsMap& new_hosts, 166 const std::string& type,
195 const std::string& type, 167 bool waiting_for_debugger) {
196 bool waiting_for_debugger) { 168 Hosts old_hosts = auto_attached_hosts_;
197 HostsMap old_hosts = attached_hosts_; 169 for (auto& it : old_hosts) {
198 for (const auto& pair : old_hosts) { 170 DevToolsAgentHost* host = it.get();
199 if (pair.second->GetType() == type && 171 if (host->GetType() == type && new_hosts.find(host) == new_hosts.end()) {
200 new_hosts.find(pair.first) == new_hosts.end()) { 172 auto_attached_hosts_.erase(host);
201 DetachFromTargetInternal(pair.second.get()); 173 detach_callback_.Run(host);
202 } 174 }
203 } 175 }
204 for (const auto& pair : new_hosts) { 176 for (auto& it : new_hosts) {
205 if (old_hosts.find(pair.first) == old_hosts.end()) 177 DevToolsAgentHost* host = it.get();
206 AttachToTargetInternal(pair.second.get(), waiting_for_debugger); 178 if (old_hosts.find(host) == old_hosts.end()) {
179 if (attach_callback_.Run(host, waiting_for_debugger))
180 auto_attached_hosts_.insert(host);
181 }
207 } 182 }
208 } 183 }
209 184
210 void TargetHandler::TargetCreatedInternal(DevToolsAgentHost* host) { 185 void TargetAutoAttacher::SetAutoAttach(bool auto_attach,
211 if (reported_hosts_.find(host->GetId()) != reported_hosts_.end()) 186 bool wait_for_debugger_on_start) {
212 return;
213 frontend_->TargetCreated(CreateInfo(host));
214 reported_hosts_[host->GetId()] = host;
215 }
216
217 void TargetHandler::TargetInfoChangedInternal(DevToolsAgentHost* host) {
218 if (reported_hosts_.find(host->GetId()) == reported_hosts_.end())
219 return;
220 frontend_->TargetInfoChanged(CreateInfo(host));
221 }
222
223 void TargetHandler::TargetDestroyedInternal(DevToolsAgentHost* host) {
224 auto it = reported_hosts_.find(host->GetId());
225 if (it == reported_hosts_.end())
226 return;
227 if (discover_)
228 frontend_->TargetDestroyed(host->GetId());
229 reported_hosts_.erase(it);
230 }
231
232 bool TargetHandler::AttachToTargetInternal(
233 DevToolsAgentHost* host, bool waiting_for_debugger) {
234 attached_hosts_[host->GetId()] = host;
235 if (!host->AttachClient(this)) {
236 attached_hosts_.erase(host->GetId());
237 return false;
238 }
239 frontend_->AttachedToTarget(CreateInfo(host), waiting_for_debugger);
240 return true;
241 }
242
243 void TargetHandler::DetachFromTargetInternal(DevToolsAgentHost* host) {
244 auto it = attached_hosts_.find(host->GetId());
245 if (it == attached_hosts_.end())
246 return;
247 host->DetachClient(this);
248 frontend_->DetachedFromTarget(host->GetId());
249 attached_hosts_.erase(it);
250 }
251
252 // ----------------- Protocol ----------------------
253
254 Response TargetHandler::SetDiscoverTargets(bool discover) {
255 if (discover_ == discover)
256 return Response::OK();
257 discover_ = discover;
258 if (discover_) {
259 DevToolsAgentHost::AddObserver(this);
260 } else {
261 DevToolsAgentHost::RemoveObserver(this);
262 RawHostsMap copy = reported_hosts_;
263 for (const auto& id_host : copy)
264 TargetDestroyedInternal(id_host.second);
265 }
266 return Response::OK();
267 }
268
269 Response TargetHandler::SetAutoAttach(
270 bool auto_attach, bool wait_for_debugger_on_start) {
271 wait_for_debugger_on_start_ = wait_for_debugger_on_start; 187 wait_for_debugger_on_start_ = wait_for_debugger_on_start;
272 if (auto_attach_ == auto_attach) 188 if (auto_attach_ == auto_attach)
273 return Response::FallThrough(); 189 return;
274 auto_attach_ = auto_attach; 190 auto_attach_ = auto_attach;
275 if (auto_attach_) { 191 if (auto_attach_) {
276 ServiceWorkerDevToolsManager::GetInstance()->AddObserver(this); 192 ServiceWorkerDevToolsManager::GetInstance()->AddObserver(this);
277 UpdateServiceWorkers(); 193 ReattachServiceWorkers(false);
278 UpdateFrames(); 194 UpdateFrames();
279 } else { 195 } else {
280 ServiceWorkerDevToolsManager::GetInstance()->RemoveObserver(this); 196 ServiceWorkerDevToolsManager::GetInstance()->RemoveObserver(this);
281 HostsMap empty; 197 Hosts empty;
282 ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeFrame, false); 198 ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeFrame, false);
283 ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeServiceWorker, false); 199 ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeServiceWorker, false);
200 DCHECK(auto_attached_hosts_.empty());
284 } 201 }
285 return Response::FallThrough();
286 } 202 }
287 203
288 Response TargetHandler::SetAttachToFrames(bool value) { 204 void TargetAutoAttacher::SetAttachToFrames(bool attach_to_frames) {
289 if (attach_to_frames_ == value) 205 if (attach_to_frames_ == attach_to_frames)
290 return Response::OK(); 206 return;
291 attach_to_frames_ = value; 207 attach_to_frames_ = attach_to_frames;
292 if (attach_to_frames_) { 208 if (attach_to_frames_) {
293 UpdateFrames(); 209 UpdateFrames();
294 } else { 210 } else {
295 HostsMap empty; 211 Hosts empty;
296 ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeFrame, false); 212 ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeFrame, false);
297 } 213 }
298 return Response::OK();
299 }
300
301 Response TargetHandler::SetRemoteLocations(
302 std::unique_ptr<protocol::Array<Target::RemoteLocation>>) {
303 return Response::Error("Not supported");
304 }
305
306 Response TargetHandler::AttachToTarget(const std::string& target_id,
307 bool* out_success) {
308 // TODO(dgozman): only allow reported hosts.
309 scoped_refptr<DevToolsAgentHost> agent_host =
310 DevToolsAgentHost::GetForId(target_id);
311 if (!agent_host)
312 return Response::InvalidParams("No target with given id found");
313 *out_success = AttachToTargetInternal(agent_host.get(), false);
314 return Response::OK();
315 }
316
317 Response TargetHandler::DetachFromTarget(const std::string& target_id) {
318 auto it = attached_hosts_.find(target_id);
319 if (it == attached_hosts_.end())
320 return Response::Error("Not attached to the target");
321 DevToolsAgentHost* agent_host = it->second.get();
322 DetachFromTargetInternal(agent_host);
323 return Response::OK();
324 }
325
326 Response TargetHandler::SendMessageToTarget(
327 const std::string& target_id,
328 const std::string& message) {
329 auto it = attached_hosts_.find(target_id);
330 if (it == attached_hosts_.end())
331 return Response::FallThrough();
332 it->second->DispatchProtocolMessage(this, message);
333 return Response::OK();
334 }
335
336 Response TargetHandler::GetTargetInfo(
337 const std::string& target_id,
338 std::unique_ptr<Target::TargetInfo>* target_info) {
339 // TODO(dgozman): only allow reported hosts.
340 scoped_refptr<DevToolsAgentHost> agent_host(
341 DevToolsAgentHost::GetForId(target_id));
342 if (!agent_host)
343 return Response::InvalidParams("No target with given id found");
344 *target_info = CreateInfo(agent_host.get());
345 return Response::OK();
346 }
347
348 Response TargetHandler::ActivateTarget(const std::string& target_id) {
349 // TODO(dgozman): only allow reported hosts.
350 scoped_refptr<DevToolsAgentHost> agent_host(
351 DevToolsAgentHost::GetForId(target_id));
352 if (!agent_host)
353 return Response::InvalidParams("No target with given id found");
354 agent_host->Activate();
355 return Response::OK();
356 }
357
358 Response TargetHandler::CloseTarget(const std::string& target_id,
359 bool* out_success) {
360 scoped_refptr<DevToolsAgentHost> agent_host =
361 DevToolsAgentHost::GetForId(target_id);
362 if (!agent_host)
363 return Response::InvalidParams("No target with given id found");
364 *out_success = agent_host->Close();
365 return Response::OK();
366 }
367
368 Response TargetHandler::CreateBrowserContext(std::string* out_context_id) {
369 return Response::Error("Not supported");
370 }
371
372 Response TargetHandler::DisposeBrowserContext(const std::string& context_id,
373 bool* out_success) {
374 return Response::Error("Not supported");
375 }
376
377 Response TargetHandler::CreateTarget(const std::string& url,
378 Maybe<int> width,
379 Maybe<int> height,
380 Maybe<std::string> context_id,
381 std::string* out_target_id) {
382 DevToolsManagerDelegate* delegate =
383 DevToolsManager::GetInstance()->delegate();
384 if (!delegate)
385 return Response::Error("Not supported");
386 scoped_refptr<content::DevToolsAgentHost> agent_host =
387 delegate->CreateNewTarget(GURL(url));
388 if (!agent_host)
389 return Response::Error("Not supported");
390 *out_target_id = agent_host->GetId();
391 return Response::OK();
392 }
393
394 Response TargetHandler::GetTargets(
395 std::unique_ptr<protocol::Array<Target::TargetInfo>>* target_infos) {
396 *target_infos = protocol::Array<Target::TargetInfo>::create();
397 for (const auto& host : DevToolsAgentHost::GetOrCreateAll())
398 (*target_infos)->addItem(CreateInfo(host.get()));
399 return Response::OK();
400 }
401
402 // ---------------- DevToolsAgentHostClient ----------------
403
404 void TargetHandler::DispatchProtocolMessage(
405 DevToolsAgentHost* host,
406 const std::string& message) {
407 auto it = attached_hosts_.find(host->GetId());
408 if (it == attached_hosts_.end())
409 return; // Already disconnected.
410
411 frontend_->ReceivedMessageFromTarget(host->GetId(), message);
412 }
413
414 void TargetHandler::AgentHostClosed(
415 DevToolsAgentHost* host,
416 bool replaced_with_another_client) {
417 frontend_->DetachedFromTarget(host->GetId());
418 attached_hosts_.erase(host->GetId());
419 }
420
421 // -------------- DevToolsAgentHostObserver -----------------
422
423 bool TargetHandler::ShouldForceDevToolsAgentHostCreation() {
424 return true;
425 }
426
427 void TargetHandler::DevToolsAgentHostCreated(DevToolsAgentHost* agent_host) {
428 // If we start discovering late, all existing agent hosts will be reported,
429 // but we could have already attached to some.
430 TargetCreatedInternal(agent_host);
431 }
432
433 void TargetHandler::DevToolsAgentHostDestroyed(DevToolsAgentHost* agent_host) {
434 DCHECK(attached_hosts_.find(agent_host->GetId()) == attached_hosts_.end());
435 TargetDestroyedInternal(agent_host);
436 }
437
438 void TargetHandler::DevToolsAgentHostAttached(DevToolsAgentHost* host) {
439 TargetInfoChangedInternal(host);
440 }
441
442 void TargetHandler::DevToolsAgentHostDetached(DevToolsAgentHost* host) {
443 TargetInfoChangedInternal(host);
444 } 214 }
445 215
446 // -------- ServiceWorkerDevToolsManager::Observer ---------- 216 // -------- ServiceWorkerDevToolsManager::Observer ----------
447 217
448 void TargetHandler::WorkerCreated( 218 void TargetAutoAttacher::WorkerCreated(ServiceWorkerDevToolsAgentHost* host) {
449 ServiceWorkerDevToolsAgentHost* host) {
450 BrowserContext* browser_context = nullptr; 219 BrowserContext* browser_context = nullptr;
451 if (render_frame_host_) 220 if (render_frame_host_)
452 browser_context = render_frame_host_->GetProcess()->GetBrowserContext(); 221 browser_context = render_frame_host_->GetProcess()->GetBrowserContext();
453 auto hosts = GetMatchingServiceWorkers(browser_context, frame_urls_); 222 auto hosts = GetMatchingServiceWorkers(browser_context, frame_urls_);
454 if (hosts.find(host->GetId()) != hosts.end() && !host->IsAttached() && 223 if (hosts.find(host->GetId()) != hosts.end() && !host->IsAttached() &&
455 !host->IsPausedForDebugOnStart() && wait_for_debugger_on_start_) { 224 !host->IsPausedForDebugOnStart() && wait_for_debugger_on_start_) {
456 host->PauseForDebugOnStart(); 225 host->PauseForDebugOnStart();
457 } 226 }
458 } 227 }
459 228
460 void TargetHandler::WorkerReadyForInspection( 229 void TargetAutoAttacher::WorkerReadyForInspection(
461 ServiceWorkerDevToolsAgentHost* host) { 230 ServiceWorkerDevToolsAgentHost* host) {
462 DCHECK(host->IsReadyForInspection()); 231 DCHECK(host->IsReadyForInspection());
463 if (ServiceWorkerDevToolsManager::GetInstance() 232 if (ServiceWorkerDevToolsManager::GetInstance()
464 ->debug_service_worker_on_start()) { 233 ->debug_service_worker_on_start()) {
465 // When debug_service_worker_on_start is true, a new DevTools window will 234 // When debug_service_worker_on_start is true, a new DevTools window will
466 // be opened in ServiceWorkerDevToolsManager::WorkerReadyForInspection. 235 // be opened in ServiceWorkerDevToolsManager::WorkerReadyForInspection.
467 return; 236 return;
468 } 237 }
469 UpdateServiceWorkers(host->IsPausedForDebugOnStart()); 238 ReattachServiceWorkers(host->IsPausedForDebugOnStart());
470 } 239 }
471 240
472 void TargetHandler::WorkerVersionInstalled( 241 void TargetAutoAttacher::WorkerVersionInstalled(
473 ServiceWorkerDevToolsAgentHost* host) { 242 ServiceWorkerDevToolsAgentHost* host) {
474 UpdateServiceWorkers(); 243 ReattachServiceWorkers(false);
475 } 244 }
476 245
477 void TargetHandler::WorkerVersionDoomed( 246 void TargetAutoAttacher::WorkerVersionDoomed(
478 ServiceWorkerDevToolsAgentHost* host) { 247 ServiceWorkerDevToolsAgentHost* host) {
479 UpdateServiceWorkers(); 248 ReattachServiceWorkers(false);
480 } 249 }
481 250
482 void TargetHandler::WorkerDestroyed( 251 void TargetAutoAttacher::WorkerDestroyed(ServiceWorkerDevToolsAgentHost* host) {
483 ServiceWorkerDevToolsAgentHost* host) { 252 ReattachServiceWorkers(false);
484 UpdateServiceWorkers();
485 } 253 }
486 254
487 } // namespace protocol 255 } // namespace protocol
488 } // namespace content 256 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/devtools/protocol/target_auto_attacher.h ('k') | content/browser/devtools/protocol/target_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698