OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |