Chromium Code Reviews| 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..2ed26a982b6bde88d25b567928f4f77799722b4f 100644 |
| --- a/content/browser/devtools/embedded_worker_devtools_manager.cc |
| +++ b/content/browser/devtools/embedded_worker_devtools_manager.cc |
| @@ -8,9 +8,12 @@ |
| #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" |
| +#include "content/public/browser/devtools_target.h" |
| #include "content/public/browser/render_process_host.h" |
| #include "content/public/browser/worker_service.h" |
| #include "ipc/ipc_listener.h" |
| @@ -32,10 +35,19 @@ bool SendMessageToWorker( |
| return true; |
| } |
| +void StatusNoOp(ServiceWorkerStatusCode status) { |
| +} |
| + |
| +void CloseServiceWorkerOnIO(ServiceWorkerContextCore* context, |
| + int64 version_id) { |
| + if (ServiceWorkerVersion* version = context->GetLiveVersion(version_id)) |
| + version->StopWorker(base::Bind(&StatusNoOp)); |
| +} |
| + |
| } // namespace |
| EmbeddedWorkerDevToolsManager::ServiceWorkerIdentifier::ServiceWorkerIdentifier( |
| - const ServiceWorkerContextCore* const service_worker_context, |
| + ServiceWorkerContextCore* const service_worker_context, |
| int64 service_worker_version_id) |
| : service_worker_context_(service_worker_context), |
| service_worker_version_id_(service_worker_version_id) { |
| @@ -173,13 +185,87 @@ class EmbeddedWorkerDevToolsManager::EmbeddedWorkerDevToolsAgentHost |
| DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerDevToolsAgentHost); |
| }; |
| +class EmbeddedWorkerDevToolsManager::ServiceWorkerTarget |
| + : public DevToolsTarget { |
| + public: |
| + ServiceWorkerTarget( |
| + EmbeddedWorkerDevToolsAgentHost* agent_host, const GURL& url) |
| + : agent_host_(agent_host), |
| + url_(url) { |
| + } |
| + |
| + virtual ~ServiceWorkerTarget() { |
| + } |
| + |
| + virtual std::string GetId() const OVERRIDE { |
| + return agent_host_->GetId(); |
| + } |
| + |
| + virtual std::string GetParentId() const OVERRIDE { |
| + return ""; |
| + } |
| + |
| + virtual std::string GetType() const OVERRIDE { |
| + return "worker"; |
| + } |
| + |
| + virtual std::string GetTitle() const OVERRIDE { |
| + return "Service Worker"; |
| + } |
| + |
| + virtual std::string GetDescription() const OVERRIDE { |
| + return "Service Worker"; |
| + } |
| + |
| + virtual GURL GetURL() const OVERRIDE { |
| + return url_; |
| + } |
| + |
| + virtual GURL GetFaviconURL() const OVERRIDE { |
| + return GURL(); |
| + } |
| + |
| + virtual base::TimeTicks GetLastActivityTime() const OVERRIDE { |
| + return base::TimeTicks(); |
| + } |
| + |
| + virtual bool IsAttached() const OVERRIDE { |
| + return agent_host_->IsAttached(); |
| + } |
| + |
| + virtual scoped_refptr<DevToolsAgentHost> GetAgentHost() const OVERRIDE { |
| + return agent_host_; |
| + } |
| + |
| + virtual bool Activate() const OVERRIDE { |
| + return false; |
| + } |
| + |
| + virtual bool Close() const OVERRIDE { |
| + return EmbeddedWorkerDevToolsManager::GetInstance()->CloseServiceWorker( |
| + agent_host_->worker_id()); |
| + } |
| + |
| + private: |
| + EmbeddedWorkerDevToolsAgentHost* agent_host_; |
| + GURL url_; |
| +}; |
| + |
| // static |
| EmbeddedWorkerDevToolsManager* EmbeddedWorkerDevToolsManager::GetInstance() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 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); |
| +} |
| + |
| +EmbeddedWorkerDevToolsManager::EmbeddedWorkerDevToolsAgentHost* |
| +EmbeddedWorkerDevToolsManager::GetOrCreateAgentHost( |
| int worker_process_id, |
| int worker_route_id) { |
| WorkerId id(worker_process_id, worker_route_id); |
| @@ -210,6 +296,54 @@ EmbeddedWorkerDevToolsManager::GetDevToolsAgentHostForServiceWorker( |
| return GetDevToolsAgentHostForWorker(it->first.first, it->first.second); |
| } |
| +void EmbeddedWorkerDevToolsManager::GetAllServiceWorkerTargets( |
| + const TargetCallback& 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 TargetCallback& callback) { |
| + std::map<WorkerId, GURL> url_map; |
| + for (std::map<WorkerId, ServiceWorkerIdentifier>::const_iterator it = |
| + ids.begin(); it != ids.end(); ++it) { |
| + ServiceWorkerVersion* version = it->second.service_worker_context_-> |
|
horo
2014/07/08 08:14:31
ServiceWorkerIdentifier's service_worker_context_
vkuzkokov
2014/07/08 09:38:48
ForEachStoragePartition requires passing instance
horo
2014/07/09 02:30:44
Humm..
Doesn't DevToolsHttpHandler have a way to g
|
| + GetLiveVersion(it->second.service_worker_version_id_); |
| + if (version) |
| + url_map[it->first] = version->script_url(); |
| + } |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| + base::Bind(&EmbeddedWorkerDevToolsManager::CreateTargets, |
| + url_map, callback)); |
| +} |
| + |
| +// static |
| +void EmbeddedWorkerDevToolsManager::CreateTargets( |
| + const std::map<WorkerId, GURL> url_map, |
| + const TargetCallback& callback) { |
| + std::vector<DevToolsTarget*> targets; |
| + EmbeddedWorkerDevToolsManager* instance = GetInstance(); |
| + for (std::map<WorkerId, GURL>::const_iterator it = url_map.begin(); |
| + it != url_map.end(); ++it) { |
| + if (EmbeddedWorkerDevToolsAgentHost* agent_host = |
| + instance->GetOrCreateAgentHost(it->first.first, it->first.second)) { |
| + targets.push_back(new ServiceWorkerTarget(agent_host, it->second)); |
| + } |
| + } |
| + callback.Run(targets); |
| +} |
| + |
| EmbeddedWorkerDevToolsManager::EmbeddedWorkerDevToolsManager() |
| : debug_service_worker_on_start_(false) { |
| } |
| @@ -372,6 +506,20 @@ void EmbeddedWorkerDevToolsManager::MoveToPausedState( |
| workers_.set(id, info.Pass()); |
| } |
| +bool EmbeddedWorkerDevToolsManager::CloseServiceWorker(const WorkerId& id) { |
| + WorkerInfoMap::iterator it = workers_.find(id); |
| + if (it == workers_.end()) |
| + return false; |
| + ServiceWorkerIdentifier* service_worker = it->second->service_worker_id(); |
| + if (!service_worker) |
| + return false; |
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| + base::Bind(&CloseServiceWorkerOnIO, |
| + service_worker->service_worker_context_, |
| + service_worker->service_worker_version_id_)); |
| + return true; |
| +} |
| + |
| void EmbeddedWorkerDevToolsManager::ResetForTesting() { |
| workers_.clear(); |
| } |