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 27943c8621494e0de62a4ab6922efe1d39fc7462..e5331e09d5f5442774e07a483f4cad7d2ec5f83d 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -134,6 +134,9 @@ RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host, |
routing_id_(routing_id), |
render_frame_created_(false), |
navigations_suspended_(false), |
+ has_beforeunload_handlers_(false), |
+ has_unload_handlers_(false), |
+ override_sudden_termination_status_(false), |
is_waiting_for_beforeunload_ack_(false), |
unload_ack_is_for_cross_site_transition_(false), |
accessibility_reset_token_(0), |
@@ -324,6 +327,10 @@ bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { |
IPC_MESSAGE_HANDLER(FrameHostMsg_DocumentOnLoadCompleted, |
OnDocumentOnLoadCompleted) |
IPC_MESSAGE_HANDLER(FrameHostMsg_BeforeUnload_ACK, OnBeforeUnloadACK) |
+ IPC_MESSAGE_HANDLER(FrameHostMsg_BeforeUnloadHandlersPresent, |
+ OnBeforeUnloadHandlersPresent) |
+ IPC_MESSAGE_HANDLER(FrameHostMsg_UnloadHandlersPresent, |
+ OnUnloadHandlersPresent) |
IPC_MESSAGE_HANDLER(FrameHostMsg_SwapOut_ACK, OnSwapOutACK) |
IPC_MESSAGE_HANDLER(FrameHostMsg_ContextMenu, OnContextMenu) |
IPC_MESSAGE_HANDLER(FrameHostMsg_JavaScriptExecuteResponse, |
@@ -974,6 +981,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(); |
} |
@@ -1238,6 +1250,14 @@ void RenderFrameHostImpl::OnToggleFullscreen(bool enter_fullscreen) { |
render_view_host_->WasResized(); |
} |
+void RenderFrameHostImpl::OnBeforeUnloadHandlersPresent(bool present) { |
+ has_beforeunload_handlers_ = present; |
+} |
+ |
+void RenderFrameHostImpl::OnUnloadHandlersPresent(bool present) { |
+ has_unload_handlers_ = present; |
+} |
+ |
#if defined(OS_MACOSX) || defined(OS_ANDROID) |
void RenderFrameHostImpl::OnShowPopup( |
const FrameHostMsg_ShowPopup_Params& params) { |