diff options
author | nasko <nasko@chromium.org> | 2014-10-16 21:06:00 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-17 04:06:20 +0000 |
commit | 6e5f5510621232a24338c6036ed083d496213aa9 (patch) | |
tree | 0fb04c2c73e3f13d03a096063a3371bcd0e41be8 | |
parent | 5ccddf94823808b37a2179e3b3e2fd6f8a0f5286 (diff) | |
download | chromium_src-6e5f5510621232a24338c6036ed083d496213aa9.zip chromium_src-6e5f5510621232a24338c6036ed083d496213aa9.tar.gz chromium_src-6e5f5510621232a24338c6036ed083d496213aa9.tar.bz2 |
Detach RemoteFrame from the tree when deleting RenderFrameProxy.
BUG=414675
Review URL: https://codereview.chromium.org/660093003
Cr-Commit-Position: refs/heads/master@{#300057}
-rw-r--r-- | content/browser/frame_host/render_frame_proxy_host.cc | 10 | ||||
-rw-r--r-- | content/renderer/render_frame_impl.cc | 3 | ||||
-rw-r--r-- | content/renderer/render_frame_proxy.cc | 21 | ||||
-rw-r--r-- | content/renderer/render_frame_proxy.h | 1 |
4 files changed, 22 insertions, 13 deletions
diff --git a/content/browser/frame_host/render_frame_proxy_host.cc b/content/browser/frame_host/render_frame_proxy_host.cc index af86c2f..3db9edf 100644 --- a/content/browser/frame_host/render_frame_proxy_host.cc +++ b/content/browser/frame_host/render_frame_proxy_host.cc @@ -68,8 +68,14 @@ RenderFrameProxyHost::RenderFrameProxyHost(SiteInstance* site_instance, } RenderFrameProxyHost::~RenderFrameProxyHost() { - if (GetProcess()->HasConnection()) - Send(new FrameMsg_DeleteProxy(routing_id_)); + if (GetProcess()->HasConnection()) { + // TODO(nasko): For now, don't send this IPC for top-level frames, as + // the top-level RenderFrame will delete the RenderFrameProxy. + // This can be removed once we don't have a swapped out state on + // RenderFrame. See https://crbug.com/357747 + if (!frame_tree_node_->IsMainFrame()) + Send(new FrameMsg_DeleteProxy(routing_id_)); + } GetProcess()->RemoveRoute(routing_id_); g_routing_id_frame_proxy_map.Get().erase( diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 0773d41..1ebf72a 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -598,6 +598,9 @@ RenderFrameImpl::~RenderFrameImpl() { render_view_->UnregisterVideoHoleFrame(this); #endif + if (render_frame_proxy_) + delete render_frame_proxy_; + render_view_->UnregisterRenderFrame(this); g_routing_id_frame_map.Get().erase(routing_id_); RenderThread::Get()->RemoveRoute(routing_id_); diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc index 77f7eaa..6b8c760 100644 --- a/content/renderer/render_frame_proxy.cc +++ b/content/renderer/render_frame_proxy.cc @@ -118,10 +118,6 @@ RenderFrameProxy::~RenderFrameProxy() { RenderThread::Get()->RemoveRoute(routing_id_); g_routing_id_proxy_map.Get().erase(routing_id_); - - // TODO(nick): Call close unconditionally when web_frame() is always remote. - if (web_frame()->isWebRemoteFrame()) - web_frame()->close(); } void RenderFrameProxy::Init(blink::WebRemoteFrame* web_frame, @@ -175,13 +171,8 @@ bool RenderFrameProxy::Send(IPC::Message* message) { } void RenderFrameProxy::OnDeleteProxy() { - RenderFrameImpl* render_frame = - RenderFrameImpl::FromRoutingID(frame_routing_id_); - - if (render_frame) - render_frame->set_render_frame_proxy(NULL); - - delete this; + DCHECK(web_frame_->isWebRemoteFrame()); + web_frame_->detach(); } void RenderFrameProxy::OnChildFrameProcessGone() { @@ -230,6 +221,14 @@ void RenderFrameProxy::OnDisownOpener() { web_frame_->setOpener(NULL); } +void RenderFrameProxy::frameDetached() { + if (web_frame_->parent()) + web_frame_->parent()->removeChild(web_frame_); + + web_frame_->close(); + delete this; +} + void RenderFrameProxy::postMessageEvent( blink::WebLocalFrame* source_frame, blink::WebRemoteFrame* target_frame, diff --git a/content/renderer/render_frame_proxy.h b/content/renderer/render_frame_proxy.h index 0eb01c4..409d74e 100644 --- a/content/renderer/render_frame_proxy.h +++ b/content/renderer/render_frame_proxy.h @@ -98,6 +98,7 @@ class CONTENT_EXPORT RenderFrameProxy blink::WebRemoteFrame* web_frame() { return web_frame_; } // blink::WebRemoteFrameClient implementation: + virtual void frameDetached(); virtual void postMessageEvent( blink::WebLocalFrame* sourceFrame, blink::WebRemoteFrame* targetFrame, |