| 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 |