Index: content/browser/devtools/render_frame_devtools_agent_host.cc |
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc |
index 29d536708903ca22a66b186dfdc13e1b2eb6baec..2c8637f21566bb17188bc231a52ed6351dbe8c81 100644 |
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc |
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc |
@@ -69,6 +69,10 @@ static RenderFrameDevToolsAgentHost* FindAgentHost(WebContents* web_contents) { |
return NULL; |
} |
+bool ShouldCreateDevToolsFor(RenderFrameHost* rfh) { |
+ return rfh->IsCrossProcessSubframe() || !rfh->GetParent(); |
+} |
+ |
} // namespace |
scoped_refptr<DevToolsAgentHost> |
@@ -95,7 +99,7 @@ void RenderFrameDevToolsAgentHost::AppendAgentHostForFrameIfApplicable( |
RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(host); |
if (!rfh->IsRenderFrameLive()) |
return; |
- if (rfh->IsCrossProcessSubframe() || !rfh->GetParent()) |
+ if (ShouldCreateDevToolsFor(rfh)) |
result->push_back(RenderFrameDevToolsAgentHost::GetOrCreateFor(rfh)); |
} |
@@ -291,6 +295,12 @@ void RenderFrameDevToolsAgentHost::RenderFrameHostChanged( |
void |
RenderFrameDevToolsAgentHost::ReattachToRenderFrameHost(RenderFrameHost* rfh) { |
+ if (!ShouldCreateDevToolsFor(rfh)) { |
+ DestroyOnRenderFrameGone(); |
+ // |this| may be deleted at this point. |
+ return; |
+ } |
+ |
DCHECK(!reattaching_); |
reattaching_ = true; |
DisconnectRenderFrameHost(); |
@@ -301,7 +311,11 @@ RenderFrameDevToolsAgentHost::ReattachToRenderFrameHost(RenderFrameHost* rfh) { |
void RenderFrameDevToolsAgentHost::FrameDeleted(RenderFrameHost* rfh) { |
if (rfh != render_frame_host_) |
return; |
+ DestroyOnRenderFrameGone(); |
+ // |this| may be deleted at this point. |
+} |
+void RenderFrameDevToolsAgentHost::DestroyOnRenderFrameGone() { |
DCHECK(render_frame_host_); |
scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); |
HostClosed(); |
@@ -396,11 +410,9 @@ void RenderFrameDevToolsAgentHost::Observe(int type, |
} |
void RenderFrameDevToolsAgentHost::SetRenderFrameHost(RenderFrameHost* rfh) { |
+ DCHECK(ShouldCreateDevToolsFor(rfh)); |
DCHECK(!render_frame_host_); |
render_frame_host_ = static_cast<RenderFrameHostImpl*>(rfh); |
- // TODO(dgozman): here we should DCHECK that frame host is either root or |
- // cross process subframe, but this requires handling cross-process |
- // navigation. See http://crbug.com/464993. |
WebContentsObserver::Observe(WebContents::FromRenderFrameHost(rfh)); |
RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |