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