| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/render_frame_devtools_agent_host.h" | 5 #include "content/browser/devtools/render_frame_devtools_agent_host.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "content/browser/child_process_security_policy_impl.h" | 10 #include "content/browser/child_process_security_policy_impl.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 public: | 79 public: |
| 80 FrameHostHolder( | 80 FrameHostHolder( |
| 81 RenderFrameDevToolsAgentHost* agent, RenderFrameHostImpl* host); | 81 RenderFrameDevToolsAgentHost* agent, RenderFrameHostImpl* host); |
| 82 ~FrameHostHolder(); | 82 ~FrameHostHolder(); |
| 83 | 83 |
| 84 RenderFrameHostImpl* host() const { return host_; } | 84 RenderFrameHostImpl* host() const { return host_; } |
| 85 | 85 |
| 86 void Attach(); | 86 void Attach(); |
| 87 void Reattach(FrameHostHolder* old); | 87 void Reattach(FrameHostHolder* old); |
| 88 void Detach(); | 88 void Detach(); |
| 89 void DispatchProtocolMessage(int session_id, | 89 void DispatchProtocolMessage(int call_id, const std::string& message); |
| 90 int call_id, | |
| 91 const std::string& message); | |
| 92 void InspectElement(int x, int y); | 90 void InspectElement(int x, int y); |
| 93 void ProcessChunkedMessageFromAgent(const DevToolsMessageChunk& chunk); | 91 void ProcessChunkedMessageFromAgent(const DevToolsMessageChunk& chunk); |
| 94 void Suspend(); | 92 void Suspend(); |
| 95 void Resume(); | 93 void Resume(); |
| 96 | 94 |
| 97 private: | 95 private: |
| 98 void GrantPolicy(); | 96 void GrantPolicy(); |
| 99 void RevokePolicy(); | 97 void RevokePolicy(); |
| 100 void SendMessageToClient(int session_id, const std::string& message); | 98 void SendMessageToClient(const std::string& message); |
| 101 | 99 |
| 102 RenderFrameDevToolsAgentHost* agent_; | 100 RenderFrameDevToolsAgentHost* agent_; |
| 103 RenderFrameHostImpl* host_; | 101 RenderFrameHostImpl* host_; |
| 104 bool attached_; | 102 bool attached_; |
| 105 bool suspended_; | 103 bool suspended_; |
| 106 DevToolsMessageChunkProcessor chunk_processor_; | 104 DevToolsMessageChunkProcessor chunk_processor_; |
| 107 // <session_id, message> | 105 std::vector<std::string> pending_messages_; |
| 108 std::vector<std::pair<int, std::string>> pending_messages_; | 106 std::map<int, std::string> sent_messages_; |
| 109 // <call_id> -> <session_id, message> | |
| 110 std::map<int, std::pair<int, std::string>> sent_messages_; | |
| 111 }; | 107 }; |
| 112 | 108 |
| 113 RenderFrameDevToolsAgentHost::FrameHostHolder::FrameHostHolder( | 109 RenderFrameDevToolsAgentHost::FrameHostHolder::FrameHostHolder( |
| 114 RenderFrameDevToolsAgentHost* agent, RenderFrameHostImpl* host) | 110 RenderFrameDevToolsAgentHost* agent, RenderFrameHostImpl* host) |
| 115 : agent_(agent), | 111 : agent_(agent), |
| 116 host_(host), | 112 host_(host), |
| 117 attached_(false), | 113 attached_(false), |
| 118 suspended_(false), | 114 suspended_(false), |
| 119 chunk_processor_(base::Bind( | 115 chunk_processor_(base::Bind( |
| 120 &RenderFrameDevToolsAgentHost::FrameHostHolder::SendMessageToClient, | 116 &RenderFrameDevToolsAgentHost::FrameHostHolder::SendMessageToClient, |
| 121 base::Unretained(this))) { | 117 base::Unretained(this))) { |
| 122 DCHECK(agent_); | 118 DCHECK(agent_); |
| 123 DCHECK(host_); | 119 DCHECK(host_); |
| 124 } | 120 } |
| 125 | 121 |
| 126 RenderFrameDevToolsAgentHost::FrameHostHolder::~FrameHostHolder() { | 122 RenderFrameDevToolsAgentHost::FrameHostHolder::~FrameHostHolder() { |
| 127 if (attached_) | 123 if (attached_) |
| 128 RevokePolicy(); | 124 RevokePolicy(); |
| 129 } | 125 } |
| 130 | 126 |
| 131 void RenderFrameDevToolsAgentHost::FrameHostHolder::Attach() { | 127 void RenderFrameDevToolsAgentHost::FrameHostHolder::Attach() { |
| 132 host_->Send(new DevToolsAgentMsg_Attach( | 128 host_->Send(new DevToolsAgentMsg_Attach( |
| 133 host_->GetRoutingID(), agent_->GetId(), agent_->session_id())); | 129 host_->GetRoutingID(), agent_->GetId())); |
| 134 GrantPolicy(); | 130 GrantPolicy(); |
| 135 attached_ = true; | 131 attached_ = true; |
| 136 } | 132 } |
| 137 | 133 |
| 138 void RenderFrameDevToolsAgentHost::FrameHostHolder::Reattach( | 134 void RenderFrameDevToolsAgentHost::FrameHostHolder::Reattach( |
| 139 FrameHostHolder* old) { | 135 FrameHostHolder* old) { |
| 140 if (old) | 136 if (old) |
| 141 chunk_processor_.set_state_cookie(old->chunk_processor_.state_cookie()); | 137 chunk_processor_.set_state_cookie(old->chunk_processor_.state_cookie()); |
| 142 host_->Send(new DevToolsAgentMsg_Reattach( | 138 host_->Send(new DevToolsAgentMsg_Reattach( |
| 143 host_->GetRoutingID(), agent_->GetId(), agent_->session_id(), | 139 host_->GetRoutingID(), agent_->GetId(), chunk_processor_.state_cookie())); |
| 144 chunk_processor_.state_cookie())); | |
| 145 if (old) { | 140 if (old) { |
| 146 for (const auto& pair : old->sent_messages_) { | 141 for (const auto& pair : old->sent_messages_) |
| 147 DispatchProtocolMessage(pair.second.first, pair.first, | 142 DispatchProtocolMessage(pair.first, pair.second); |
| 148 pair.second.second); | |
| 149 } | |
| 150 } | 143 } |
| 151 GrantPolicy(); | 144 GrantPolicy(); |
| 152 attached_ = true; | 145 attached_ = true; |
| 153 } | 146 } |
| 154 | 147 |
| 155 void RenderFrameDevToolsAgentHost::FrameHostHolder::Detach() { | 148 void RenderFrameDevToolsAgentHost::FrameHostHolder::Detach() { |
| 156 host_->Send(new DevToolsAgentMsg_Detach(host_->GetRoutingID())); | 149 host_->Send(new DevToolsAgentMsg_Detach(host_->GetRoutingID())); |
| 157 RevokePolicy(); | 150 RevokePolicy(); |
| 158 attached_ = false; | 151 attached_ = false; |
| 159 } | 152 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 179 } | 172 } |
| 180 } | 173 } |
| 181 | 174 |
| 182 // We are the last to disconnect from the renderer -> revoke permissions. | 175 // We are the last to disconnect from the renderer -> revoke permissions. |
| 183 if (!process_has_agents) { | 176 if (!process_has_agents) { |
| 184 ChildProcessSecurityPolicyImpl::GetInstance()->RevokeReadRawCookies( | 177 ChildProcessSecurityPolicyImpl::GetInstance()->RevokeReadRawCookies( |
| 185 process_host->GetID()); | 178 process_host->GetID()); |
| 186 } | 179 } |
| 187 } | 180 } |
| 188 void RenderFrameDevToolsAgentHost::FrameHostHolder::DispatchProtocolMessage( | 181 void RenderFrameDevToolsAgentHost::FrameHostHolder::DispatchProtocolMessage( |
| 189 int session_id, | 182 int call_id, const std::string& message) { |
| 190 int call_id, | |
| 191 const std::string& message) { | |
| 192 host_->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend( | 183 host_->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend( |
| 193 host_->GetRoutingID(), session_id, message)); | 184 host_->GetRoutingID(), message)); |
| 194 sent_messages_[call_id] = std::make_pair(session_id, message); | 185 sent_messages_[call_id] = message; |
| 195 } | 186 } |
| 196 | 187 |
| 197 void RenderFrameDevToolsAgentHost::FrameHostHolder::InspectElement( | 188 void RenderFrameDevToolsAgentHost::FrameHostHolder::InspectElement( |
| 198 int x, int y) { | 189 int x, int y) { |
| 199 host_->Send(new DevToolsAgentMsg_InspectElement( | 190 host_->Send(new DevToolsAgentMsg_InspectElement( |
| 200 host_->GetRoutingID(), agent_->GetId(), agent_->session_id(), x, y)); | 191 host_->GetRoutingID(), agent_->GetId(), x, y)); |
| 201 } | 192 } |
| 202 | 193 |
| 203 void | 194 void |
| 204 RenderFrameDevToolsAgentHost::FrameHostHolder::ProcessChunkedMessageFromAgent( | 195 RenderFrameDevToolsAgentHost::FrameHostHolder::ProcessChunkedMessageFromAgent( |
| 205 const DevToolsMessageChunk& chunk) { | 196 const DevToolsMessageChunk& chunk) { |
| 206 chunk_processor_.ProcessChunkedMessageFromAgent(chunk); | 197 chunk_processor_.ProcessChunkedMessageFromAgent(chunk); |
| 207 } | 198 } |
| 208 | 199 |
| 209 void RenderFrameDevToolsAgentHost::FrameHostHolder::SendMessageToClient( | 200 void RenderFrameDevToolsAgentHost::FrameHostHolder::SendMessageToClient( |
| 210 int session_id, | |
| 211 const std::string& message) { | 201 const std::string& message) { |
| 212 sent_messages_.erase(chunk_processor_.last_call_id()); | 202 sent_messages_.erase(chunk_processor_.last_call_id()); |
| 213 if (suspended_) | 203 if (suspended_) |
| 214 pending_messages_.push_back(std::make_pair(session_id, message)); | 204 pending_messages_.push_back(message); |
| 215 else | 205 else |
| 216 agent_->SendMessageToClient(session_id, message); | 206 agent_->SendMessageToClient(message); |
| 217 } | 207 } |
| 218 | 208 |
| 219 void RenderFrameDevToolsAgentHost::FrameHostHolder::Suspend() { | 209 void RenderFrameDevToolsAgentHost::FrameHostHolder::Suspend() { |
| 220 suspended_ = true; | 210 suspended_ = true; |
| 221 } | 211 } |
| 222 | 212 |
| 223 void RenderFrameDevToolsAgentHost::FrameHostHolder::Resume() { | 213 void RenderFrameDevToolsAgentHost::FrameHostHolder::Resume() { |
| 224 suspended_ = false; | 214 suspended_ = false; |
| 225 for (const auto& pair : pending_messages_) | 215 for (const std::string& message : pending_messages_) |
| 226 agent_->SendMessageToClient(pair.first, pair.second); | 216 agent_->SendMessageToClient(message); |
| 227 std::vector<std::pair<int, std::string>> empty; | 217 std::vector<std::string> empty; |
| 228 pending_messages_.swap(empty); | 218 pending_messages_.swap(empty); |
| 229 } | 219 } |
| 230 | 220 |
| 231 // RenderFrameDevToolsAgentHost ------------------------------------------------ | 221 // RenderFrameDevToolsAgentHost ------------------------------------------------ |
| 232 | 222 |
| 233 scoped_refptr<DevToolsAgentHost> | 223 scoped_refptr<DevToolsAgentHost> |
| 234 DevToolsAgentHost::GetOrCreateFor(RenderFrameHost* frame_host) { | 224 DevToolsAgentHost::GetOrCreateFor(RenderFrameHost* frame_host) { |
| 235 while (frame_host && !ShouldCreateDevToolsFor(frame_host)) | 225 while (frame_host && !ShouldCreateDevToolsFor(frame_host)) |
| 236 frame_host = frame_host->GetParent(); | 226 frame_host = frame_host->GetParent(); |
| 237 DCHECK(frame_host); | 227 DCHECK(frame_host); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 network_handler_(new devtools::network::NetworkHandler()), | 318 network_handler_(new devtools::network::NetworkHandler()), |
| 329 page_handler_(nullptr), | 319 page_handler_(nullptr), |
| 330 security_handler_(nullptr), | 320 security_handler_(nullptr), |
| 331 service_worker_handler_( | 321 service_worker_handler_( |
| 332 new devtools::service_worker::ServiceWorkerHandler()), | 322 new devtools::service_worker::ServiceWorkerHandler()), |
| 333 tracing_handler_(new devtools::tracing::TracingHandler( | 323 tracing_handler_(new devtools::tracing::TracingHandler( |
| 334 devtools::tracing::TracingHandler::Renderer, | 324 devtools::tracing::TracingHandler::Renderer, |
| 335 GetIOContext())), | 325 GetIOContext())), |
| 336 emulation_handler_(nullptr), | 326 emulation_handler_(nullptr), |
| 337 frame_trace_recorder_(nullptr), | 327 frame_trace_recorder_(nullptr), |
| 338 protocol_handler_(new DevToolsProtocolHandler(this)), | 328 protocol_handler_(new DevToolsProtocolHandler( |
| 329 this, |
| 330 base::Bind(&RenderFrameDevToolsAgentHost::SendMessageToClient, |
| 331 base::Unretained(this)))), |
| 339 current_frame_crashed_(false) { | 332 current_frame_crashed_(false) { |
| 340 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); | 333 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); |
| 341 dispatcher->SetDOMHandler(dom_handler_.get()); | 334 dispatcher->SetDOMHandler(dom_handler_.get()); |
| 342 dispatcher->SetInputHandler(input_handler_.get()); | 335 dispatcher->SetInputHandler(input_handler_.get()); |
| 343 dispatcher->SetInspectorHandler(inspector_handler_.get()); | 336 dispatcher->SetInspectorHandler(inspector_handler_.get()); |
| 344 dispatcher->SetIOHandler(io_handler_.get()); | 337 dispatcher->SetIOHandler(io_handler_.get()); |
| 345 dispatcher->SetNetworkHandler(network_handler_.get()); | 338 dispatcher->SetNetworkHandler(network_handler_.get()); |
| 346 dispatcher->SetServiceWorkerHandler(service_worker_handler_.get()); | 339 dispatcher->SetServiceWorkerHandler(service_worker_handler_.get()); |
| 347 dispatcher->SetTracingHandler(tracing_handler_.get()); | 340 dispatcher->SetTracingHandler(tracing_handler_.get()); |
| 348 | 341 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 if (current_) | 416 if (current_) |
| 424 current_->Detach(); | 417 current_->Detach(); |
| 425 if (pending_) | 418 if (pending_) |
| 426 pending_->Detach(); | 419 pending_->Detach(); |
| 427 OnClientDetached(); | 420 OnClientDetached(); |
| 428 } | 421 } |
| 429 | 422 |
| 430 bool RenderFrameDevToolsAgentHost::DispatchProtocolMessage( | 423 bool RenderFrameDevToolsAgentHost::DispatchProtocolMessage( |
| 431 const std::string& message) { | 424 const std::string& message) { |
| 432 int call_id = 0; | 425 int call_id = 0; |
| 433 if (protocol_handler_->HandleOptionalMessage(session_id(), message, &call_id)) | 426 if (protocol_handler_->HandleOptionalMessage(message, &call_id)) |
| 434 return true; | 427 return true; |
| 435 | 428 |
| 436 if (current_) | 429 if (current_) |
| 437 current_->DispatchProtocolMessage(session_id(), call_id, message); | 430 current_->DispatchProtocolMessage(call_id, message); |
| 438 if (pending_) | 431 if (pending_) |
| 439 pending_->DispatchProtocolMessage(session_id(), call_id, message); | 432 pending_->DispatchProtocolMessage(call_id, message); |
| 440 return true; | 433 return true; |
| 441 } | 434 } |
| 442 | 435 |
| 443 void RenderFrameDevToolsAgentHost::InspectElement(int x, int y) { | 436 void RenderFrameDevToolsAgentHost::InspectElement(int x, int y) { |
| 444 if (current_) | 437 if (current_) |
| 445 current_->InspectElement(x, y); | 438 current_->InspectElement(x, y); |
| 446 if (pending_) | 439 if (pending_) |
| 447 pending_->InspectElement(x, y); | 440 pending_->InspectElement(x, y); |
| 448 } | 441 } |
| 449 | 442 |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 747 RenderFrameHost* host) { | 740 RenderFrameHost* host) { |
| 748 return (current_ && current_->host() == host) || | 741 return (current_ && current_->host() == host) || |
| 749 (pending_ && pending_->host() == host); | 742 (pending_ && pending_->host() == host); |
| 750 } | 743 } |
| 751 | 744 |
| 752 bool RenderFrameDevToolsAgentHost::IsChildFrame() { | 745 bool RenderFrameDevToolsAgentHost::IsChildFrame() { |
| 753 return current_ && current_->host()->GetParent(); | 746 return current_ && current_->host()->GetParent(); |
| 754 } | 747 } |
| 755 | 748 |
| 756 } // namespace content | 749 } // namespace content |
| OLD | NEW |