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

Side by Side Diff: content/browser/devtools/embedded_worker_devtools_manager.cc

Issue 349033009: DevTools: Added service workers to chrome://inspect/#devices (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added GetOrCreateAllHosts Created 6 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/embedded_worker_devtools_manager.h" 5 #include "content/browser/devtools/embedded_worker_devtools_manager.h"
6 6
7 #include "content/browser/devtools/devtools_manager_impl.h" 7 #include "content/browser/devtools/devtools_manager_impl.h"
8 #include "content/browser/devtools/devtools_protocol.h" 8 #include "content/browser/devtools/devtools_protocol.h"
9 #include "content/browser/devtools/devtools_protocol_constants.h" 9 #include "content/browser/devtools/devtools_protocol_constants.h"
10 #include "content/browser/devtools/ipc_devtools_agent_host.h" 10 #include "content/browser/devtools/ipc_devtools_agent_host.h"
11 #include "content/browser/service_worker/service_worker_context_core.h"
12 #include "content/browser/service_worker/service_worker_version.h"
11 #include "content/browser/shared_worker/shared_worker_instance.h" 13 #include "content/browser/shared_worker/shared_worker_instance.h"
12 #include "content/common/devtools_messages.h" 14 #include "content/common/devtools_messages.h"
13 #include "content/public/browser/browser_thread.h" 15 #include "content/public/browser/browser_thread.h"
14 #include "content/public/browser/render_process_host.h" 16 #include "content/public/browser/render_process_host.h"
15 #include "content/public/browser/worker_service.h" 17 #include "content/public/browser/worker_service.h"
16 #include "ipc/ipc_listener.h" 18 #include "ipc/ipc_listener.h"
17 19
18 namespace content { 20 namespace content {
19 21
20 namespace { 22 namespace {
21 23
22 bool SendMessageToWorker( 24 bool SendMessageToWorker(
23 const EmbeddedWorkerDevToolsManager::WorkerId& worker_id, 25 const EmbeddedWorkerDevToolsManager::WorkerId& worker_id,
24 IPC::Message* message) { 26 IPC::Message* message) {
25 RenderProcessHost* host = RenderProcessHost::FromID(worker_id.first); 27 RenderProcessHost* host = RenderProcessHost::FromID(worker_id.first);
26 if (!host) { 28 if (!host) {
27 delete message; 29 delete message;
28 return false; 30 return false;
29 } 31 }
30 message->set_routing_id(worker_id.second); 32 message->set_routing_id(worker_id.second);
31 host->Send(message); 33 host->Send(message);
32 return true; 34 return true;
33 } 35 }
34 36
35 } // namespace 37 } // namespace
36 38
37 EmbeddedWorkerDevToolsManager::ServiceWorkerIdentifier::ServiceWorkerIdentifier( 39 EmbeddedWorkerDevToolsManager::ServiceWorkerIdentifier::ServiceWorkerIdentifier(
38 const ServiceWorkerContextCore* const service_worker_context, 40 const ServiceWorkerContextCore* service_worker_context,
41 base::WeakPtr<ServiceWorkerContextCore> service_worker_context_weak,
39 int64 service_worker_version_id) 42 int64 service_worker_version_id)
40 : service_worker_context_(service_worker_context), 43 : service_worker_context_(service_worker_context),
44 service_worker_context_weak_(service_worker_context_weak),
41 service_worker_version_id_(service_worker_version_id) { 45 service_worker_version_id_(service_worker_version_id) {
42 } 46 }
43 47
44 EmbeddedWorkerDevToolsManager::ServiceWorkerIdentifier::ServiceWorkerIdentifier( 48 EmbeddedWorkerDevToolsManager::ServiceWorkerIdentifier::ServiceWorkerIdentifier(
45 const ServiceWorkerIdentifier& other) 49 const ServiceWorkerIdentifier& other)
46 : service_worker_context_(other.service_worker_context_), 50 : service_worker_context_(other.service_worker_context_),
51 service_worker_context_weak_(other.service_worker_context_weak_),
47 service_worker_version_id_(other.service_worker_version_id_) { 52 service_worker_version_id_(other.service_worker_version_id_) {
48 } 53 }
49 54
50 bool EmbeddedWorkerDevToolsManager::ServiceWorkerIdentifier::Matches( 55 bool EmbeddedWorkerDevToolsManager::ServiceWorkerIdentifier::Matches(
51 const ServiceWorkerIdentifier& other) const { 56 const ServiceWorkerIdentifier& other) const {
52 return service_worker_context_ == other.service_worker_context_ && 57 return service_worker_context_ == other.service_worker_context_ &&
53 service_worker_version_id_ == other.service_worker_version_id_; 58 service_worker_version_id_ == other.service_worker_version_id_;
54 } 59 }
55 60
56 EmbeddedWorkerDevToolsManager::WorkerInfo::WorkerInfo( 61 EmbeddedWorkerDevToolsManager::WorkerInfo::WorkerInfo(
(...skipping 24 matching lines...) Expand all
81 return service_worker_id_->Matches(other); 86 return service_worker_id_->Matches(other);
82 } 87 }
83 88
84 EmbeddedWorkerDevToolsManager::WorkerInfo::~WorkerInfo() { 89 EmbeddedWorkerDevToolsManager::WorkerInfo::~WorkerInfo() {
85 } 90 }
86 91
87 class EmbeddedWorkerDevToolsManager::EmbeddedWorkerDevToolsAgentHost 92 class EmbeddedWorkerDevToolsManager::EmbeddedWorkerDevToolsAgentHost
88 : public IPCDevToolsAgentHost, 93 : public IPCDevToolsAgentHost,
89 public IPC::Listener { 94 public IPC::Listener {
90 public: 95 public:
91 explicit EmbeddedWorkerDevToolsAgentHost(WorkerId worker_id) 96 EmbeddedWorkerDevToolsAgentHost(WorkerId worker_id, const GURL& url)
92 : worker_id_(worker_id), worker_attached_(false) { 97 : worker_id_(worker_id), worker_attached_(false), url_(url) {
93 AttachToWorker();
94 } 98 }
95 99
96 // DevToolsAgentHost override. 100 // DevToolsAgentHost override.
97 virtual bool IsWorker() const OVERRIDE { return true; } 101 virtual bool IsWorker() const OVERRIDE { return true; }
102 virtual GURL GetURL() OVERRIDE { return url_; }
98 103
99 // IPCDevToolsAgentHost implementation. 104 // IPCDevToolsAgentHost implementation.
100 virtual void SendMessageToAgent(IPC::Message* message) OVERRIDE { 105 virtual void SendMessageToAgent(IPC::Message* message) OVERRIDE {
101 if (worker_attached_) 106 if (worker_attached_)
102 SendMessageToWorker(worker_id_, message); 107 SendMessageToWorker(worker_id_, message);
103 else 108 else
104 delete message; 109 delete message;
105 } 110 }
106 virtual void Attach() OVERRIDE { 111 virtual void Attach() OVERRIDE {
107 AttachToWorker(); 112 AttachToWorker();
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 if (worker_attached_) 167 if (worker_attached_)
163 return; 168 return;
164 worker_attached_ = true; 169 worker_attached_ = true;
165 AddRef(); 170 AddRef();
166 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) 171 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first))
167 host->AddRoute(worker_id_.second, this); 172 host->AddRoute(worker_id_.second, this);
168 } 173 }
169 174
170 WorkerId worker_id_; 175 WorkerId worker_id_;
171 bool worker_attached_; 176 bool worker_attached_;
177 GURL url_;
172 std::string state_; 178 std::string state_;
173 DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerDevToolsAgentHost); 179 DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerDevToolsAgentHost);
174 }; 180 };
175 181
176 // static 182 // static
177 EmbeddedWorkerDevToolsManager* EmbeddedWorkerDevToolsManager::GetInstance() { 183 EmbeddedWorkerDevToolsManager* EmbeddedWorkerDevToolsManager::GetInstance() {
178 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 184 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
179 return Singleton<EmbeddedWorkerDevToolsManager>::get(); 185 return Singleton<EmbeddedWorkerDevToolsManager>::get();
180 } 186 }
181 187
182 DevToolsAgentHost* EmbeddedWorkerDevToolsManager::GetDevToolsAgentHostForWorker( 188 DevToolsAgentHost*
189 EmbeddedWorkerDevToolsManager::GetDevToolsAgentHostForWorker(
183 int worker_process_id, 190 int worker_process_id,
184 int worker_route_id) { 191 int worker_route_id) {
192 return GetOrCreateAgentHost(worker_process_id, worker_route_id, GURL());
193 }
194
195 DevToolsAgentHost* EmbeddedWorkerDevToolsManager::GetOrCreateAgentHost(
196 int worker_process_id,
197 int worker_route_id,
198 const GURL& url) {
185 WorkerId id(worker_process_id, worker_route_id); 199 WorkerId id(worker_process_id, worker_route_id);
186 200
187 WorkerInfoMap::iterator it = workers_.find(id); 201 WorkerInfoMap::iterator it = workers_.find(id);
188 if (it == workers_.end()) 202 if (it == workers_.end())
189 return NULL; 203 return NULL;
190 204
191 WorkerInfo* info = it->second; 205 WorkerInfo* info = it->second;
192 if (info->state() != WORKER_UNINSPECTED && 206 if (info->state() != WORKER_UNINSPECTED &&
193 info->state() != WORKER_PAUSED_FOR_DEBUG_ON_START) { 207 info->state() != WORKER_PAUSED_FOR_DEBUG_ON_START) {
194 return info->agent_host(); 208 return info->agent_host();
195 } 209 }
196 210
197 EmbeddedWorkerDevToolsAgentHost* agent_host = 211 EmbeddedWorkerDevToolsAgentHost* agent_host =
198 new EmbeddedWorkerDevToolsAgentHost(id); 212 new EmbeddedWorkerDevToolsAgentHost(id, url);
199 info->set_agent_host(agent_host); 213 info->set_agent_host(agent_host);
200 info->set_state(WORKER_INSPECTED); 214 info->set_state(WORKER_INSPECTED);
201 return agent_host; 215 return agent_host;
202 } 216 }
203 217
204 DevToolsAgentHost* 218 DevToolsAgentHost*
205 EmbeddedWorkerDevToolsManager::GetDevToolsAgentHostForServiceWorker( 219 EmbeddedWorkerDevToolsManager::GetDevToolsAgentHostForServiceWorker(
206 const ServiceWorkerIdentifier& service_worker_id) { 220 const ServiceWorkerIdentifier& service_worker_id) {
207 WorkerInfoMap::iterator it = FindExistingServiceWorkerInfo(service_worker_id); 221 WorkerInfoMap::iterator it = FindExistingServiceWorkerInfo(service_worker_id);
208 if (it == workers_.end()) 222 if (it == workers_.end())
209 return NULL; 223 return NULL;
210 return GetDevToolsAgentHostForWorker(it->first.first, it->first.second); 224 return GetDevToolsAgentHostForWorker(it->first.first, it->first.second);
211 } 225 }
212 226
227 void EmbeddedWorkerDevToolsManager::GetOrCreateAllHosts(
228 const DevToolsAgentHost::Callback& callback) {
229 std::map<WorkerId, ServiceWorkerIdentifier> ids;
230 for (WorkerInfoMap::iterator it = workers_.begin();
231 it != workers_.end(); ++it) {
232 if (const ServiceWorkerIdentifier* worker_id =
233 it->second->service_worker_id()) {
234 ids.insert(std::make_pair(it->first, *worker_id));
235 }
236 }
237 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
238 base::Bind(&EmbeddedWorkerDevToolsManager::GetServiceWorkerUrlsOnIO,
239 ids, callback));
240 }
241
242 // static
243 void EmbeddedWorkerDevToolsManager::GetServiceWorkerUrlsOnIO(
244 const std::map<WorkerId, ServiceWorkerIdentifier>& ids,
245 const DevToolsAgentHost::Callback& callback) {
246 std::map<WorkerId, GURL> url_map;
247 for (std::map<WorkerId, ServiceWorkerIdentifier>::const_iterator it =
248 ids.begin(); it != ids.end(); ++it) {
249 if (ServiceWorkerContextCore* context =
250 it->second.service_worker_context_weak_.get()) {
251 if (ServiceWorkerVersion* version =
252 context->GetLiveVersion(it->second.service_worker_version_id_)) {
253 url_map[it->first] = version->script_url();
254 }
255 }
256 }
257 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
258 base::Bind(&EmbeddedWorkerDevToolsManager::CreateAgentHosts,
259 url_map, callback));
260 }
261
262 // static
263 void EmbeddedWorkerDevToolsManager::CreateAgentHosts(
264 const std::map<WorkerId, GURL> url_map,
265 const DevToolsAgentHost::Callback& callback) {
266 DevToolsAgentHost::List agent_hosts;
267 EmbeddedWorkerDevToolsManager* instance = GetInstance();
268 for (WorkerInfoMap::iterator it = instance->workers_.begin();
269 it != instance->workers_.end(); ++it) {
270 if (it->second->service_worker_id()) {
271 std::map<WorkerId, GURL>::const_iterator url_it = url_map.find(it->first);
272 if (url_it != url_map.end()) {
273 agent_hosts.push_back(instance->GetOrCreateAgentHost(
274 it->first.first, it->first.second, url_it->second));
275 }
276 } else {
277 agent_hosts.push_back(instance->GetOrCreateAgentHost(
278 it->first.first, it->first.second, GURL()));
279 }
280 }
281 callback.Run(agent_hosts);
282 }
283
213 EmbeddedWorkerDevToolsManager::EmbeddedWorkerDevToolsManager() 284 EmbeddedWorkerDevToolsManager::EmbeddedWorkerDevToolsManager()
214 : debug_service_worker_on_start_(false) { 285 : debug_service_worker_on_start_(false) {
215 } 286 }
216 287
217 EmbeddedWorkerDevToolsManager::~EmbeddedWorkerDevToolsManager() { 288 EmbeddedWorkerDevToolsManager::~EmbeddedWorkerDevToolsManager() {
218 } 289 }
219 290
220 bool EmbeddedWorkerDevToolsManager::SharedWorkerCreated( 291 bool EmbeddedWorkerDevToolsManager::SharedWorkerCreated(
221 int worker_process_id, 292 int worker_process_id,
222 int worker_route_id, 293 int worker_route_id,
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 scoped_ptr<WorkerInfo> info = workers_.take_and_erase(it); 441 scoped_ptr<WorkerInfo> info = workers_.take_and_erase(it);
371 info->set_state(WORKER_PAUSED_FOR_REATTACH); 442 info->set_state(WORKER_PAUSED_FOR_REATTACH);
372 workers_.set(id, info.Pass()); 443 workers_.set(id, info.Pass());
373 } 444 }
374 445
375 void EmbeddedWorkerDevToolsManager::ResetForTesting() { 446 void EmbeddedWorkerDevToolsManager::ResetForTesting() {
376 workers_.clear(); 447 workers_.clear();
377 } 448 }
378 449
379 } // namespace content 450 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698