Commit 40ce1c66 authored by dgozman's avatar dgozman Committed by Commit bot

[DevTools] Only create DevToolsAgentHost for main frame and cross-process subframes.

BUG=464993

Review URL: https://codereview.chromium.org/1035793002

Cr-Commit-Position: refs/heads/master@{#322359}
parent 0b6a6681
......@@ -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*>(
......
......@@ -128,6 +128,7 @@ class CONTENT_EXPORT RenderFrameDevToolsAgentHost
void InnerClientDetachedFromRenderer();
bool IsChildFrame();
void DestroyOnRenderFrameGone();
RenderFrameHostImpl* render_frame_host_;
scoped_ptr<devtools::dom::DOMHandler> dom_handler_;
......
......@@ -103,9 +103,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessDevToolsBrowserTest,
EXPECT_EQ(1U, list.size());
EXPECT_EQ(DevToolsAgentHost::TYPE_WEB_CONTENTS, list[0]->GetType());
EXPECT_EQ(main_url.spec(), list[0]->GetURL().spec());
// TODO(dgozman): we should get closed notification here.
// See http://crbug.com/464993.
EXPECT_FALSE(client.closed());
EXPECT_TRUE(client.closed());
child_host->DetachClient();
child_host = nullptr;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment