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

Unified Diff: content/renderer/render_frame_proxy.cc

Issue 2628133002: When a proxy is detached, immediately delete its associated provisional frame. (Closed)
Patch Set: Remove (hopefully unnecessary) null check Created 3 years, 11 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 c318049c1f89c7c6f40b79cc9dbc23d5a120cc0e..62f1d2ae806afa96c7708d8b18d2ca1c69a7f34a 100644
--- a/content/renderer/render_frame_proxy.cc
+++ b/content/renderer/render_frame_proxy.cc
@@ -73,8 +73,7 @@ RenderFrameProxy* RenderFrameProxy::CreateProxyToReplaceFrame(
blink::WebTreeScopeType scope) {
CHECK_NE(routing_id, MSG_ROUTING_NONE);
- std::unique_ptr<RenderFrameProxy> proxy(
- new RenderFrameProxy(routing_id, frame_to_replace->GetRoutingID()));
+ std::unique_ptr<RenderFrameProxy> proxy(new RenderFrameProxy(routing_id));
// When a RenderFrame is replaced by a RenderProxy, the WebRemoteFrame should
// always come from WebRemoteFrame::create and a call to WebFrame::swap must
@@ -112,8 +111,7 @@ RenderFrameProxy* RenderFrameProxy::CreateFrameProxy(
return nullptr;
}
- std::unique_ptr<RenderFrameProxy> proxy(
- new RenderFrameProxy(routing_id, MSG_ROUTING_NONE));
+ std::unique_ptr<RenderFrameProxy> proxy(new RenderFrameProxy(routing_id));
RenderViewImpl* render_view = nullptr;
RenderWidget* render_widget = nullptr;
blink::WebRemoteFrame* web_frame = nullptr;
@@ -179,9 +177,9 @@ RenderFrameProxy* RenderFrameProxy::FromWebFrame(blink::WebFrame* web_frame) {
return NULL;
}
-RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id)
+RenderFrameProxy::RenderFrameProxy(int routing_id)
: routing_id_(routing_id),
- frame_routing_id_(frame_routing_id),
+ provisional_frame_routing_id_(MSG_ROUTING_NONE),
web_frame_(nullptr),
render_view_(nullptr),
render_widget_(nullptr) {
@@ -419,6 +417,20 @@ void RenderFrameProxy::frameDetached(DetachType type) {
web_frame_->close();
+ // If this proxy was associated with a provisional RenderFrame, and we're not
+ // in the process of swapping with it, clean it up as well.
+ if (type == DetachType::Remove &&
+ provisional_frame_routing_id_ != MSG_ROUTING_NONE) {
+ RenderFrameImpl* provisional_frame =
+ RenderFrameImpl::FromRoutingID(provisional_frame_routing_id_);
+ // |provisional_frame| should always exist. If it was deleted via
+ // FrameMsg_Delete right before this proxy was removed,
+ // RenderFrameImpl::frameDetached would've cleared this proxy's
+ // |provisional_frame_routing_id_| and we wouldn't get here.
+ CHECK(provisional_frame);
+ provisional_frame->GetWebFrame()->detach();
+ }
+
// Remove the entry in the WebFrame->RenderFrameProxy map, as the |web_frame_|
// is no longer valid.
FrameMap::iterator it = g_frame_map.Get().find(web_frame_);

Powered by Google App Engine
This is Rietveld 408576698