Index: content/browser/frame_host/render_frame_host_impl.cc |
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc |
index f284e5765ae46ad8fe3d6ec78e6a8c38ec56c3af..06dadb87b81d61891669e876c0d2da520fefc625 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -137,6 +137,9 @@ RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host, |
accessibility_reset_token_(0), |
accessibility_reset_count_(0), |
no_create_browser_accessibility_manager_for_testing_(false), |
+ has_beforeunload_handlers_(false), |
+ has_unload_handlers_(false), |
+ override_sudden_termination_status_(false), |
weak_ptr_factory_(this) { |
bool is_swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); |
frame_tree_->RegisterRenderFrameHost(this); |
@@ -158,6 +161,8 @@ RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host, |
} |
RenderFrameHostImpl::~RenderFrameHostImpl() { |
+ if (!SuddenTerminationAllowed()) |
+ GetProcess()->SuddenTerminationChangedForFrame(true); |
Charlie Reis
2015/01/23 06:01:32
I don't think RPH should be tracking this state.
clamy
2015/01/26 16:38:39
Done.
|
GetProcess()->RemoveRoute(routing_id_); |
g_routing_id_frame_map.Get().erase( |
RenderFrameHostID(GetProcess()->GetID(), routing_id_)); |
@@ -336,6 +341,10 @@ bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { |
IPC_MESSAGE_HANDLER(AccessibilityHostMsg_FindInPageResult, |
OnAccessibilityFindInPageResult) |
IPC_MESSAGE_HANDLER(FrameHostMsg_ToggleFullscreen, OnToggleFullscreen) |
+ IPC_MESSAGE_HANDLER(FrameHostMsg_BeforeUnloadHandlersPresenceChanged, |
Charlie Reis
2015/01/23 06:01:32
nit: Put these just before OnBeforeUnloadACK, sinc
clamy
2015/01/26 16:38:39
Done.
|
+ OnBeforeUnloadHandlersPresenceChanged) |
+ IPC_MESSAGE_HANDLER(FrameHostMsg_UnloadHandlersPresenceChanged, |
+ OnUnloadHandlersPresenceChanged) |
#if defined(OS_MACOSX) || defined(OS_ANDROID) |
IPC_MESSAGE_HANDLER(FrameHostMsg_ShowPopup, OnShowPopup) |
IPC_MESSAGE_HANDLER(FrameHostMsg_HidePopup, OnHidePopup) |
@@ -888,6 +897,11 @@ bool RenderFrameHostImpl::IsWaitingForUnloadACK() const { |
rfh_state_ == STATE_PENDING_SWAP_OUT; |
} |
+bool RenderFrameHostImpl::SuddenTerminationAllowed() const { |
+ return override_sudden_termination_status_ || |
+ (!has_beforeunload_handlers_ && !has_unload_handlers_); |
+} |
+ |
void RenderFrameHostImpl::OnSwapOutACK() { |
OnSwappedOut(); |
} |
@@ -1152,6 +1166,16 @@ void RenderFrameHostImpl::OnToggleFullscreen(bool enter_fullscreen) { |
render_view_host_->WasResized(); |
} |
+void RenderFrameHostImpl::OnBeforeUnloadHandlersPresenceChanged(bool present) { |
+ HandleSuddenTerminationDisablerPresenceChange( |
+ &has_beforeunload_handlers_, present); |
+} |
+ |
+void RenderFrameHostImpl::OnUnloadHandlersPresenceChanged(bool present) { |
+ HandleSuddenTerminationDisablerPresenceChange( |
+ &has_unload_handlers_, present); |
+} |
+ |
#if defined(OS_MACOSX) || defined(OS_ANDROID) |
void RenderFrameHostImpl::OnShowPopup( |
const FrameHostMsg_ShowPopup_Params& params) { |
@@ -1648,4 +1672,15 @@ void RenderFrameHostImpl::DidUseGeolocationPermission() { |
top_frame->GetLastCommittedURL().GetOrigin()); |
} |
+void RenderFrameHostImpl::HandleSuddenTerminationDisablerPresenceChange( |
Charlie Reis
2015/01/23 06:01:32
Hmm, this method seems awkward to me.
- The metho
clamy
2015/01/26 16:38:39
Done. If we don't signal the RPHI then only the bo
|
+ bool* disabler_presence, |
+ bool new_value) { |
+ bool sudden_termination_before = SuddenTerminationAllowed(); |
+ *disabler_presence = new_value; |
+ if (sudden_termination_before != SuddenTerminationAllowed()) { |
+ GetProcess()->SuddenTerminationChangedForFrame( |
+ SuddenTerminationAllowed()); |
+ } |
+} |
+ |
} // namespace content |