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 e47c2a8e0977ab19b4201cd42215d7b6aa50bf0f..1792360b140c945f7a86738639e8c8cce042f0aa 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -143,6 +143,9 @@ RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, |
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_navigation_(false), |
accessibility_reset_token_(0), |
@@ -347,6 +350,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, |
@@ -1015,6 +1022,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(); |
} |
@@ -1290,6 +1302,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) { |