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

Unified Diff: content/browser/frame_host/render_frame_host_manager.cc

Issue 1835833002: Fix 3 crashes related to navigations after a process dies. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes from review Created 4 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/frame_host/render_frame_host_manager.cc
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc
index 9d071d5a75c280e8adb29c3ea3ee96a0d4343445..bf29aa4aa6394beaab9008b6c32cd0314a910f59 100644
--- a/content/browser/frame_host/render_frame_host_manager.cc
+++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -704,14 +704,6 @@ void RenderFrameHostManager::DiscardUnusedFrame(
void RenderFrameHostManager::MoveToPendingDeleteHosts(
scoped_ptr<RenderFrameHostImpl> render_frame_host) {
- // If this is the main frame going away and there are no more references to
- // its RenderViewHost, mark it for deletion as well so that we don't try to
- // reuse it.
- if (render_frame_host->frame_tree_node()->IsMainFrame() &&
- render_frame_host->render_view_host()->ref_count() <= 1) {
- render_frame_host->render_view_host()->set_pending_deletion();
- }
-
// |render_frame_host| will be deleted when its SwapOut ACK is received, or
// when the timer times out, or when the RFHM itself is deleted (whichever
// comes first).
@@ -727,6 +719,25 @@ bool RenderFrameHostManager::IsPendingDeletion(
return false;
}
+bool RenderFrameHostManager::IsViewPendingDeletion(
+ RenderViewHostImpl* render_view_host) {
+ // Only safe to call this on the main frame.
+ CHECK(frame_tree_node_->IsMainFrame());
+
+ // The view is not pending deletion if more than one frame or proxy references
+ // it.
+ if (render_view_host->ref_count() > 1)
+ return false;
+
+ // If the only thing referencing it is a frame on the pending deletion list,
+ // then this view will go away when the frame goes away.
+ for (const auto& rfh : pending_delete_hosts_) {
+ if (rfh->GetRenderViewHost() == render_view_host)
+ return true;
+ }
+ return false;
+}
+
bool RenderFrameHostManager::DeleteFromPendingList(
RenderFrameHostImpl* render_frame_host) {
for (RFHPendingDeleteList::iterator iter = pending_delete_hosts_.begin();

Powered by Google App Engine
This is Rietveld 408576698