 Chromium Code Reviews
 Chromium Code Reviews Issue 857213003:
  Refactor sudden termination  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 857213003:
  Refactor sudden termination  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| 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 |