| 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..9d13f5d5f2942a6fccbb9a8f3b58c0f330f6fe70 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();
|
| + }
|
| +
|
| + // Ensure the RenderView doesn't point to this object, once it is destroyed.
|
| + CHECK_EQ(render_view_->main_render_frame_, this);
|
| + 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_);
|
| + render_view_->main_render_frame_ = this;
|
| + }
|
| }
|
|
|
| // When we perform a new navigation, we need to update the last committed
|
|
|