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

Unified Diff: content/browser/devtools/protocol/service_worker_handler.cc

Issue 1003263002: DevTools: support scopes and iframes when debugging service workers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebaselined Created 5 years, 9 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/protocol/service_worker_handler.cc
diff --git a/content/browser/devtools/protocol/service_worker_handler.cc b/content/browser/devtools/protocol/service_worker_handler.cc
index b28c83679d68721e554977dea0b20ce0881f0b35..e6386f5215b5176c866fd9d8bfd545c1c095ce28 100644
--- a/content/browser/devtools/protocol/service_worker_handler.cc
+++ b/content/browser/devtools/protocol/service_worker_handler.cc
@@ -8,6 +8,9 @@
#include "base/strings/string_number_conversions.h"
#include "content/browser/devtools/service_worker_devtools_agent_host.h"
#include "content/browser/devtools/service_worker_devtools_manager.h"
+#include "content/browser/frame_host/frame_tree.h"
+#include "content/browser/frame_host/frame_tree_node.h"
+#include "content/browser/frame_host/render_frame_host_impl.h"
#include "content/browser/service_worker/service_worker_context_observer.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/public/browser/browser_context.h"
@@ -102,6 +105,45 @@ scoped_refptr<ServiceWorkerRegistration> CreateRegistrationDictionaryValue(
return registration;
}
+scoped_refptr<ServiceWorkerDevToolsAgentHost> GetMatchingServiceWorker(
+ const ServiceWorkerDevToolsAgentHost::List& agent_hosts,
+ const GURL& url) {
+ scoped_refptr<ServiceWorkerDevToolsAgentHost> best_host;
+ std::string best_scope;
+ for (auto host : agent_hosts) {
+ if (host->GetURL().host() != url.host())
+ continue;
+ std::string path = host->GetURL().path();
+ std::string file = host->GetURL().ExtractFileName();
+ std::string scope = path.substr(0, path.length() - file.length());
+ if (scope.length() > best_scope.length()) {
+ best_host = host;
+ best_scope = scope;
+ }
+ }
+ return best_host;
+}
+
+ServiceWorkerDevToolsAgentHost::Map GetMatchingServiceWorkers(
+ const std::set<GURL>& urls) {
+ ServiceWorkerDevToolsAgentHost::List agent_hosts;
+ ServiceWorkerDevToolsManager::GetInstance()->
+ AddAllAgentHosts(&agent_hosts);
+ ServiceWorkerDevToolsAgentHost::Map result;
+ for (const GURL& url : urls) {
+ scoped_refptr<ServiceWorkerDevToolsAgentHost> host =
+ GetMatchingServiceWorker(agent_hosts, url);
+ if (host)
+ result[host->GetId()] = host;
+ }
+ return result;
+}
+
+bool CollectURLs(std::set<GURL>* urls, FrameTreeNode* tree_node) {
+ urls->insert(tree_node->current_url());
+ return false;
+}
+
} // namespace
using Response = DevToolsProtocolClient::Response;
@@ -266,7 +308,9 @@ ServiceWorkerHandler::~ServiceWorkerHandler() {
}
void ServiceWorkerHandler::SetRenderFrameHost(
- RenderFrameHost* render_frame_host) {
+ RenderFrameHostImpl* render_frame_host) {
+ render_frame_host_ = render_frame_host;
+ // Do not call UpdateHosts yet, wait for load to commit.
if (!render_frame_host) {
context_ = nullptr;
return;
@@ -283,27 +327,28 @@ void ServiceWorkerHandler::SetClient(scoped_ptr<Client> client) {
client_.swap(client);
}
-void ServiceWorkerHandler::SetURL(const GURL& url) {
- url_ = url;
- if (enabled_) {
- for (auto pair : attached_hosts_) {
- if (!MatchesInspectedPage(pair.second.get()))
- WorkerDestroyed(pair.second.get());
- }
+void ServiceWorkerHandler::UpdateHosts() {
+ if (!enabled_)
+ return;
- ServiceWorkerDevToolsAgentHost::List agent_hosts;
- ServiceWorkerDevToolsManager::GetInstance()->
- AddAllAgentHosts(&agent_hosts);
- for (auto host : agent_hosts) {
- if (!MatchesInspectedPage(host.get()))
- continue;
- if (attached_hosts_.find(host->GetId()) != attached_hosts_.end())
- continue;
- // TODO(pfeldman): workers are created concurrently, we need
- // to get notification earlier to go through the Created/Ready
- // lifecycle.
- WorkerReadyForInspection(host.get());
- }
+ urls_.clear();
+ if (render_frame_host_) {
+ render_frame_host_->frame_tree_node()->frame_tree()->ForEach(
+ base::Bind(&CollectURLs, &urls_));
+ }
+
+ ServiceWorkerDevToolsAgentHost::Map old_hosts = attached_hosts_;
+ ServiceWorkerDevToolsAgentHost::Map new_hosts =
+ GetMatchingServiceWorkers(urls_);
+
+ for (auto pair : old_hosts) {
+ if (new_hosts.find(pair.first) == new_hosts.end())
+ ReportWorkerTerminated(pair.second.get());
+ }
+
+ for (auto pair : new_hosts) {
+ if (old_hosts.find(pair.first) == old_hosts.end())
+ ReportWorkerCreated(pair.second.get());
}
}
@@ -319,14 +364,9 @@ Response ServiceWorkerHandler::Enable() {
enabled_ = true;
ServiceWorkerDevToolsManager::GetInstance()->AddObserver(this);
-
- ServiceWorkerDevToolsAgentHost::List agent_hosts;
- ServiceWorkerDevToolsManager::GetInstance()->AddAllAgentHosts(&agent_hosts);
- for (auto host : agent_hosts)
- WorkerReadyForInspection(host.get());
-
context_observer_ = new ContextObserver(context_, weak_factory_.GetWeakPtr());
context_observer_->Start();
+ UpdateHosts();
return Response::OK();
}
@@ -414,16 +454,25 @@ void ServiceWorkerHandler::AgentHostClosed(
void ServiceWorkerHandler::WorkerCreated(
ServiceWorkerDevToolsAgentHost* host) {
- if (!MatchesInspectedPage(host))
- return;
- host->PauseForDebugOnStart();
+ auto hosts = GetMatchingServiceWorkers(urls_);
+ if (hosts.find(host->GetId()) != hosts.end())
+ host->PauseForDebugOnStart();
}
void ServiceWorkerHandler::WorkerReadyForInspection(
ServiceWorkerDevToolsAgentHost* host) {
- if (host->IsAttached() || !MatchesInspectedPage(host))
- return;
+ UpdateHosts();
+}
+void ServiceWorkerHandler::WorkerDestroyed(
+ ServiceWorkerDevToolsAgentHost* host) {
+ UpdateHosts();
+}
+
+void ServiceWorkerHandler::ReportWorkerCreated(
+ ServiceWorkerDevToolsAgentHost* host) {
+ if (host->IsAttached())
+ return;
attached_hosts_[host->GetId()] = host;
host->AttachClient(this);
client_->WorkerCreated(WorkerCreatedParams::Create()->
@@ -431,7 +480,7 @@ void ServiceWorkerHandler::WorkerReadyForInspection(
set_url(host->GetURL().spec()));
}
-void ServiceWorkerHandler::WorkerDestroyed(
+void ServiceWorkerHandler::ReportWorkerTerminated(
ServiceWorkerDevToolsAgentHost* host) {
auto it = attached_hosts_.find(host->GetId());
if (it == attached_hosts_.end())
@@ -442,13 +491,6 @@ void ServiceWorkerHandler::WorkerDestroyed(
attached_hosts_.erase(it);
}
-bool ServiceWorkerHandler::MatchesInspectedPage(
- ServiceWorkerDevToolsAgentHost* host) {
- // TODO(pfeldman): match based on scope.
- // TODO(pfeldman): match iframes.
- return host->GetURL().host() == url_.host();
-}
-
} // namespace service_worker
} // namespace devtools
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698