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

Unified 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 URLs 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 side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698