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

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 1130233002: Convert main_render_frame_ to raw pointer in RenderViewImpl. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address lfg@'s review comments. Created 5 years, 7 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 unified diff | Download patch
« no previous file with comments | « no previous file | content/renderer/render_view_browsertest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/render_frame_impl.h" 5 #include "content/renderer/render_frame_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after
723 723
724 RenderFrameImpl::~RenderFrameImpl() { 724 RenderFrameImpl::~RenderFrameImpl() {
725 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone()); 725 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone());
726 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct()); 726 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct());
727 727
728 #if defined(VIDEO_HOLE) 728 #if defined(VIDEO_HOLE)
729 if (contains_media_player_) 729 if (contains_media_player_)
730 render_view_->UnregisterVideoHoleFrame(this); 730 render_view_->UnregisterVideoHoleFrame(this);
731 #endif 731 #endif
732 732
733 // RenderFrameProxy is only "owned" by RenderFrameImpl in the case it is the 733 if (!is_subframe_) {
734 // main frame. Ensure it is deleted along with this object. 734 // RenderFrameProxy is "owned" by RenderFrameImpl in the case it is
735 if (!is_subframe_ && render_frame_proxy_) { 735 // the main frame. Ensure it is deleted along with this object.
736 // The following method calls back into this object and clears 736 if (render_frame_proxy_) {
737 // |render_frame_proxy_|. 737 // The following method calls back into this object and clears
738 render_frame_proxy_->frameDetached(); 738 // |render_frame_proxy_|.
739 render_frame_proxy_->frameDetached();
740 }
741
742 // Since this is the main frame, the RenderViewImpl pointer to this object
743 // 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.
744 render_view_->main_render_frame_ = nullptr;
739 } 745 }
740 746
741 render_view_->UnregisterRenderFrame(this); 747 render_view_->UnregisterRenderFrame(this);
742 g_routing_id_frame_map.Get().erase(routing_id_); 748 g_routing_id_frame_map.Get().erase(routing_id_);
743 RenderThread::Get()->RemoveRoute(routing_id_); 749 RenderThread::Get()->RemoveRoute(routing_id_);
744 } 750 }
745 751
746 void RenderFrameImpl::SetWebFrame(blink::WebLocalFrame* web_frame) { 752 void RenderFrameImpl::SetWebFrame(blink::WebLocalFrame* web_frame) {
747 DCHECK(!frame_); 753 DCHECK(!frame_);
748 754
(...skipping 1475 matching lines...) Expand 10 before | Expand all | Expand 10 after
2224 } 2230 }
2225 frame->parent()->removeChild(frame); 2231 frame->parent()->removeChild(frame);
2226 } 2232 }
2227 2233
2228 // |frame| is invalid after here. Be sure to clear frame_ as well, since this 2234 // |frame| is invalid after here. Be sure to clear frame_ as well, since this
2229 // object may not be deleted immediately and other methods may try to access 2235 // object may not be deleted immediately and other methods may try to access
2230 // it. 2236 // it.
2231 frame->close(); 2237 frame->close();
2232 frame_ = nullptr; 2238 frame_ = nullptr;
2233 2239
2234 if (is_subframe_) { 2240 delete this;
2235 delete this; 2241 // Object is invalid after this point.
2236 // Object is invalid after this point.
2237 }
2238 } 2242 }
2239 2243
2240 void RenderFrameImpl::frameFocused() { 2244 void RenderFrameImpl::frameFocused() {
2241 Send(new FrameHostMsg_FrameFocused(routing_id_)); 2245 Send(new FrameHostMsg_FrameFocused(routing_id_));
2242 } 2246 }
2243 2247
2244 void RenderFrameImpl::willClose(blink::WebFrame* frame) { 2248 void RenderFrameImpl::willClose(blink::WebFrame* frame) {
2245 DCHECK(!frame_ || frame_ == frame); 2249 DCHECK(!frame_ || frame_ == frame);
2246 2250
2247 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, FrameWillClose()); 2251 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, FrameWillClose());
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
2636 DocumentState::FromDataSource(frame->dataSource()); 2640 DocumentState::FromDataSource(frame->dataSource());
2637 NavigationStateImpl* navigation_state = 2641 NavigationStateImpl* navigation_state =
2638 static_cast<NavigationStateImpl*>(document_state->navigation_state()); 2642 static_cast<NavigationStateImpl*>(document_state->navigation_state());
2639 2643
2640 if (proxy_routing_id_ != MSG_ROUTING_NONE) { 2644 if (proxy_routing_id_ != MSG_ROUTING_NONE) {
2641 RenderFrameProxy* proxy = 2645 RenderFrameProxy* proxy =
2642 RenderFrameProxy::FromRoutingID(proxy_routing_id_); 2646 RenderFrameProxy::FromRoutingID(proxy_routing_id_);
2643 CHECK(proxy); 2647 CHECK(proxy);
2644 proxy->web_frame()->swap(frame_); 2648 proxy->web_frame()->swap(frame_);
2645 proxy_routing_id_ = MSG_ROUTING_NONE; 2649 proxy_routing_id_ = MSG_ROUTING_NONE;
2650
2651 // If this is the main frame going from a remote frame to a local frame,
2652 // it needs to set RenderViewImpl's pointer for the main frame to itself.
2653 if (!is_subframe_) {
2654 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
2655 render_view_->main_render_frame_ = this;
2656 }
2646 } 2657 }
2647 2658
2648 // When we perform a new navigation, we need to update the last committed 2659 // When we perform a new navigation, we need to update the last committed
2649 // session history entry with state for the page we are leaving. Do this 2660 // session history entry with state for the page we are leaving. Do this
2650 // before updating the HistoryController state. 2661 // before updating the HistoryController state.
2651 render_view_->UpdateSessionHistory(frame); 2662 render_view_->UpdateSessionHistory(frame);
2652 2663
2653 render_view_->history_controller()->UpdateForCommit( 2664 render_view_->history_controller()->UpdateForCommit(
2654 this, item, commit_type, navigation_state->WasWithinSamePage()); 2665 this, item, commit_type, navigation_state->WasWithinSamePage());
2655 2666
(...skipping 2278 matching lines...) Expand 10 before | Expand all | Expand 10 after
4934 #elif defined(ENABLE_BROWSER_CDMS) 4945 #elif defined(ENABLE_BROWSER_CDMS)
4935 cdm_manager_, 4946 cdm_manager_,
4936 #endif 4947 #endif
4937 this); 4948 this);
4938 } 4949 }
4939 4950
4940 return cdm_factory_; 4951 return cdm_factory_;
4941 } 4952 }
4942 4953
4943 } // namespace content 4954 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/renderer/render_view_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698