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 |