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

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

Issue 2969753002: [DevTools] Split auto-attach part of TargetHandler into a separate class (Closed)
Patch Set: similarity Created 3 years, 6 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/target_handler.cc
diff --git a/content/browser/devtools/protocol/target_handler.cc b/content/browser/devtools/protocol/target_handler.cc
index 2cbdaffc5b454e2a2de8c5db7eff17084b33ad32..13896823ae6c0978a9f5bbc3686329cb4dcefa47 100644
--- a/content/browser/devtools/protocol/target_handler.cc
+++ b/content/browser/devtools/protocol/target_handler.cc
@@ -6,83 +6,12 @@
#include "content/browser/devtools/devtools_manager.h"
#include "content/browser/devtools/devtools_session.h"
-#include "content/browser/devtools/render_frame_devtools_agent_host.h"
-#include "content/browser/devtools/service_worker_devtools_agent_host.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"
namespace content {
namespace protocol {
namespace {
-using ScopeAgentsMap =
- std::map<GURL, std::unique_ptr<ServiceWorkerDevToolsAgentHost::List>>;
-
-void GetMatchingHostsByScopeMap(
- const ServiceWorkerDevToolsAgentHost::List& agent_hosts,
- const std::set<GURL>& urls,
- ScopeAgentsMap* scope_agents_map) {
- std::set<base::StringPiece> host_name_set;
- for (const GURL& url : urls)
- host_name_set.insert(url.host_piece());
- for (const auto& host : agent_hosts) {
- if (host_name_set.find(host->scope().host_piece()) == host_name_set.end())
- continue;
- const auto& it = scope_agents_map->find(host->scope());
- if (it == scope_agents_map->end()) {
- std::unique_ptr<ServiceWorkerDevToolsAgentHost::List> new_list(
- new ServiceWorkerDevToolsAgentHost::List());
- new_list->push_back(host);
- (*scope_agents_map)[host->scope()] = std::move(new_list);
- } else {
- it->second->push_back(host);
- }
- }
-}
-
-void AddEligibleHosts(const ServiceWorkerDevToolsAgentHost::List& list,
- ServiceWorkerDevToolsAgentHost::Map* result) {
- base::Time last_installed_time;
- base::Time last_doomed_time;
- for (const auto& host : list) {
- if (host->version_installed_time() > last_installed_time)
- last_installed_time = host->version_installed_time();
- if (host->version_doomed_time() > last_doomed_time)
- last_doomed_time = host->version_doomed_time();
- }
- for (const auto& host : list) {
- // We don't attech old redundant Service Workers when there is newer
- // installed Service Worker.
- if (host->version_doomed_time().is_null() ||
- (last_installed_time < last_doomed_time &&
- last_doomed_time == host->version_doomed_time())) {
- (*result)[host->GetId()] = host;
- }
- }
-}
-
-ServiceWorkerDevToolsAgentHost::Map GetMatchingServiceWorkers(
- BrowserContext* browser_context,
- const std::set<GURL>& urls) {
- ServiceWorkerDevToolsAgentHost::Map result;
- if (!browser_context)
- return result;
-
- ServiceWorkerDevToolsAgentHost::List agent_hosts;
- ServiceWorkerDevToolsManager::GetInstance()
- ->AddAllAgentHostsForBrowserContext(browser_context, &agent_hosts);
-
- ScopeAgentsMap scope_agents_map;
- GetMatchingHostsByScopeMap(agent_hosts, urls, &scope_agents_map);
-
- for (const auto& it : scope_agents_map)
- AddEligibleHosts(*it.second.get(), &result);
-
- return result;
-}
-
std::unique_ptr<Target::TargetInfo> CreateInfo(DevToolsAgentHost* host) {
return Target::TargetInfo::Create()
.SetTargetId(host->GetId())
@@ -97,12 +26,11 @@ std::unique_ptr<Target::TargetInfo> CreateInfo(DevToolsAgentHost* host) {
TargetHandler::TargetHandler()
: DevToolsDomainHandler(Target::Metainfo::domainName),
- discover_(false),
- auto_attach_(false),
- wait_for_debugger_on_start_(false),
- attach_to_frames_(false),
- render_frame_host_(nullptr) {
-}
+ auto_attacher_(base::Bind(&TargetHandler::AttachToTargetInternal,
+ base::Unretained(this)),
+ base::Bind(&TargetHandler::DetachFromTargetInternal,
+ base::Unretained(this))),
+ discover_(false) {}
TargetHandler::~TargetHandler() {
}
@@ -120,8 +48,7 @@ void TargetHandler::Wire(UberDispatcher* dispatcher) {
}
void TargetHandler::SetRenderFrameHost(RenderFrameHostImpl* render_frame_host) {
- render_frame_host_ = render_frame_host;
- UpdateFrames();
+ auto_attacher_.SetRenderFrameHost(render_frame_host);
}
Response TargetHandler::Disable() {
@@ -133,78 +60,12 @@ Response TargetHandler::Disable() {
return Response::OK();
}
-void TargetHandler::UpdateServiceWorkers() {
- UpdateServiceWorkers(false);
+void TargetHandler::DidFinishNavigation() {
+ auto_attacher_.UpdateServiceWorkers();
}
-void TargetHandler::UpdateFrames() {
- if (!auto_attach_ || !attach_to_frames_)
- return;
-
- HostsMap new_hosts;
- if (render_frame_host_) {
- FrameTreeNode* root = render_frame_host_->frame_tree_node();
- std::queue<FrameTreeNode*> queue;
- queue.push(root);
- while (!queue.empty()) {
- FrameTreeNode* node = queue.front();
- queue.pop();
- bool cross_process = node->current_frame_host()->IsCrossProcessSubframe();
- if (node != root && cross_process) {
- scoped_refptr<DevToolsAgentHost> new_host =
- RenderFrameDevToolsAgentHost::GetOrCreateFor(node);
- new_hosts[new_host->GetId()] = new_host;
- } else {
- for (size_t i = 0; i < node->child_count(); ++i)
- queue.push(node->child_at(i));
- }
- }
- }
-
- // TODO(dgozman): support wait_for_debugger_on_start_.
- ReattachTargetsOfType(new_hosts, DevToolsAgentHost::kTypeFrame, false);
-}
-
-void TargetHandler::UpdateServiceWorkers(bool waiting_for_debugger) {
- if (!auto_attach_)
- return;
-
- frame_urls_.clear();
- BrowserContext* browser_context = nullptr;
- if (render_frame_host_) {
- // TODO(dgozman): do not traverse inside cross-process subframes.
- for (FrameTreeNode* node :
- render_frame_host_->frame_tree_node()->frame_tree()->Nodes()) {
- frame_urls_.insert(node->current_url());
- }
- browser_context = render_frame_host_->GetProcess()->GetBrowserContext();
- }
-
- auto matching = GetMatchingServiceWorkers(browser_context, frame_urls_);
- HostsMap new_hosts;
- for (const auto& pair : matching) {
- if (pair.second->IsReadyForInspection())
- new_hosts[pair.first] = pair.second;
- }
- ReattachTargetsOfType(
- new_hosts, DevToolsAgentHost::kTypeServiceWorker, waiting_for_debugger);
-}
-
-void TargetHandler::ReattachTargetsOfType(
- const HostsMap& new_hosts,
- const std::string& type,
- bool waiting_for_debugger) {
- HostsMap old_hosts = attached_hosts_;
- for (const auto& pair : old_hosts) {
- if (pair.second->GetType() == type &&
- new_hosts.find(pair.first) == new_hosts.end()) {
- DetachFromTargetInternal(pair.second.get());
- }
- }
- for (const auto& pair : new_hosts) {
- if (old_hosts.find(pair.first) == old_hosts.end())
- AttachToTargetInternal(pair.second.get(), waiting_for_debugger);
- }
+void TargetHandler::RenderFrameHostChanged() {
+ auto_attacher_.UpdateFrames();
}
void TargetHandler::TargetCreatedInternal(DevToolsAgentHost* host) {
@@ -268,33 +129,12 @@ Response TargetHandler::SetDiscoverTargets(bool discover) {
Response TargetHandler::SetAutoAttach(
bool auto_attach, bool wait_for_debugger_on_start) {
- wait_for_debugger_on_start_ = wait_for_debugger_on_start;
- if (auto_attach_ == auto_attach)
- return Response::FallThrough();
- auto_attach_ = auto_attach;
- if (auto_attach_) {
- ServiceWorkerDevToolsManager::GetInstance()->AddObserver(this);
- UpdateServiceWorkers();
- UpdateFrames();
- } else {
- ServiceWorkerDevToolsManager::GetInstance()->RemoveObserver(this);
- HostsMap empty;
- ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeFrame, false);
- ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeServiceWorker, false);
- }
+ auto_attacher_.SetAutoAttach(auto_attach, wait_for_debugger_on_start);
return Response::FallThrough();
}
Response TargetHandler::SetAttachToFrames(bool value) {
- if (attach_to_frames_ == value)
- return Response::OK();
- attach_to_frames_ = value;
- if (attach_to_frames_) {
- UpdateFrames();
- } else {
- HostsMap empty;
- ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeFrame, false);
- }
+ auto_attacher_.SetAttachToFrames(value);
return Response::OK();
}
@@ -416,6 +256,7 @@ void TargetHandler::AgentHostClosed(
bool replaced_with_another_client) {
frontend_->DetachedFromTarget(host->GetId());
attached_hosts_.erase(host->GetId());
+ auto_attacher_.AgentHostClosed(host);
}
// -------------- DevToolsAgentHostObserver -----------------
@@ -443,46 +284,5 @@ void TargetHandler::DevToolsAgentHostDetached(DevToolsAgentHost* host) {
TargetInfoChangedInternal(host);
}
-// -------- ServiceWorkerDevToolsManager::Observer ----------
-
-void TargetHandler::WorkerCreated(
- ServiceWorkerDevToolsAgentHost* host) {
- BrowserContext* browser_context = nullptr;
- if (render_frame_host_)
- browser_context = render_frame_host_->GetProcess()->GetBrowserContext();
- auto hosts = GetMatchingServiceWorkers(browser_context, frame_urls_);
- if (hosts.find(host->GetId()) != hosts.end() && !host->IsAttached() &&
- !host->IsPausedForDebugOnStart() && wait_for_debugger_on_start_) {
- host->PauseForDebugOnStart();
- }
-}
-
-void TargetHandler::WorkerReadyForInspection(
- ServiceWorkerDevToolsAgentHost* host) {
- DCHECK(host->IsReadyForInspection());
- if (ServiceWorkerDevToolsManager::GetInstance()
- ->debug_service_worker_on_start()) {
- // When debug_service_worker_on_start is true, a new DevTools window will
- // be opened in ServiceWorkerDevToolsManager::WorkerReadyForInspection.
- return;
- }
- UpdateServiceWorkers(host->IsPausedForDebugOnStart());
-}
-
-void TargetHandler::WorkerVersionInstalled(
- ServiceWorkerDevToolsAgentHost* host) {
- UpdateServiceWorkers();
-}
-
-void TargetHandler::WorkerVersionDoomed(
- ServiceWorkerDevToolsAgentHost* host) {
- UpdateServiceWorkers();
-}
-
-void TargetHandler::WorkerDestroyed(
- ServiceWorkerDevToolsAgentHost* host) {
- UpdateServiceWorkers();
-}
-
} // namespace protocol
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698