| 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 |