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_view_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/json/json_writer.h" | 8 #include "base/json/json_writer.h" |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
11 #include "content/browser/child_process_security_policy_impl.h" | 11 #include "content/browser/child_process_security_policy_impl.h" |
12 #include "content/browser/devtools/devtools_manager.h" | 12 #include "content/browser/devtools/devtools_manager.h" |
13 #include "content/browser/devtools/protocol/devtools_protocol_handler.h" | 13 #include "content/browser/devtools/protocol/devtools_protocol_handler.h" |
14 #include "content/browser/devtools/protocol/dom_handler.h" | 14 #include "content/browser/devtools/protocol/dom_handler.h" |
15 #include "content/browser/devtools/protocol/input_handler.h" | 15 #include "content/browser/devtools/protocol/input_handler.h" |
(...skipping 16 matching lines...) Expand all Loading... |
32 #include "content/public/browser/render_widget_host_iterator.h" | 32 #include "content/public/browser/render_widget_host_iterator.h" |
33 #include "content/public/browser/web_contents_delegate.h" | 33 #include "content/public/browser/web_contents_delegate.h" |
34 | 34 |
35 #if defined(OS_ANDROID) | 35 #if defined(OS_ANDROID) |
36 #include "content/browser/power_save_blocker_impl.h" | 36 #include "content/browser/power_save_blocker_impl.h" |
37 #include "content/public/browser/render_widget_host_view.h" | 37 #include "content/public/browser/render_widget_host_view.h" |
38 #endif | 38 #endif |
39 | 39 |
40 namespace content { | 40 namespace content { |
41 | 41 |
42 typedef std::vector<RenderViewDevToolsAgentHost*> Instances; | 42 typedef std::vector<RenderFrameDevToolsAgentHost*> Instances; |
43 | 43 |
44 namespace { | 44 namespace { |
45 base::LazyInstance<Instances>::Leaky g_instances = LAZY_INSTANCE_INITIALIZER; | 45 base::LazyInstance<Instances>::Leaky g_instances = LAZY_INSTANCE_INITIALIZER; |
46 | 46 |
47 static RenderViewDevToolsAgentHost* FindAgentHost(RenderFrameHost* host) { | 47 static RenderFrameDevToolsAgentHost* FindAgentHost(RenderFrameHost* host) { |
48 if (g_instances == NULL) | 48 if (g_instances == NULL) |
49 return NULL; | 49 return NULL; |
50 for (Instances::iterator it = g_instances.Get().begin(); | 50 for (Instances::iterator it = g_instances.Get().begin(); |
51 it != g_instances.Get().end(); ++it) { | 51 it != g_instances.Get().end(); ++it) { |
52 if ((*it)->HasRenderFrameHost(host)) | 52 if ((*it)->HasRenderFrameHost(host)) |
53 return *it; | 53 return *it; |
54 } | 54 } |
55 return NULL; | 55 return NULL; |
56 } | 56 } |
57 | 57 |
58 // Returns RenderViewDevToolsAgentHost attached to any of RenderFrameHost | 58 // Returns RenderFrameDevToolsAgentHost attached to any of RenderFrameHost |
59 // instances associated with |web_contents| | 59 // instances associated with |web_contents| |
60 static RenderViewDevToolsAgentHost* FindAgentHost(WebContents* web_contents) { | 60 static RenderFrameDevToolsAgentHost* FindAgentHost(WebContents* web_contents) { |
61 if (g_instances == NULL) | 61 if (g_instances == NULL) |
62 return NULL; | 62 return NULL; |
63 for (Instances::iterator it = g_instances.Get().begin(); | 63 for (Instances::iterator it = g_instances.Get().begin(); |
64 it != g_instances.Get().end(); ++it) { | 64 it != g_instances.Get().end(); ++it) { |
65 if ((*it)->GetWebContents() == web_contents) | 65 if ((*it)->GetWebContents() == web_contents) |
66 return *it; | 66 return *it; |
67 } | 67 } |
68 return NULL; | 68 return NULL; |
69 } | 69 } |
70 | 70 |
71 } // namespace | 71 } // namespace |
72 | 72 |
73 scoped_refptr<DevToolsAgentHost> | 73 scoped_refptr<DevToolsAgentHost> |
74 DevToolsAgentHost::GetOrCreateFor(WebContents* web_contents) { | 74 DevToolsAgentHost::GetOrCreateFor(WebContents* web_contents) { |
75 RenderViewDevToolsAgentHost* result = FindAgentHost(web_contents); | 75 RenderFrameDevToolsAgentHost* result = FindAgentHost(web_contents); |
76 if (!result) | 76 if (!result) |
77 result = new RenderViewDevToolsAgentHost(web_contents->GetMainFrame()); | 77 result = new RenderFrameDevToolsAgentHost(web_contents->GetMainFrame()); |
78 return result; | 78 return result; |
79 } | 79 } |
80 | 80 |
81 // static | 81 // static |
82 bool DevToolsAgentHost::HasFor(WebContents* web_contents) { | 82 bool DevToolsAgentHost::HasFor(WebContents* web_contents) { |
83 return FindAgentHost(web_contents) != NULL; | 83 return FindAgentHost(web_contents) != NULL; |
84 } | 84 } |
85 | 85 |
86 // static | 86 // static |
87 bool DevToolsAgentHost::IsDebuggerAttached(WebContents* web_contents) { | 87 bool DevToolsAgentHost::IsDebuggerAttached(WebContents* web_contents) { |
88 RenderViewDevToolsAgentHost* agent_host = FindAgentHost(web_contents); | 88 RenderFrameDevToolsAgentHost* agent_host = FindAgentHost(web_contents); |
89 return agent_host && agent_host->IsAttached(); | 89 return agent_host && agent_host->IsAttached(); |
90 } | 90 } |
91 | 91 |
92 //static | 92 //static |
93 std::vector<WebContents*> DevToolsAgentHostImpl::GetInspectableWebContents() { | 93 std::vector<WebContents*> DevToolsAgentHostImpl::GetInspectableWebContents() { |
94 std::set<WebContents*> set; | 94 std::set<WebContents*> set; |
95 scoped_ptr<RenderWidgetHostIterator> widgets( | 95 scoped_ptr<RenderWidgetHostIterator> widgets( |
96 RenderWidgetHost::GetRenderWidgetHosts()); | 96 RenderWidgetHost::GetRenderWidgetHosts()); |
97 while (RenderWidgetHost* widget = widgets->GetNextHost()) { | 97 while (RenderWidgetHost* widget = widgets->GetNextHost()) { |
98 // Ignore processes that don't have a connection, such as crashed contents. | 98 // Ignore processes that don't have a connection, such as crashed contents. |
99 if (!widget->GetProcess()->HasConnection()) | 99 if (!widget->GetProcess()->HasConnection()) |
100 continue; | 100 continue; |
101 if (!widget->IsRenderView()) | 101 if (!widget->IsRenderView()) |
102 continue; | 102 continue; |
103 | 103 |
104 RenderViewHost* rvh = RenderViewHost::From(widget); | 104 RenderViewHost* rvh = RenderViewHost::From(widget); |
105 WebContents* web_contents = WebContents::FromRenderViewHost(rvh); | 105 WebContents* web_contents = WebContents::FromRenderViewHost(rvh); |
106 if (web_contents) | 106 if (web_contents) |
107 set.insert(web_contents); | 107 set.insert(web_contents); |
108 } | 108 } |
109 std::vector<WebContents*> result(set.size()); | 109 std::vector<WebContents*> result(set.size()); |
110 std::copy(set.begin(), set.end(), result.begin()); | 110 std::copy(set.begin(), set.end(), result.begin()); |
111 return result; | 111 return result; |
112 } | 112 } |
113 | 113 |
114 // static | 114 // static |
115 void RenderViewDevToolsAgentHost::OnCancelPendingNavigation( | 115 void RenderFrameDevToolsAgentHost::OnCancelPendingNavigation( |
116 RenderFrameHost* pending, | 116 RenderFrameHost* pending, |
117 RenderFrameHost* current) { | 117 RenderFrameHost* current) { |
118 RenderViewDevToolsAgentHost* agent_host = FindAgentHost(pending); | 118 RenderFrameDevToolsAgentHost* agent_host = FindAgentHost(pending); |
119 if (!agent_host) | 119 if (!agent_host) |
120 return; | 120 return; |
121 agent_host->DisconnectRenderFrameHost(); | 121 agent_host->DisconnectRenderFrameHost(); |
122 agent_host->ConnectRenderFrameHost(current); | 122 agent_host->ConnectRenderFrameHost(current); |
123 } | 123 } |
124 | 124 |
125 RenderViewDevToolsAgentHost::RenderViewDevToolsAgentHost(RenderFrameHost* rfh) | 125 RenderFrameDevToolsAgentHost::RenderFrameDevToolsAgentHost(RenderFrameHost* rfh) |
126 : render_frame_host_(NULL), | 126 : render_frame_host_(NULL), |
127 dom_handler_(new devtools::dom::DOMHandler()), | 127 dom_handler_(new devtools::dom::DOMHandler()), |
128 input_handler_(new devtools::input::InputHandler()), | 128 input_handler_(new devtools::input::InputHandler()), |
129 inspector_handler_(new devtools::inspector::InspectorHandler()), | 129 inspector_handler_(new devtools::inspector::InspectorHandler()), |
130 network_handler_(new devtools::network::NetworkHandler()), | 130 network_handler_(new devtools::network::NetworkHandler()), |
131 page_handler_(new devtools::page::PageHandler()), | 131 page_handler_(new devtools::page::PageHandler()), |
132 power_handler_(new devtools::power::PowerHandler()), | 132 power_handler_(new devtools::power::PowerHandler()), |
133 tracing_handler_(new devtools::tracing::TracingHandler( | 133 tracing_handler_(new devtools::tracing::TracingHandler( |
134 devtools::tracing::TracingHandler::Renderer)), | 134 devtools::tracing::TracingHandler::Renderer)), |
135 protocol_handler_(new DevToolsProtocolHandler( | 135 protocol_handler_(new DevToolsProtocolHandler( |
136 base::Bind(&RenderViewDevToolsAgentHost::DispatchOnInspectorFrontend, | 136 base::Bind(&RenderFrameDevToolsAgentHost::DispatchOnInspectorFrontend, |
137 base::Unretained(this)))), | 137 base::Unretained(this)))), |
138 reattaching_(false) { | 138 reattaching_(false) { |
139 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); | 139 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); |
140 dispatcher->SetDOMHandler(dom_handler_.get()); | 140 dispatcher->SetDOMHandler(dom_handler_.get()); |
141 dispatcher->SetInputHandler(input_handler_.get()); | 141 dispatcher->SetInputHandler(input_handler_.get()); |
142 dispatcher->SetInspectorHandler(inspector_handler_.get()); | 142 dispatcher->SetInspectorHandler(inspector_handler_.get()); |
143 dispatcher->SetNetworkHandler(network_handler_.get()); | 143 dispatcher->SetNetworkHandler(network_handler_.get()); |
144 dispatcher->SetPageHandler(page_handler_.get()); | 144 dispatcher->SetPageHandler(page_handler_.get()); |
145 dispatcher->SetPowerHandler(power_handler_.get()); | 145 dispatcher->SetPowerHandler(power_handler_.get()); |
146 dispatcher->SetTracingHandler(tracing_handler_.get()); | 146 dispatcher->SetTracingHandler(tracing_handler_.get()); |
147 SetRenderFrameHost(rfh); | 147 SetRenderFrameHost(rfh); |
148 g_instances.Get().push_back(this); | 148 g_instances.Get().push_back(this); |
149 AddRef(); // Balanced in RenderFrameHostDestroyed. | 149 AddRef(); // Balanced in RenderFrameHostDestroyed. |
150 DevToolsManager::GetInstance()->AgentHostChanged(this); | 150 DevToolsManager::GetInstance()->AgentHostChanged(this); |
151 } | 151 } |
152 | 152 |
153 BrowserContext* RenderViewDevToolsAgentHost::GetBrowserContext() { | 153 BrowserContext* RenderFrameDevToolsAgentHost::GetBrowserContext() { |
154 WebContents* contents = web_contents(); | 154 WebContents* contents = web_contents(); |
155 return contents ? contents->GetBrowserContext() : nullptr; | 155 return contents ? contents->GetBrowserContext() : nullptr; |
156 } | 156 } |
157 | 157 |
158 WebContents* RenderViewDevToolsAgentHost::GetWebContents() { | 158 WebContents* RenderFrameDevToolsAgentHost::GetWebContents() { |
159 return web_contents(); | 159 return web_contents(); |
160 } | 160 } |
161 | 161 |
162 void RenderViewDevToolsAgentHost::DispatchProtocolMessage( | 162 void RenderFrameDevToolsAgentHost::DispatchProtocolMessage( |
163 const std::string& message) { | 163 const std::string& message) { |
164 scoped_ptr<base::DictionaryValue> command = | 164 scoped_ptr<base::DictionaryValue> command = |
165 protocol_handler_->ParseCommand(message); | 165 protocol_handler_->ParseCommand(message); |
166 if (!command) | 166 if (!command) |
167 return; | 167 return; |
168 | 168 |
169 DevToolsManagerDelegate* delegate = | 169 DevToolsManagerDelegate* delegate = |
170 DevToolsManager::GetInstance()->delegate(); | 170 DevToolsManager::GetInstance()->delegate(); |
171 if (delegate) { | 171 if (delegate) { |
172 scoped_ptr<base::DictionaryValue> response( | 172 scoped_ptr<base::DictionaryValue> response( |
173 delegate->HandleCommand(this, command.get())); | 173 delegate->HandleCommand(this, command.get())); |
174 if (response) { | 174 if (response) { |
175 std::string json_response; | 175 std::string json_response; |
176 base::JSONWriter::Write(response.get(), &json_response); | 176 base::JSONWriter::Write(response.get(), &json_response); |
177 DispatchOnInspectorFrontend(json_response); | 177 DispatchOnInspectorFrontend(json_response); |
178 return; | 178 return; |
179 } | 179 } |
180 } | 180 } |
181 | 181 |
182 if (protocol_handler_->HandleOptionalCommand(command.Pass())) | 182 if (protocol_handler_->HandleOptionalCommand(command.Pass())) |
183 return; | 183 return; |
184 | 184 |
185 IPCDevToolsAgentHost::DispatchProtocolMessage(message); | 185 IPCDevToolsAgentHost::DispatchProtocolMessage(message); |
186 } | 186 } |
187 | 187 |
188 void RenderViewDevToolsAgentHost::SendMessageToAgent(IPC::Message* msg) { | 188 void RenderFrameDevToolsAgentHost::SendMessageToAgent(IPC::Message* msg) { |
189 if (!render_frame_host_) | 189 if (!render_frame_host_) |
190 return; | 190 return; |
191 msg->set_routing_id(render_frame_host_->GetRoutingID()); | 191 msg->set_routing_id(render_frame_host_->GetRoutingID()); |
192 render_frame_host_->Send(msg); | 192 render_frame_host_->Send(msg); |
193 } | 193 } |
194 | 194 |
195 void RenderViewDevToolsAgentHost::OnClientAttached() { | 195 void RenderFrameDevToolsAgentHost::OnClientAttached() { |
196 if (!render_frame_host_) | 196 if (!render_frame_host_) |
197 return; | 197 return; |
198 | 198 |
199 InnerOnClientAttached(); | 199 InnerOnClientAttached(); |
200 | 200 |
201 // TODO(kaznacheev): Move this call back to DevToolsManager when | 201 // TODO(kaznacheev): Move this call back to DevToolsManager when |
202 // extensions::ProcessManager no longer relies on this notification. | 202 // extensions::ProcessManager no longer relies on this notification. |
203 if (!reattaching_) | 203 if (!reattaching_) |
204 DevToolsAgentHostImpl::NotifyCallbacks(this, true); | 204 DevToolsAgentHostImpl::NotifyCallbacks(this, true); |
205 } | 205 } |
206 | 206 |
207 void RenderViewDevToolsAgentHost::InnerOnClientAttached() { | 207 void RenderFrameDevToolsAgentHost::InnerOnClientAttached() { |
208 ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadRawCookies( | 208 ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadRawCookies( |
209 render_frame_host_->GetProcess()->GetID()); | 209 render_frame_host_->GetProcess()->GetID()); |
210 | 210 |
211 #if defined(OS_ANDROID) | 211 #if defined(OS_ANDROID) |
212 power_save_blocker_.reset( | 212 power_save_blocker_.reset( |
213 static_cast<PowerSaveBlockerImpl*>( | 213 static_cast<PowerSaveBlockerImpl*>( |
214 PowerSaveBlocker::Create( | 214 PowerSaveBlocker::Create( |
215 PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, | 215 PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, |
216 "DevTools").release())); | 216 "DevTools").release())); |
217 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( | 217 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
218 render_frame_host_->GetRenderViewHost()); | 218 render_frame_host_->GetRenderViewHost()); |
219 if (rvh->GetView()) { | 219 if (rvh->GetView()) { |
220 power_save_blocker_.get()-> | 220 power_save_blocker_.get()-> |
221 InitDisplaySleepBlocker(rvh->GetView()->GetNativeView()); | 221 InitDisplaySleepBlocker(rvh->GetView()->GetNativeView()); |
222 } | 222 } |
223 #endif | 223 #endif |
224 } | 224 } |
225 | 225 |
226 void RenderViewDevToolsAgentHost::OnClientDetached() { | 226 void RenderFrameDevToolsAgentHost::OnClientDetached() { |
227 #if defined(OS_ANDROID) | 227 #if defined(OS_ANDROID) |
228 power_save_blocker_.reset(); | 228 power_save_blocker_.reset(); |
229 #endif | 229 #endif |
230 page_handler_->Detached(); | 230 page_handler_->Detached(); |
231 power_handler_->Detached(); | 231 power_handler_->Detached(); |
232 tracing_handler_->Detached(); | 232 tracing_handler_->Detached(); |
233 ClientDetachedFromRenderer(); | 233 ClientDetachedFromRenderer(); |
234 | 234 |
235 // TODO(kaznacheev): Move this call back to DevToolsManager when | 235 // TODO(kaznacheev): Move this call back to DevToolsManager when |
236 // extensions::ProcessManager no longer relies on this notification. | 236 // extensions::ProcessManager no longer relies on this notification. |
237 if (!reattaching_) | 237 if (!reattaching_) |
238 DevToolsAgentHostImpl::NotifyCallbacks(this, false); | 238 DevToolsAgentHostImpl::NotifyCallbacks(this, false); |
239 } | 239 } |
240 | 240 |
241 void RenderViewDevToolsAgentHost::ClientDetachedFromRenderer() { | 241 void RenderFrameDevToolsAgentHost::ClientDetachedFromRenderer() { |
242 if (!render_frame_host_) | 242 if (!render_frame_host_) |
243 return; | 243 return; |
244 | 244 |
245 InnerClientDetachedFromRenderer(); | 245 InnerClientDetachedFromRenderer(); |
246 } | 246 } |
247 | 247 |
248 void RenderViewDevToolsAgentHost::InnerClientDetachedFromRenderer() { | 248 void RenderFrameDevToolsAgentHost::InnerClientDetachedFromRenderer() { |
249 bool process_has_agents = false; | 249 bool process_has_agents = false; |
250 RenderProcessHost* render_process_host = render_frame_host_->GetProcess(); | 250 RenderProcessHost* render_process_host = render_frame_host_->GetProcess(); |
251 for (Instances::iterator it = g_instances.Get().begin(); | 251 for (Instances::iterator it = g_instances.Get().begin(); |
252 it != g_instances.Get().end(); ++it) { | 252 it != g_instances.Get().end(); ++it) { |
253 if (*it == this || !(*it)->IsAttached()) | 253 if (*it == this || !(*it)->IsAttached()) |
254 continue; | 254 continue; |
255 RenderFrameHost* rfh = (*it)->render_frame_host_; | 255 RenderFrameHost* rfh = (*it)->render_frame_host_; |
256 if (rfh && rfh->GetProcess() == render_process_host) | 256 if (rfh && rfh->GetProcess() == render_process_host) |
257 process_has_agents = true; | 257 process_has_agents = true; |
258 } | 258 } |
259 | 259 |
260 // We are the last to disconnect from the renderer -> revoke permissions. | 260 // We are the last to disconnect from the renderer -> revoke permissions. |
261 if (!process_has_agents) { | 261 if (!process_has_agents) { |
262 ChildProcessSecurityPolicyImpl::GetInstance()->RevokeReadRawCookies( | 262 ChildProcessSecurityPolicyImpl::GetInstance()->RevokeReadRawCookies( |
263 render_process_host->GetID()); | 263 render_process_host->GetID()); |
264 } | 264 } |
265 } | 265 } |
266 | 266 |
267 RenderViewDevToolsAgentHost::~RenderViewDevToolsAgentHost() { | 267 RenderFrameDevToolsAgentHost::~RenderFrameDevToolsAgentHost() { |
268 Instances::iterator it = std::find(g_instances.Get().begin(), | 268 Instances::iterator it = std::find(g_instances.Get().begin(), |
269 g_instances.Get().end(), | 269 g_instances.Get().end(), |
270 this); | 270 this); |
271 if (it != g_instances.Get().end()) | 271 if (it != g_instances.Get().end()) |
272 g_instances.Get().erase(it); | 272 g_instances.Get().erase(it); |
273 } | 273 } |
274 | 274 |
275 // TODO(creis): Consider removing this in favor of RenderFrameHostChanged. | 275 // TODO(creis): Consider removing this in favor of RenderFrameHostChanged. |
276 void RenderViewDevToolsAgentHost::AboutToNavigateRenderFrame( | 276 void RenderFrameDevToolsAgentHost::AboutToNavigateRenderFrame( |
277 RenderFrameHost* old_host, | 277 RenderFrameHost* old_host, |
278 RenderFrameHost* new_host) { | 278 RenderFrameHost* new_host) { |
279 if (render_frame_host_ != old_host) | 279 if (render_frame_host_ != old_host) |
280 return; | 280 return; |
281 | 281 |
282 // TODO(creis): This will need to be updated for --site-per-process, since | 282 // TODO(creis): This will need to be updated for --site-per-process, since |
283 // RenderViewHost is going away and navigations could happen in any frame. | 283 // RenderViewHost is going away and navigations could happen in any frame. |
284 if (render_frame_host_ == new_host) { | 284 if (render_frame_host_ == new_host) { |
285 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( | 285 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
286 render_frame_host_->GetRenderViewHost()); | 286 render_frame_host_->GetRenderViewHost()); |
287 if (rvh->render_view_termination_status() == | 287 if (rvh->render_view_termination_status() == |
288 base::TERMINATION_STATUS_STILL_RUNNING) | 288 base::TERMINATION_STATUS_STILL_RUNNING) |
289 return; | 289 return; |
290 } | 290 } |
291 ReattachToRenderFrameHost(new_host); | 291 ReattachToRenderFrameHost(new_host); |
292 } | 292 } |
293 | 293 |
294 void RenderViewDevToolsAgentHost::RenderFrameHostChanged( | 294 void RenderFrameDevToolsAgentHost::RenderFrameHostChanged( |
295 RenderFrameHost* old_host, | 295 RenderFrameHost* old_host, |
296 RenderFrameHost* new_host) { | 296 RenderFrameHost* new_host) { |
297 if (old_host == render_frame_host_ && new_host != render_frame_host_) { | 297 if (old_host == render_frame_host_ && new_host != render_frame_host_) { |
298 // AboutToNavigateRenderFrame was not called for renderer-initiated | 298 // AboutToNavigateRenderFrame was not called for renderer-initiated |
299 // navigation. | 299 // navigation. |
300 ReattachToRenderFrameHost(new_host); | 300 ReattachToRenderFrameHost(new_host); |
301 } | 301 } |
302 } | 302 } |
303 | 303 |
304 void | 304 void |
305 RenderViewDevToolsAgentHost::ReattachToRenderFrameHost(RenderFrameHost* rfh) { | 305 RenderFrameDevToolsAgentHost::ReattachToRenderFrameHost(RenderFrameHost* rfh) { |
306 DCHECK(!reattaching_); | 306 DCHECK(!reattaching_); |
307 reattaching_ = true; | 307 reattaching_ = true; |
308 DisconnectRenderFrameHost(); | 308 DisconnectRenderFrameHost(); |
309 ConnectRenderFrameHost(rfh); | 309 ConnectRenderFrameHost(rfh); |
310 reattaching_ = false; | 310 reattaching_ = false; |
311 } | 311 } |
312 | 312 |
313 void RenderViewDevToolsAgentHost::RenderFrameDeleted(RenderFrameHost* rfh) { | 313 void RenderFrameDevToolsAgentHost::RenderFrameDeleted(RenderFrameHost* rfh) { |
314 if (rfh != render_frame_host_) | 314 if (rfh != render_frame_host_) |
315 return; | 315 return; |
316 | 316 |
317 DCHECK(render_frame_host_); | 317 DCHECK(render_frame_host_); |
318 scoped_refptr<RenderViewDevToolsAgentHost> protect(this); | 318 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); |
319 HostClosed(); | 319 HostClosed(); |
320 ClearRenderFrameHost(); | 320 ClearRenderFrameHost(); |
321 DevToolsManager::GetInstance()->AgentHostChanged(this); | 321 DevToolsManager::GetInstance()->AgentHostChanged(this); |
322 Release(); | 322 Release(); |
323 } | 323 } |
324 | 324 |
325 void RenderViewDevToolsAgentHost::RenderProcessGone( | 325 void RenderFrameDevToolsAgentHost::RenderProcessGone( |
326 base::TerminationStatus status) { | 326 base::TerminationStatus status) { |
327 switch(status) { | 327 switch(status) { |
328 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: | 328 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: |
329 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: | 329 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: |
330 case base::TERMINATION_STATUS_PROCESS_CRASHED: | 330 case base::TERMINATION_STATUS_PROCESS_CRASHED: |
331 #if defined(OS_ANDROID) | 331 #if defined(OS_ANDROID) |
332 case base::TERMINATION_STATUS_OOM_PROTECTED: | 332 case base::TERMINATION_STATUS_OOM_PROTECTED: |
333 #endif | 333 #endif |
334 RenderFrameCrashed(); | 334 RenderFrameCrashed(); |
335 break; | 335 break; |
336 default: | 336 default: |
337 break; | 337 break; |
338 } | 338 } |
339 } | 339 } |
340 | 340 |
341 bool RenderViewDevToolsAgentHost::OnMessageReceived( | 341 bool RenderFrameDevToolsAgentHost::OnMessageReceived( |
342 const IPC::Message& message) { | 342 const IPC::Message& message) { |
343 if (!render_frame_host_) | 343 if (!render_frame_host_) |
344 return false; | 344 return false; |
345 if (message.type() == ViewHostMsg_SwapCompositorFrame::ID) | 345 if (message.type() == ViewHostMsg_SwapCompositorFrame::ID) |
346 OnSwapCompositorFrame(message); | 346 OnSwapCompositorFrame(message); |
347 return false; | 347 return false; |
348 } | 348 } |
349 | 349 |
350 bool RenderViewDevToolsAgentHost::OnMessageReceived( | 350 bool RenderFrameDevToolsAgentHost::OnMessageReceived( |
351 const IPC::Message& message, | 351 const IPC::Message& message, |
352 RenderFrameHost* render_frame_host) { | 352 RenderFrameHost* render_frame_host) { |
353 if (!render_frame_host_ || render_frame_host != render_frame_host_) | 353 if (!render_frame_host_ || render_frame_host != render_frame_host_) |
354 return false; | 354 return false; |
355 | 355 |
356 bool handled = true; | 356 bool handled = true; |
357 IPC_BEGIN_MESSAGE_MAP(RenderViewDevToolsAgentHost, message) | 357 IPC_BEGIN_MESSAGE_MAP(RenderFrameDevToolsAgentHost, message) |
358 IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend, | 358 IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend, |
359 OnDispatchOnInspectorFrontend) | 359 OnDispatchOnInspectorFrontend) |
360 IPC_MESSAGE_UNHANDLED(handled = false) | 360 IPC_MESSAGE_UNHANDLED(handled = false) |
361 IPC_END_MESSAGE_MAP() | 361 IPC_END_MESSAGE_MAP() |
362 return handled; | 362 return handled; |
363 } | 363 } |
364 | 364 |
365 void RenderViewDevToolsAgentHost::DidAttachInterstitialPage() { | 365 void RenderFrameDevToolsAgentHost::DidAttachInterstitialPage() { |
366 page_handler_->DidAttachInterstitialPage(); | 366 page_handler_->DidAttachInterstitialPage(); |
367 | 367 |
368 if (!render_frame_host_) | 368 if (!render_frame_host_) |
369 return; | 369 return; |
370 // The rvh set in AboutToNavigateRenderFrame turned out to be interstitial. | 370 // The rvh set in AboutToNavigateRenderFrame turned out to be interstitial. |
371 // Connect back to the real one. | 371 // Connect back to the real one. |
372 WebContents* web_contents = | 372 WebContents* web_contents = |
373 WebContents::FromRenderFrameHost(render_frame_host_); | 373 WebContents::FromRenderFrameHost(render_frame_host_); |
374 if (!web_contents) | 374 if (!web_contents) |
375 return; | 375 return; |
376 DisconnectRenderFrameHost(); | 376 DisconnectRenderFrameHost(); |
377 ConnectRenderFrameHost(web_contents->GetMainFrame()); | 377 ConnectRenderFrameHost(web_contents->GetMainFrame()); |
378 } | 378 } |
379 | 379 |
380 void RenderViewDevToolsAgentHost::DidDetachInterstitialPage() { | 380 void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() { |
381 page_handler_->DidDetachInterstitialPage(); | 381 page_handler_->DidDetachInterstitialPage(); |
382 } | 382 } |
383 | 383 |
384 void RenderViewDevToolsAgentHost::TitleWasSet( | 384 void RenderFrameDevToolsAgentHost::TitleWasSet( |
385 NavigationEntry* entry, bool explicit_set) { | 385 NavigationEntry* entry, bool explicit_set) { |
386 DevToolsManager::GetInstance()->AgentHostChanged(this); | 386 DevToolsManager::GetInstance()->AgentHostChanged(this); |
387 } | 387 } |
388 | 388 |
389 void RenderViewDevToolsAgentHost::NavigationEntryCommitted( | 389 void RenderFrameDevToolsAgentHost::NavigationEntryCommitted( |
390 const LoadCommittedDetails& load_details) { | 390 const LoadCommittedDetails& load_details) { |
391 DevToolsManager::GetInstance()->AgentHostChanged(this); | 391 DevToolsManager::GetInstance()->AgentHostChanged(this); |
392 } | 392 } |
393 | 393 |
394 void RenderViewDevToolsAgentHost::Observe(int type, | 394 void RenderFrameDevToolsAgentHost::Observe(int type, |
395 const NotificationSource& source, | 395 const NotificationSource& source, |
396 const NotificationDetails& details) { | 396 const NotificationDetails& details) { |
397 if (type == content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) { | 397 if (type == content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) { |
398 bool visible = *Details<bool>(details).ptr(); | 398 bool visible = *Details<bool>(details).ptr(); |
399 page_handler_->OnVisibilityChanged(visible); | 399 page_handler_->OnVisibilityChanged(visible); |
400 } | 400 } |
401 } | 401 } |
402 | 402 |
403 void RenderViewDevToolsAgentHost::SetRenderFrameHost(RenderFrameHost* rfh) { | 403 void RenderFrameDevToolsAgentHost::SetRenderFrameHost(RenderFrameHost* rfh) { |
404 DCHECK(!render_frame_host_); | 404 DCHECK(!render_frame_host_); |
405 render_frame_host_ = static_cast<RenderFrameHostImpl*>(rfh); | 405 render_frame_host_ = static_cast<RenderFrameHostImpl*>(rfh); |
406 | 406 |
407 WebContentsObserver::Observe(WebContents::FromRenderFrameHost(rfh)); | 407 WebContentsObserver::Observe(WebContents::FromRenderFrameHost(rfh)); |
408 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( | 408 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
409 rfh->GetRenderViewHost()); | 409 rfh->GetRenderViewHost()); |
410 dom_handler_->SetRenderViewHost(rvh); | 410 dom_handler_->SetRenderViewHost(rvh); |
411 input_handler_->SetRenderViewHost(rvh); | 411 input_handler_->SetRenderViewHost(rvh); |
412 network_handler_->SetRenderViewHost(rvh); | 412 network_handler_->SetRenderViewHost(rvh); |
413 page_handler_->SetRenderViewHost(rvh); | 413 page_handler_->SetRenderViewHost(rvh); |
414 | 414 |
415 registrar_.Add( | 415 registrar_.Add( |
416 this, | 416 this, |
417 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, | 417 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, |
418 content::Source<RenderWidgetHost>(rvh)); | 418 content::Source<RenderWidgetHost>(rvh)); |
419 } | 419 } |
420 | 420 |
421 void RenderViewDevToolsAgentHost::ClearRenderFrameHost() { | 421 void RenderFrameDevToolsAgentHost::ClearRenderFrameHost() { |
422 DCHECK(render_frame_host_); | 422 DCHECK(render_frame_host_); |
423 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( | 423 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
424 render_frame_host_->GetRenderViewHost()); | 424 render_frame_host_->GetRenderViewHost()); |
425 registrar_.Remove( | 425 registrar_.Remove( |
426 this, | 426 this, |
427 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, | 427 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, |
428 content::Source<RenderWidgetHost>(rvh)); | 428 content::Source<RenderWidgetHost>(rvh)); |
429 render_frame_host_ = nullptr; | 429 render_frame_host_ = nullptr; |
430 dom_handler_->SetRenderViewHost(nullptr); | 430 dom_handler_->SetRenderViewHost(nullptr); |
431 input_handler_->SetRenderViewHost(nullptr); | 431 input_handler_->SetRenderViewHost(nullptr); |
432 network_handler_->SetRenderViewHost(nullptr); | 432 network_handler_->SetRenderViewHost(nullptr); |
433 page_handler_->SetRenderViewHost(nullptr); | 433 page_handler_->SetRenderViewHost(nullptr); |
434 } | 434 } |
435 | 435 |
436 void RenderViewDevToolsAgentHost::DisconnectWebContents() { | 436 void RenderFrameDevToolsAgentHost::DisconnectWebContents() { |
437 DisconnectRenderFrameHost(); | 437 DisconnectRenderFrameHost(); |
438 } | 438 } |
439 | 439 |
440 void RenderViewDevToolsAgentHost::ConnectWebContents(WebContents* wc) { | 440 void RenderFrameDevToolsAgentHost::ConnectWebContents(WebContents* wc) { |
441 ConnectRenderFrameHost(wc->GetMainFrame()); | 441 ConnectRenderFrameHost(wc->GetMainFrame()); |
442 } | 442 } |
443 | 443 |
444 DevToolsAgentHost::Type RenderViewDevToolsAgentHost::GetType() { | 444 DevToolsAgentHost::Type RenderFrameDevToolsAgentHost::GetType() { |
445 return TYPE_WEB_CONTENTS; | 445 return TYPE_WEB_CONTENTS; |
446 } | 446 } |
447 | 447 |
448 std::string RenderViewDevToolsAgentHost::GetTitle() { | 448 std::string RenderFrameDevToolsAgentHost::GetTitle() { |
449 if (WebContents* web_contents = GetWebContents()) | 449 if (WebContents* web_contents = GetWebContents()) |
450 return base::UTF16ToUTF8(web_contents->GetTitle()); | 450 return base::UTF16ToUTF8(web_contents->GetTitle()); |
451 return ""; | 451 return ""; |
452 } | 452 } |
453 | 453 |
454 GURL RenderViewDevToolsAgentHost::GetURL() { | 454 GURL RenderFrameDevToolsAgentHost::GetURL() { |
455 if (WebContents* web_contents = GetWebContents()) | 455 if (WebContents* web_contents = GetWebContents()) |
456 return web_contents->GetVisibleURL(); | 456 return web_contents->GetVisibleURL(); |
457 return render_frame_host_ ? | 457 return render_frame_host_ ? |
458 render_frame_host_->GetLastCommittedURL() : GURL(); | 458 render_frame_host_->GetLastCommittedURL() : GURL(); |
459 } | 459 } |
460 | 460 |
461 bool RenderViewDevToolsAgentHost::Activate() { | 461 bool RenderFrameDevToolsAgentHost::Activate() { |
462 if (render_frame_host_) { | 462 if (render_frame_host_) { |
463 render_frame_host_->GetRenderViewHost()->GetDelegate()->Activate(); | 463 render_frame_host_->GetRenderViewHost()->GetDelegate()->Activate(); |
464 return true; | 464 return true; |
465 } | 465 } |
466 return false; | 466 return false; |
467 } | 467 } |
468 | 468 |
469 bool RenderViewDevToolsAgentHost::Close() { | 469 bool RenderFrameDevToolsAgentHost::Close() { |
470 if (render_frame_host_) { | 470 if (render_frame_host_) { |
471 render_frame_host_->GetRenderViewHost()->ClosePage(); | 471 render_frame_host_->GetRenderViewHost()->ClosePage(); |
472 return true; | 472 return true; |
473 } | 473 } |
474 return false; | 474 return false; |
475 } | 475 } |
476 | 476 |
477 void RenderViewDevToolsAgentHost::ConnectRenderFrameHost(RenderFrameHost* rfh) { | 477 void RenderFrameDevToolsAgentHost::ConnectRenderFrameHost( |
| 478 RenderFrameHost* rfh) { |
478 SetRenderFrameHost(rfh); | 479 SetRenderFrameHost(rfh); |
479 if (IsAttached()) | 480 if (IsAttached()) |
480 Reattach(); | 481 Reattach(); |
481 } | 482 } |
482 | 483 |
483 void RenderViewDevToolsAgentHost::DisconnectRenderFrameHost() { | 484 void RenderFrameDevToolsAgentHost::DisconnectRenderFrameHost() { |
484 ClientDetachedFromRenderer(); | 485 ClientDetachedFromRenderer(); |
485 ClearRenderFrameHost(); | 486 ClearRenderFrameHost(); |
486 } | 487 } |
487 | 488 |
488 void RenderViewDevToolsAgentHost::RenderFrameCrashed() { | 489 void RenderFrameDevToolsAgentHost::RenderFrameCrashed() { |
489 inspector_handler_->TargetCrashed(); | 490 inspector_handler_->TargetCrashed(); |
490 } | 491 } |
491 | 492 |
492 void RenderViewDevToolsAgentHost::OnSwapCompositorFrame( | 493 void RenderFrameDevToolsAgentHost::OnSwapCompositorFrame( |
493 const IPC::Message& message) { | 494 const IPC::Message& message) { |
494 ViewHostMsg_SwapCompositorFrame::Param param; | 495 ViewHostMsg_SwapCompositorFrame::Param param; |
495 if (!ViewHostMsg_SwapCompositorFrame::Read(&message, ¶m)) | 496 if (!ViewHostMsg_SwapCompositorFrame::Read(&message, ¶m)) |
496 return; | 497 return; |
497 page_handler_->OnSwapCompositorFrame(get<1>(param).metadata); | 498 page_handler_->OnSwapCompositorFrame(get<1>(param).metadata); |
498 } | 499 } |
499 | 500 |
500 void RenderViewDevToolsAgentHost::SynchronousSwapCompositorFrame( | 501 void RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame( |
501 const cc::CompositorFrameMetadata& frame_metadata) { | 502 const cc::CompositorFrameMetadata& frame_metadata) { |
502 if (!render_frame_host_) | 503 if (!render_frame_host_) |
503 return; | 504 return; |
504 page_handler_->OnSwapCompositorFrame(frame_metadata); | 505 page_handler_->OnSwapCompositorFrame(frame_metadata); |
505 } | 506 } |
506 | 507 |
507 bool RenderViewDevToolsAgentHost::HasRenderFrameHost( | 508 bool RenderFrameDevToolsAgentHost::HasRenderFrameHost( |
508 RenderFrameHost* host) { | 509 RenderFrameHost* host) { |
509 return host == render_frame_host_; | 510 return host == render_frame_host_; |
510 } | 511 } |
511 | 512 |
512 void RenderViewDevToolsAgentHost::OnDispatchOnInspectorFrontend( | 513 void RenderFrameDevToolsAgentHost::OnDispatchOnInspectorFrontend( |
513 const DevToolsMessageChunk& message) { | 514 const DevToolsMessageChunk& message) { |
514 if (!IsAttached() || !render_frame_host_) | 515 if (!IsAttached() || !render_frame_host_) |
515 return; | 516 return; |
516 ProcessChunkedMessageFromAgent(message); | 517 ProcessChunkedMessageFromAgent(message); |
517 } | 518 } |
518 | 519 |
519 void RenderViewDevToolsAgentHost::DispatchOnInspectorFrontend( | 520 void RenderFrameDevToolsAgentHost::DispatchOnInspectorFrontend( |
520 const std::string& message) { | 521 const std::string& message) { |
521 if (!IsAttached() || !render_frame_host_) | 522 if (!IsAttached() || !render_frame_host_) |
522 return; | 523 return; |
523 SendMessageToClient(message); | 524 SendMessageToClient(message); |
524 } | 525 } |
525 | 526 |
526 } // namespace content | 527 } // namespace content |
OLD | NEW |