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 1525a1c8e8e075304a53918a33f87525b8559cf0..d87a7de72a5fc89cf1b4539990b5a7487f2314f8 100644 |
--- a/content/browser/devtools/protocol/target_handler.cc |
+++ b/content/browser/devtools/protocol/target_handler.cc |
@@ -86,7 +86,7 @@ ServiceWorkerDevToolsAgentHost::Map GetMatchingServiceWorkers( |
} // namespace |
TargetHandler::TargetHandler() |
- : enabled_(false), |
+ : discover_(false), |
auto_attach_(false), |
wait_for_debugger_on_start_(false), |
attach_to_frames_(false), |
@@ -94,7 +94,7 @@ TargetHandler::TargetHandler() |
} |
TargetHandler::~TargetHandler() { |
- Disable(); |
+ Detached(); |
} |
void TargetHandler::SetRenderFrameHost(RenderFrameHostImpl* render_frame_host) { |
@@ -107,7 +107,8 @@ void TargetHandler::SetClient(std::unique_ptr<Client> client) { |
} |
void TargetHandler::Detached() { |
- Disable(); |
+ SetAutoAttach(false, false); |
+ SetDiscoverTargets(false); |
} |
void TargetHandler::UpdateServiceWorkers() { |
@@ -115,7 +116,7 @@ void TargetHandler::UpdateServiceWorkers() { |
} |
void TargetHandler::UpdateFrames() { |
- if (!enabled_ || !auto_attach_ || !attach_to_frames_) |
+ if (!auto_attach_ || !attach_to_frames_) |
return; |
HostsMap new_hosts; |
@@ -143,7 +144,7 @@ void TargetHandler::UpdateFrames() { |
} |
void TargetHandler::UpdateServiceWorkers(bool waiting_for_debugger) { |
- if (!enabled_ || !auto_attach_) |
+ if (!auto_attach_) |
return; |
frame_urls_.clear(); |
@@ -199,15 +200,15 @@ void TargetHandler::TargetRemovedInternal(DevToolsAgentHost* host) { |
->set_target_id(host->GetId())); |
} |
-void TargetHandler::AttachToTargetInternal( |
+bool TargetHandler::AttachToTargetInternal( |
DevToolsAgentHost* host, bool waiting_for_debugger) { |
- if (host->IsAttached()) |
- return; |
+ if (!host->AttachClient(this)) |
+ return false; |
attached_hosts_[host->GetId()] = host; |
- host->AttachClient(this); |
client_->AttachedToTarget(AttachedToTargetParams::Create() |
->set_target_id(host->GetId()) |
->set_waiting_for_debugger(waiting_for_debugger)); |
+ return true; |
} |
void TargetHandler::DetachFromTargetInternal(DevToolsAgentHost* host) { |
@@ -222,26 +223,11 @@ void TargetHandler::DetachFromTargetInternal(DevToolsAgentHost* host) { |
// ----------------- Protocol ---------------------- |
-Response TargetHandler::Enable() { |
- if (enabled_) |
- return Response::OK(); |
- enabled_ = true; |
- ServiceWorkerDevToolsManager::GetInstance()->AddObserver(this); |
- UpdateServiceWorkers(); |
- UpdateFrames(); |
- return Response::OK(); |
-} |
- |
-Response TargetHandler::Disable() { |
- if (!enabled_) |
+Response TargetHandler::SetDiscoverTargets(bool discover) { |
+ if (discover_ == discover) |
return Response::OK(); |
- enabled_ = false; |
- auto_attach_ = false; |
- wait_for_debugger_on_start_ = false; |
- ServiceWorkerDevToolsManager::GetInstance()->RemoveObserver(this); |
- for (const auto& pair : attached_hosts_) |
- pair.second->DetachClient(this); |
- attached_hosts_.clear(); |
+ discover_ = discover; |
+ // TODO(dgozman): observe all agent hosts here. |
return Response::OK(); |
} |
@@ -252,8 +238,14 @@ Response TargetHandler::SetAutoAttach( |
return Response::OK(); |
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); |
} |
return Response::OK(); |
} |
@@ -271,6 +263,24 @@ Response TargetHandler::SetAttachToFrames(bool value) { |
return Response::OK(); |
} |
+Response TargetHandler::AttachToTarget(const std::string& target_id, |
+ bool* out_success) { |
+ scoped_refptr<DevToolsAgentHost> agent_host( |
+ DevToolsAgentHost::GetForId(target_id)); |
+ if (!agent_host) |
+ return Response::InvalidParams("No target with such id"); |
+ *out_success = AttachToTargetInternal(agent_host.get(), false); |
+ return Response::OK(); |
+} |
+ |
+Response TargetHandler::DetachFromTarget(const std::string& target_id) { |
+ auto it = attached_hosts_.find(target_id); |
+ if (it == attached_hosts_.end()) |
+ return Response::InternalError("Not attached to the target"); |
+ DetachFromTargetInternal(it->second.get()); |
+ return Response::OK(); |
+} |
+ |
Response TargetHandler::SendMessageToTarget( |
const std::string& target_id, |
const std::string& message) { |
@@ -323,9 +333,10 @@ void TargetHandler::DispatchProtocolMessage( |
void TargetHandler::AgentHostClosed( |
DevToolsAgentHost* host, |
bool replaced_with_another_client) { |
- client_->TargetRemoved(TargetRemovedParams::Create()-> |
+ client_->DetachedFromTarget(DetachedFromTargetParams::Create()-> |
set_target_id(host->GetId())); |
attached_hosts_.erase(host->GetId()); |
+ TargetRemovedInternal(host); |
} |
// -------- ServiceWorkerDevToolsManager::Observer ---------- |