| 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..b117d12973f6403f3873603231dbfa9c2dc20eb0 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::DidCommitNavigation() {
|
| + 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
|
|
|