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..d25858add466215e725c826f28db63614abd4f0f 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. |
ncarter (slow)
2015/05/11 18:27:13
"otherwise it will result in use-after-free bugs"
nasko
2015/05/11 22:01:11
Done.
|
+ 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,13 @@ 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_) { |
+ CHECK(!render_view_->main_render_frame_); |
ncarter (slow)
2015/05/11 18:27:13
How does this happen?
Seems like RenderViewImpl::
nasko
2015/05/11 22:01:11
Create RenderView and the main RenderFrame. Naviga
ncarter (slow)
2015/05/11 22:44:49
No, it's fine and this makes sense. I had forgotte
|
+ render_view_->main_render_frame_ = this; |
+ } |
} |
// When we perform a new navigation, we need to update the last committed |