Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index b44691dc57a9f4df6a18592fbf89559507476de8..ad6e528c87bbb44f57f03ec2d774b92efc48073b 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -730,12 +730,18 @@ RenderFrameImpl::~RenderFrameImpl() { |
render_view_->UnregisterVideoHoleFrame(this); |
#endif |
- // RenderFrameProxy is only "owned" by RenderFrameImpl in the case it is the |
- // main frame. Ensure it is deleted along with this object. |
- if (!is_subframe_ && render_frame_proxy_) { |
- // The following method calls back into this object and clears |
- // |render_frame_proxy_|. |
- render_frame_proxy_->frameDetached(); |
+ if (!is_subframe_) { |
+ // RenderFrameProxy is "owned" by RenderFrameImpl in the case it is |
+ // the main frame. Ensure it is deleted along with this object. |
+ if (render_frame_proxy_) { |
+ // The following method calls back into this object and clears |
+ // |render_frame_proxy_|. |
+ render_frame_proxy_->frameDetached(); |
+ } |
+ |
+ // Since this is the main frame, the RenderViewImpl pointer to this object |
+ // must be cleared, otherwise it will result in use-after-free bugs. |
+ render_view_->main_render_frame_ = nullptr; |
} |
render_view_->UnregisterRenderFrame(this); |
@@ -2231,10 +2237,8 @@ void RenderFrameImpl::frameDetached(blink::WebFrame* frame) { |
frame->close(); |
frame_ = nullptr; |
- if (is_subframe_) { |
- delete this; |
- // Object is invalid after this point. |
- } |
+ delete this; |
+ // Object is invalid after this point. |
} |
void RenderFrameImpl::frameFocused() { |
@@ -2643,6 +2647,11 @@ void RenderFrameImpl::didCommitProvisionalLoad( |
CHECK(proxy); |
proxy->web_frame()->swap(frame_); |
proxy_routing_id_ = MSG_ROUTING_NONE; |
+ |
+ // If this is the main frame going from a remote frame to a local frame, |
+ // it needs to set RenderViewImpl's pointer for the main frame to itself. |
+ if (!is_subframe_) |
+ render_view_->main_render_frame_ = this; |
lfg
2015/05/08 19:42:27
Consider adding a CHECK or DCHECK that there's no
nasko
2015/05/11 16:12:33
Done.
|
} |
// When we perform a new navigation, we need to update the last committed |