Index: content/browser/devtools/embedded_worker_devtools_manager.cc |
diff --git a/content/browser/devtools/embedded_worker_devtools_manager.cc b/content/browser/devtools/embedded_worker_devtools_manager.cc |
index 3ba61aafeea20e9b12ec8973ef32aa1e3f5cd7cb..0b5395848f499f328b94748ffc5767ff3fa3dacf 100644 |
--- a/content/browser/devtools/embedded_worker_devtools_manager.cc |
+++ b/content/browser/devtools/embedded_worker_devtools_manager.cc |
@@ -8,6 +8,8 @@ |
#include "content/browser/devtools/devtools_protocol.h" |
#include "content/browser/devtools/devtools_protocol_constants.h" |
#include "content/browser/devtools/ipc_devtools_agent_host.h" |
+#include "content/browser/service_worker/service_worker_context_core.h" |
+#include "content/browser/service_worker/service_worker_version.h" |
#include "content/browser/shared_worker/shared_worker_instance.h" |
#include "content/common/devtools_messages.h" |
#include "content/public/browser/browser_thread.h" |
@@ -35,15 +37,18 @@ bool SendMessageToWorker( |
} // namespace |
EmbeddedWorkerDevToolsManager::ServiceWorkerIdentifier::ServiceWorkerIdentifier( |
- const ServiceWorkerContextCore* const service_worker_context, |
+ const ServiceWorkerContextCore* service_worker_context, |
+ base::WeakPtr<ServiceWorkerContextCore> service_worker_context_weak, |
int64 service_worker_version_id) |
: service_worker_context_(service_worker_context), |
+ service_worker_context_weak_(service_worker_context_weak), |
service_worker_version_id_(service_worker_version_id) { |
} |
EmbeddedWorkerDevToolsManager::ServiceWorkerIdentifier::ServiceWorkerIdentifier( |
const ServiceWorkerIdentifier& other) |
: service_worker_context_(other.service_worker_context_), |
+ service_worker_context_weak_(other.service_worker_context_weak_), |
service_worker_version_id_(other.service_worker_version_id_) { |
} |
@@ -88,13 +93,13 @@ class EmbeddedWorkerDevToolsManager::EmbeddedWorkerDevToolsAgentHost |
: public IPCDevToolsAgentHost, |
public IPC::Listener { |
public: |
- explicit EmbeddedWorkerDevToolsAgentHost(WorkerId worker_id) |
- : worker_id_(worker_id), worker_attached_(false) { |
- AttachToWorker(); |
+ EmbeddedWorkerDevToolsAgentHost(WorkerId worker_id, const GURL& url) |
+ : worker_id_(worker_id), worker_attached_(false), url_(url) { |
} |
// DevToolsAgentHost override. |
virtual bool IsWorker() const OVERRIDE { return true; } |
+ virtual GURL GetURL() OVERRIDE { return url_; } |
// IPCDevToolsAgentHost implementation. |
virtual void SendMessageToAgent(IPC::Message* message) OVERRIDE { |
@@ -169,6 +174,7 @@ class EmbeddedWorkerDevToolsManager::EmbeddedWorkerDevToolsAgentHost |
WorkerId worker_id_; |
bool worker_attached_; |
+ GURL url_; |
std::string state_; |
DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerDevToolsAgentHost); |
}; |
@@ -179,9 +185,17 @@ EmbeddedWorkerDevToolsManager* EmbeddedWorkerDevToolsManager::GetInstance() { |
return Singleton<EmbeddedWorkerDevToolsManager>::get(); |
} |
-DevToolsAgentHost* EmbeddedWorkerDevToolsManager::GetDevToolsAgentHostForWorker( |
+DevToolsAgentHost* |
+EmbeddedWorkerDevToolsManager::GetDevToolsAgentHostForWorker( |
int worker_process_id, |
int worker_route_id) { |
+ return GetOrCreateAgentHost(worker_process_id, worker_route_id, GURL()); |
+} |
+ |
+DevToolsAgentHost* EmbeddedWorkerDevToolsManager::GetOrCreateAgentHost( |
+ int worker_process_id, |
+ int worker_route_id, |
+ const GURL& url) { |
WorkerId id(worker_process_id, worker_route_id); |
WorkerInfoMap::iterator it = workers_.find(id); |
@@ -195,7 +209,7 @@ DevToolsAgentHost* EmbeddedWorkerDevToolsManager::GetDevToolsAgentHostForWorker( |
} |
EmbeddedWorkerDevToolsAgentHost* agent_host = |
- new EmbeddedWorkerDevToolsAgentHost(id); |
+ new EmbeddedWorkerDevToolsAgentHost(id, url); |
info->set_agent_host(agent_host); |
info->set_state(WORKER_INSPECTED); |
return agent_host; |
@@ -210,6 +224,63 @@ EmbeddedWorkerDevToolsManager::GetDevToolsAgentHostForServiceWorker( |
return GetDevToolsAgentHostForWorker(it->first.first, it->first.second); |
} |
+void EmbeddedWorkerDevToolsManager::GetOrCreateAllHosts( |
+ const DevToolsAgentHost::Callback& callback) { |
+ std::map<WorkerId, ServiceWorkerIdentifier> ids; |
+ for (WorkerInfoMap::iterator it = workers_.begin(); |
+ it != workers_.end(); ++it) { |
+ if (const ServiceWorkerIdentifier* worker_id = |
+ it->second->service_worker_id()) { |
+ ids.insert(std::make_pair(it->first, *worker_id)); |
+ } |
+ } |
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
+ base::Bind(&EmbeddedWorkerDevToolsManager::GetServiceWorkerUrlsOnIO, |
+ ids, callback)); |
+} |
+ |
+// static |
+void EmbeddedWorkerDevToolsManager::GetServiceWorkerUrlsOnIO( |
+ const std::map<WorkerId, ServiceWorkerIdentifier>& ids, |
+ const DevToolsAgentHost::Callback& callback) { |
+ std::map<WorkerId, GURL> url_map; |
+ for (std::map<WorkerId, ServiceWorkerIdentifier>::const_iterator it = |
+ ids.begin(); it != ids.end(); ++it) { |
+ if (ServiceWorkerContextCore* context = |
+ it->second.service_worker_context_weak_.get()) { |
+ if (ServiceWorkerVersion* version = |
+ context->GetLiveVersion(it->second.service_worker_version_id_)) { |
+ url_map[it->first] = version->script_url(); |
+ } |
+ } |
+ } |
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
+ base::Bind(&EmbeddedWorkerDevToolsManager::CreateAgentHosts, |
+ url_map, callback)); |
+} |
+ |
+// static |
+void EmbeddedWorkerDevToolsManager::CreateAgentHosts( |
+ const std::map<WorkerId, GURL> url_map, |
+ const DevToolsAgentHost::Callback& callback) { |
+ DevToolsAgentHost::List agent_hosts; |
+ EmbeddedWorkerDevToolsManager* instance = GetInstance(); |
+ for (WorkerInfoMap::iterator it = instance->workers_.begin(); |
+ it != instance->workers_.end(); ++it) { |
+ if (it->second->service_worker_id()) { |
+ std::map<WorkerId, GURL>::const_iterator url_it = url_map.find(it->first); |
+ if (url_it != url_map.end()) { |
+ agent_hosts.push_back(instance->GetOrCreateAgentHost( |
+ it->first.first, it->first.second, url_it->second)); |
+ } |
+ } else { |
+ agent_hosts.push_back(instance->GetOrCreateAgentHost( |
+ it->first.first, it->first.second, GURL())); |
+ } |
+ } |
+ callback.Run(agent_hosts); |
+} |
+ |
EmbeddedWorkerDevToolsManager::EmbeddedWorkerDevToolsManager() |
: debug_service_worker_on_start_(false) { |
} |