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

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

Issue 1021313002: Clear RenderFrameImpl::frame_ pointer after deleting it. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2272
Patch Set: Created 5 years, 9 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 | « content/renderer/render_frame_impl.h ('k') | 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 887 matching lines...) Expand 10 before | Expand all | Expand 10 after
898 898
899 #if defined(OS_MACOSX) || defined(OS_ANDROID) 899 #if defined(OS_MACOSX) || defined(OS_ANDROID)
900 void RenderFrameImpl::DidHideExternalPopupMenu() { 900 void RenderFrameImpl::DidHideExternalPopupMenu() {
901 // We need to clear external_popup_menu_ as soon as ExternalPopupMenu::close 901 // We need to clear external_popup_menu_ as soon as ExternalPopupMenu::close
902 // is called. Otherwise, createExternalPopupMenu() for new popup will fail. 902 // is called. Otherwise, createExternalPopupMenu() for new popup will fail.
903 external_popup_menu_.reset(); 903 external_popup_menu_.reset();
904 } 904 }
905 #endif 905 #endif
906 906
907 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { 907 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) {
908 // We may get here while detaching, when the WebFrame has been deleted. Do
909 // not process any messages in this state.
910 if (!frame_)
911 return false;
912
908 // TODO(kenrb): document() should not be null, but as a transitional step 913 // TODO(kenrb): document() should not be null, but as a transitional step
909 // we have RenderFrameProxy 'wrapping' a RenderFrameImpl, passing messages 914 // we have RenderFrameProxy 'wrapping' a RenderFrameImpl, passing messages
910 // to this method. This happens for a top-level remote frame, where a 915 // to this method. This happens for a top-level remote frame, where a
911 // document-less RenderFrame is replaced by a RenderFrameProxy but kept 916 // document-less RenderFrame is replaced by a RenderFrameProxy but kept
912 // around and is still able to receive messages. 917 // around and is still able to receive messages.
913 if (!frame_->document().isNull()) 918 if (!frame_->document().isNull())
914 GetContentClient()->SetActiveURL(frame_->document().url()); 919 GetContentClient()->SetActiveURL(frame_->document().url());
915 920
916 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); 921 ObserverListBase<RenderFrameObserver>::Iterator it(observers_);
917 RenderFrameObserver* observer; 922 RenderFrameObserver* observer;
(...skipping 1123 matching lines...) Expand 10 before | Expand all | Expand 10 after
2041 // containing RenderViewHost (so that they have the same lifetime), so only 2046 // containing RenderViewHost (so that they have the same lifetime), so only
2042 // removal from the map is needed and no deletion. 2047 // removal from the map is needed and no deletion.
2043 FrameMap::iterator it = g_frame_map.Get().find(frame); 2048 FrameMap::iterator it = g_frame_map.Get().find(frame);
2044 CHECK(it != g_frame_map.Get().end()); 2049 CHECK(it != g_frame_map.Get().end());
2045 CHECK_EQ(it->second, this); 2050 CHECK_EQ(it->second, this);
2046 g_frame_map.Get().erase(it); 2051 g_frame_map.Get().erase(it);
2047 2052
2048 if (is_subframe) 2053 if (is_subframe)
2049 frame->parent()->removeChild(frame); 2054 frame->parent()->removeChild(frame);
2050 2055
2051 // |frame| is invalid after here. 2056 // |frame| is invalid after here. Be sure to clear frame_ as well, since this
2057 // object may not be deleted immediately and other methods may try to access
2058 // it.
2052 frame->close(); 2059 frame->close();
2060 frame_ = nullptr;
2053 2061
2054 if (is_subframe) { 2062 if (is_subframe) {
2055 delete this; 2063 delete this;
2056 // Object is invalid after this point. 2064 // Object is invalid after this point.
2057 } 2065 }
2058 } 2066 }
2059 2067
2060 void RenderFrameImpl::frameFocused() { 2068 void RenderFrameImpl::frameFocused() {
2061 Send(new FrameHostMsg_FrameFocused(routing_id_)); 2069 Send(new FrameHostMsg_FrameFocused(routing_id_));
2062 } 2070 }
(...skipping 2295 matching lines...) Expand 10 before | Expand all | Expand 10 after
4358 4366
4359 #if defined(ENABLE_BROWSER_CDMS) 4367 #if defined(ENABLE_BROWSER_CDMS)
4360 RendererCdmManager* RenderFrameImpl::GetCdmManager() { 4368 RendererCdmManager* RenderFrameImpl::GetCdmManager() {
4361 if (!cdm_manager_) 4369 if (!cdm_manager_)
4362 cdm_manager_ = new RendererCdmManager(this); 4370 cdm_manager_ = new RendererCdmManager(this);
4363 return cdm_manager_; 4371 return cdm_manager_;
4364 } 4372 }
4365 #endif // defined(ENABLE_BROWSER_CDMS) 4373 #endif // defined(ENABLE_BROWSER_CDMS)
4366 4374
4367 } // namespace content 4375 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_view_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698