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 |