| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/devtools/protocol/target_handler.h" | 5 #include "content/browser/devtools/protocol/target_handler.h" |
| 6 | 6 |
| 7 #include "content/browser/devtools/service_worker_devtools_agent_host.h" | 7 #include "content/browser/devtools/service_worker_devtools_agent_host.h" |
| 8 #include "content/browser/frame_host/frame_tree.h" | 8 #include "content/browser/frame_host/frame_tree.h" |
| 9 #include "content/browser/frame_host/frame_tree_node.h" | 9 #include "content/browser/frame_host/frame_tree_node.h" |
| 10 #include "content/browser/frame_host/render_frame_host_impl.h" | 10 #include "content/browser/frame_host/render_frame_host_impl.h" |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 for (const auto& it : scope_agents_map) | 80 for (const auto& it : scope_agents_map) |
| 81 AddEligibleHosts(*it.second.get(), &result); | 81 AddEligibleHosts(*it.second.get(), &result); |
| 82 | 82 |
| 83 return result; | 83 return result; |
| 84 } | 84 } |
| 85 | 85 |
| 86 } // namespace | 86 } // namespace |
| 87 | 87 |
| 88 TargetHandler::TargetHandler() | 88 TargetHandler::TargetHandler() |
| 89 : enabled_(false), | 89 : enabled_(false), |
| 90 wait_for_debugger_on_start_(false), |
| 90 render_frame_host_(nullptr) { | 91 render_frame_host_(nullptr) { |
| 91 } | 92 } |
| 92 | 93 |
| 93 TargetHandler::~TargetHandler() { | 94 TargetHandler::~TargetHandler() { |
| 94 Disable(); | 95 Disable(); |
| 95 } | 96 } |
| 96 | 97 |
| 97 void TargetHandler::SetRenderFrameHost(RenderFrameHostImpl* render_frame_host) { | 98 void TargetHandler::SetRenderFrameHost(RenderFrameHostImpl* render_frame_host) { |
| 98 render_frame_host_ = render_frame_host; | 99 render_frame_host_ = render_frame_host; |
| 99 } | 100 } |
| 100 | 101 |
| 101 void TargetHandler::SetClient(std::unique_ptr<Client> client) { | 102 void TargetHandler::SetClient(std::unique_ptr<Client> client) { |
| 102 client_.swap(client); | 103 client_.swap(client); |
| 103 } | 104 } |
| 104 | 105 |
| 105 void TargetHandler::Detached() { | 106 void TargetHandler::Detached() { |
| 106 Disable(); | 107 Disable(); |
| 107 } | 108 } |
| 108 | 109 |
| 109 void TargetHandler::UpdateServiceWorkers() { | 110 void TargetHandler::UpdateServiceWorkers() { |
| 111 UpdateServiceWorkers(false); |
| 112 } |
| 113 |
| 114 void TargetHandler::UpdateServiceWorkers(bool waiting_for_debugger) { |
| 110 if (!enabled_) | 115 if (!enabled_) |
| 111 return; | 116 return; |
| 112 | 117 |
| 113 frame_urls_.clear(); | 118 frame_urls_.clear(); |
| 114 BrowserContext* browser_context = nullptr; | 119 BrowserContext* browser_context = nullptr; |
| 115 if (render_frame_host_) { | 120 if (render_frame_host_) { |
| 116 // TODO(dgozman): do not traverse inside cross-process subframes. | 121 // TODO(dgozman): do not traverse inside cross-process subframes. |
| 117 for (FrameTreeNode* node : | 122 for (FrameTreeNode* node : |
| 118 render_frame_host_->frame_tree_node()->frame_tree()->Nodes()) { | 123 render_frame_host_->frame_tree_node()->frame_tree()->Nodes()) { |
| 119 frame_urls_.insert(node->current_url()); | 124 frame_urls_.insert(node->current_url()); |
| 120 } | 125 } |
| 121 browser_context = render_frame_host_->GetProcess()->GetBrowserContext(); | 126 browser_context = render_frame_host_->GetProcess()->GetBrowserContext(); |
| 122 } | 127 } |
| 123 | 128 |
| 124 std::map<std::string, scoped_refptr<DevToolsAgentHost>> old_hosts = | 129 std::map<std::string, scoped_refptr<DevToolsAgentHost>> old_hosts = |
| 125 attached_hosts_; | 130 attached_hosts_; |
| 126 ServiceWorkerDevToolsAgentHost::Map new_hosts = | 131 ServiceWorkerDevToolsAgentHost::Map new_hosts = |
| 127 GetMatchingServiceWorkers(browser_context, frame_urls_); | 132 GetMatchingServiceWorkers(browser_context, frame_urls_); |
| 128 | 133 |
| 129 for (const auto& pair : old_hosts) { | 134 for (const auto& pair : old_hosts) { |
| 130 if (pair.second->GetType() == DevToolsAgentHost::kTypeServiceWorker && | 135 if (pair.second->GetType() == DevToolsAgentHost::kTypeServiceWorker && |
| 131 new_hosts.find(pair.first) == new_hosts.end()) { | 136 new_hosts.find(pair.first) == new_hosts.end()) { |
| 132 DetachFromTargetInternal(pair.second.get()); | 137 DetachFromTargetInternal(pair.second.get()); |
| 133 } | 138 } |
| 134 } | 139 } |
| 135 | 140 |
| 136 for (const auto& pair : new_hosts) { | 141 for (const auto& pair : new_hosts) { |
| 137 if (old_hosts.find(pair.first) == old_hosts.end()) | 142 if (old_hosts.find(pair.first) == old_hosts.end()) |
| 138 AttachToTargetInternal(pair.second.get(), true); | 143 AttachToTargetInternal(pair.second.get(), waiting_for_debugger); |
| 139 } | 144 } |
| 140 } | 145 } |
| 141 | 146 |
| 142 void TargetHandler::AttachToTargetInternal( | 147 void TargetHandler::AttachToTargetInternal( |
| 143 DevToolsAgentHost* host, bool waiting_for_debugger) { | 148 DevToolsAgentHost* host, bool waiting_for_debugger) { |
| 144 if (host->IsAttached()) | 149 if (host->IsAttached()) |
| 145 return; | 150 return; |
| 146 attached_hosts_[host->GetId()] = host; | 151 attached_hosts_[host->GetId()] = host; |
| 147 host->AttachClient(this); | 152 host->AttachClient(this); |
| 148 client_->TargetCreated(TargetCreatedParams::Create() | 153 client_->TargetCreated(TargetCreatedParams::Create() |
| (...skipping 21 matching lines...) Expand all Loading... |
| 170 enabled_ = true; | 175 enabled_ = true; |
| 171 ServiceWorkerDevToolsManager::GetInstance()->AddObserver(this); | 176 ServiceWorkerDevToolsManager::GetInstance()->AddObserver(this); |
| 172 UpdateServiceWorkers(); | 177 UpdateServiceWorkers(); |
| 173 return Response::OK(); | 178 return Response::OK(); |
| 174 } | 179 } |
| 175 | 180 |
| 176 Response TargetHandler::Disable() { | 181 Response TargetHandler::Disable() { |
| 177 if (!enabled_) | 182 if (!enabled_) |
| 178 return Response::OK(); | 183 return Response::OK(); |
| 179 enabled_ = false; | 184 enabled_ = false; |
| 185 wait_for_debugger_on_start_ = false; |
| 180 ServiceWorkerDevToolsManager::GetInstance()->RemoveObserver(this); | 186 ServiceWorkerDevToolsManager::GetInstance()->RemoveObserver(this); |
| 181 for (const auto& pair : attached_hosts_) | 187 for (const auto& pair : attached_hosts_) |
| 182 pair.second->DetachClient(this); | 188 pair.second->DetachClient(this); |
| 183 attached_hosts_.clear(); | 189 attached_hosts_.clear(); |
| 184 return Response::OK(); | 190 return Response::OK(); |
| 185 } | 191 } |
| 186 | 192 |
| 187 Response TargetHandler::SetWaitForDebuggerOnStart(bool value) { | 193 Response TargetHandler::SetWaitForDebuggerOnStart(bool value) { |
| 188 // TODO(dgozman): implement this. | 194 wait_for_debugger_on_start_ = value; |
| 189 return Response::OK(); | 195 return Response::OK(); |
| 190 } | 196 } |
| 191 | 197 |
| 192 Response TargetHandler::SendMessageToTarget( | 198 Response TargetHandler::SendMessageToTarget( |
| 193 const std::string& target_id, | 199 const std::string& target_id, |
| 194 const std::string& message) { | 200 const std::string& message) { |
| 195 auto it = attached_hosts_.find(target_id); | 201 auto it = attached_hosts_.find(target_id); |
| 196 if (it == attached_hosts_.end()) | 202 if (it == attached_hosts_.end()) |
| 197 return Response::InternalError("Not attached to the target"); | 203 return Response::InternalError("Not attached to the target"); |
| 198 it->second->DispatchProtocolMessage(this, message); | 204 it->second->DispatchProtocolMessage(this, message); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 | 254 |
| 249 // -------- ServiceWorkerDevToolsManager::Observer ---------- | 255 // -------- ServiceWorkerDevToolsManager::Observer ---------- |
| 250 | 256 |
| 251 void TargetHandler::WorkerCreated( | 257 void TargetHandler::WorkerCreated( |
| 252 ServiceWorkerDevToolsAgentHost* host) { | 258 ServiceWorkerDevToolsAgentHost* host) { |
| 253 BrowserContext* browser_context = nullptr; | 259 BrowserContext* browser_context = nullptr; |
| 254 if (render_frame_host_) | 260 if (render_frame_host_) |
| 255 browser_context = render_frame_host_->GetProcess()->GetBrowserContext(); | 261 browser_context = render_frame_host_->GetProcess()->GetBrowserContext(); |
| 256 auto hosts = GetMatchingServiceWorkers(browser_context, frame_urls_); | 262 auto hosts = GetMatchingServiceWorkers(browser_context, frame_urls_); |
| 257 if (hosts.find(host->GetId()) != hosts.end() && !host->IsAttached() && | 263 if (hosts.find(host->GetId()) != hosts.end() && !host->IsAttached() && |
| 258 !host->IsPausedForDebugOnStart()) { | 264 !host->IsPausedForDebugOnStart() && wait_for_debugger_on_start_) { |
| 259 host->PauseForDebugOnStart(); | 265 host->PauseForDebugOnStart(); |
| 260 } | 266 } |
| 261 } | 267 } |
| 262 | 268 |
| 263 void TargetHandler::WorkerReadyForInspection( | 269 void TargetHandler::WorkerReadyForInspection( |
| 264 ServiceWorkerDevToolsAgentHost* host) { | 270 ServiceWorkerDevToolsAgentHost* host) { |
| 265 if (ServiceWorkerDevToolsManager::GetInstance() | 271 if (ServiceWorkerDevToolsManager::GetInstance() |
| 266 ->debug_service_worker_on_start()) { | 272 ->debug_service_worker_on_start()) { |
| 267 // When debug_service_worker_on_start is true, a new DevTools window will | 273 // When debug_service_worker_on_start is true, a new DevTools window will |
| 268 // be opened in ServiceWorkerDevToolsManager::WorkerReadyForInspection. | 274 // be opened in ServiceWorkerDevToolsManager::WorkerReadyForInspection. |
| 269 return; | 275 return; |
| 270 } | 276 } |
| 271 UpdateServiceWorkers(); | 277 UpdateServiceWorkers(host->IsPausedForDebugOnStart()); |
| 272 } | 278 } |
| 273 | 279 |
| 274 void TargetHandler::WorkerVersionInstalled( | 280 void TargetHandler::WorkerVersionInstalled( |
| 275 ServiceWorkerDevToolsAgentHost* host) { | 281 ServiceWorkerDevToolsAgentHost* host) { |
| 276 UpdateServiceWorkers(); | 282 UpdateServiceWorkers(); |
| 277 } | 283 } |
| 278 | 284 |
| 279 void TargetHandler::WorkerVersionDoomed( | 285 void TargetHandler::WorkerVersionDoomed( |
| 280 ServiceWorkerDevToolsAgentHost* host) { | 286 ServiceWorkerDevToolsAgentHost* host) { |
| 281 UpdateServiceWorkers(); | 287 UpdateServiceWorkers(); |
| 282 } | 288 } |
| 283 | 289 |
| 284 void TargetHandler::WorkerDestroyed( | 290 void TargetHandler::WorkerDestroyed( |
| 285 ServiceWorkerDevToolsAgentHost* host) { | 291 ServiceWorkerDevToolsAgentHost* host) { |
| 286 UpdateServiceWorkers(); | 292 UpdateServiceWorkers(); |
| 287 } | 293 } |
| 288 | 294 |
| 289 } // namespace target | 295 } // namespace target |
| 290 } // namespace devtools | 296 } // namespace devtools |
| 291 } // namespace content | 297 } // namespace content |
| OLD | NEW |