Commit 6e5f5510 authored by nasko's avatar nasko Committed by Commit bot

Detach RemoteFrame from the tree when deleting RenderFrameProxy.

BUG=414675

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

Cr-Commit-Position: refs/heads/master@{#300057}
parent 5ccddf94
......@@ -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(
......
......@@ -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_);
......
......@@ -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,
......
......@@ -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,
......
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