Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Unified Diff: content/renderer/render_frame_proxy.cc

Issue 660093003: Detach RemoteFrame from the tree when deleting RenderFrameProxy. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Don't delete top-level proxy through IPC message. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/render_frame_proxy.cc
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc
index 77f7eaac53e347adb6d8da6ee59017b2802741f7..5a433c8f95413c867626e20c0df252ecbfd49fcf 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,
@@ -178,10 +174,13 @@ void RenderFrameProxy::OnDeleteProxy() {
RenderFrameImpl* render_frame =
RenderFrameImpl::FromRoutingID(frame_routing_id_);
- if (render_frame)
+ // If this is a proxy for the top-level frame, the RenderFrame will clean it
+ // up, so only unregister for subframes.
+ if (render_frame && web_frame_->parent())
Charlie Reis 2014/10/16 23:17:56 Seems like render_frame wouldn't exist if this wer
nasko 2014/10/16 23:21:09 Done.
render_frame->set_render_frame_proxy(NULL);
- delete this;
+ DCHECK(web_frame_->isWebRemoteFrame());
+ web_frame_->detach();
}
void RenderFrameProxy::OnChildFrameProcessGone() {
@@ -230,6 +229,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,
« content/renderer/render_frame_impl.cc ('K') | « content/renderer/render_frame_proxy.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698