| 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 b04daf76b905695673f7ab8c63a08d4539363069..2e6fdb9cbef0b6edfd31c7587de10bf9d0646510 100644
|
| --- a/content/browser/frame_host/render_frame_host_impl.cc
|
| +++ b/content/browser/frame_host/render_frame_host_impl.cc
|
| @@ -1566,7 +1566,8 @@ void RenderFrameHostImpl::OnBeforeUnloadACK(
|
| }
|
| // Resets beforeunload waiting state.
|
| is_waiting_for_beforeunload_ack_ = false;
|
| - beforeunload_timeout_->Stop();
|
| + if (beforeunload_timeout_)
|
| + beforeunload_timeout_->Stop();
|
| send_before_unload_start_time_ = base::TimeTicks();
|
|
|
| // PlzNavigate: if the ACK is for a navigation, send it to the Navigator to
|
| @@ -1790,8 +1791,10 @@ void RenderFrameHostImpl::OnRunBeforeUnloadConfirm(
|
| // The beforeunload dialog for this frame may have been triggered by a
|
| // browser-side request to this frame or a frame up in the frame hierarchy.
|
| // Stop any timers that are waiting.
|
| - for (RenderFrameHostImpl* frame = this; frame; frame = frame->GetParent())
|
| - frame->beforeunload_timeout_->Stop();
|
| + for (RenderFrameHostImpl* frame = this; frame; frame = frame->GetParent()) {
|
| + if (frame->beforeunload_timeout_)
|
| + frame->beforeunload_timeout_->Stop();
|
| + }
|
|
|
| delegate_->RunBeforeUnloadConfirm(this, is_reload, reply_msg);
|
| }
|
| @@ -1896,6 +1899,10 @@ void RenderFrameHostImpl::CancelBlockedRequestsForFrame() {
|
| base::Bind(&ResourceDispatcherHostImpl::CancelBlockedRequestsForRoute));
|
| }
|
|
|
| +void RenderFrameHostImpl::DisableBeforeUnloadHangMonitorForTesting() {
|
| + beforeunload_timeout_.reset();
|
| +}
|
| +
|
| void RenderFrameHostImpl::OnDidAccessInitialDocument() {
|
| delegate_->DidAccessInitialDocument();
|
| }
|
| @@ -2537,7 +2544,8 @@ void RenderFrameHostImpl::ResetWaitingState() {
|
| // navigations to be ignored in OnDidCommitProvisionalLoad.
|
| if (is_waiting_for_beforeunload_ack_) {
|
| is_waiting_for_beforeunload_ack_ = false;
|
| - beforeunload_timeout_->Stop();
|
| + if (beforeunload_timeout_)
|
| + beforeunload_timeout_->Stop();
|
| }
|
| send_before_unload_start_time_ = base::TimeTicks();
|
| render_view_host_->is_waiting_for_close_ack_ = false;
|
| @@ -2684,8 +2692,10 @@ void RenderFrameHostImpl::DispatchBeforeUnload(bool for_navigation,
|
| // reply from the dialog.
|
| SimulateBeforeUnloadAck();
|
| } else {
|
| - beforeunload_timeout_->Start(
|
| - TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS));
|
| + if (beforeunload_timeout_) {
|
| + beforeunload_timeout_->Start(
|
| + TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS));
|
| + }
|
| send_before_unload_start_time_ = base::TimeTicks::Now();
|
| Send(new FrameMsg_BeforeUnload(routing_id_, is_reload));
|
| }
|
| @@ -2766,7 +2776,7 @@ void RenderFrameHostImpl::JavaScriptDialogClosed(
|
| // script and dragging out the process.
|
| if (dialog_was_suppressed) {
|
| frame->SimulateBeforeUnloadAck();
|
| - } else {
|
| + } else if (frame->beforeunload_timeout_) {
|
| frame->beforeunload_timeout_->Start(
|
| TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS));
|
| }
|
|
|