Chromium Code Reviews| 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 acb7916dafaa6adc64f982046ca89ddb0ebc838d..61cd6ca6a8bb3ef3fe4f1ea6e608e7130e4bad9c 100644 |
| --- a/content/browser/frame_host/render_frame_host_impl.cc |
| +++ b/content/browser/frame_host/render_frame_host_impl.cc |
| @@ -378,6 +378,8 @@ RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, |
| is_waiting_for_swapout_ack_(false), |
| render_frame_created_(false), |
| navigations_suspended_(false), |
| + has_beforeunload_handlers_(false), |
| + has_unload_handlers_(false), |
| is_waiting_for_beforeunload_ack_(false), |
| unload_ack_is_for_navigation_(false), |
| is_loading_(false), |
| @@ -751,6 +753,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, |
| @@ -2373,6 +2379,14 @@ void RenderFrameHostImpl::OnSetHasReceivedUserGesture() { |
| frame_tree_node_->OnSetHasReceivedUserGesture(); |
| } |
| +void RenderFrameHostImpl::OnBeforeUnloadHandlersPresent(bool present) { |
| + has_beforeunload_handlers_ = present; |
| +} |
| + |
| +void RenderFrameHostImpl::OnUnloadHandlersPresent(bool present) { |
| + has_unload_handlers_ = present; |
| +} |
| + |
| #if BUILDFLAG(USE_EXTERNAL_POPUP_MENU) |
| void RenderFrameHostImpl::OnShowPopup( |
| const FrameHostMsg_ShowPopup_Params& params) { |
| @@ -2701,7 +2715,25 @@ void RenderFrameHostImpl::SimulateBeforeUnloadAck() { |
| } |
| bool RenderFrameHostImpl::ShouldDispatchBeforeUnload() { |
| - return IsRenderFrameLive(); |
| + if (!IsRenderFrameLive()) |
| + return false; |
| + |
| + for (FrameTreeNode* node : frame_tree_->SubtreeNodes(frame_tree_node_)) { |
| + if (node->current_frame_host()->has_beforeunload_handlers_) |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| +bool RenderFrameHostImpl::ShouldDispatchUnload() { |
|
nasko
2017/03/29 21:45:17
This actually doesn't make sense to have. On cross
|
| + if (!IsRenderFrameLive()) |
| + return false; |
| + |
| + for (FrameTreeNode* node : frame_tree_->SubtreeNodes(frame_tree_node_)) { |
| + if (node->current_frame_host()->has_unload_handlers_) |
| + return true; |
| + } |
| + return false; |
| } |
| void RenderFrameHostImpl::UpdateOpener() { |