Chromium Code Reviews| Index: content/browser/renderer_host/render_view_host_impl.cc |
| diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc |
| index 8388af1bad8925ce675338110d87c801e8c1f58a..e45cab8f129f17b302f7d0d80bb81df2160e5e42 100644 |
| --- a/content/browser/renderer_host/render_view_host_impl.cc |
| +++ b/content/browser/renderer_host/render_view_host_impl.cc |
| @@ -38,6 +38,7 @@ |
| #include "content/browser/gpu/gpu_process_host.h" |
| #include "content/browser/host_zoom_map_impl.h" |
| #include "content/browser/loader/resource_dispatcher_host_impl.h" |
| +#include "content/browser/renderer_host/input/timeout_monitor.h" |
| #include "content/browser/renderer_host/render_process_host_impl.h" |
| #include "content/browser/renderer_host/render_view_host_delegate.h" |
| #include "content/browser/renderer_host/render_view_host_delegate_view.h" |
| @@ -229,6 +230,9 @@ RenderViewHostImpl::RenderViewHostImpl( |
| base::Unretained(ResourceDispatcherHostImpl::Get()), |
| GetProcess()->GetID(), GetRoutingID())); |
| } |
| + |
| + close_timeout_.reset(new TimeoutMonitor(base::Bind( |
| + &RenderViewHostImpl::ClosePageTimeout, weak_factory_.GetWeakPtr()))); |
| } |
| RenderViewHostImpl::~RenderViewHostImpl() { |
| @@ -575,10 +579,6 @@ WebPreferences RenderViewHostImpl::ComputeWebkitPrefs() { |
| void RenderViewHostImpl::ClosePage() { |
| is_waiting_for_close_ack_ = true; |
| - GetWidget()->StartHangMonitorTimeout( |
| - TimeDelta::FromMilliseconds(kUnloadTimeoutMS), |
| - blink::WebInputEvent::Undefined, |
| - RendererUnresponsiveType::RENDERER_UNRESPONSIVE_CLOSE_PAGE); |
| bool is_javascript_dialog_showing = delegate_->IsJavaScriptDialogShowing(); |
| @@ -586,10 +586,7 @@ void RenderViewHostImpl::ClosePage() { |
| // close event because it is known unresponsive, waiting for the reply from |
| // the dialog. |
| if (IsRenderViewLive() && !is_javascript_dialog_showing) { |
| - // Since we are sending an IPC message to the renderer, increase the event |
| - // count to prevent the hang monitor timeout from being stopped by input |
| - // event acknowledgments. |
| - GetWidget()->increment_in_flight_event_count(); |
| + close_timeout_->Start(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); |
|
Charlie Reis
2017/03/03 01:06:00
Sure, moving the timer start within both of these
Avi (use Gerrit)
2017/03/03 01:25:25
Acknowledged.
|
| // TODO(creis): Should this be moved to Shutdown? It may not be called for |
| // RenderViewHosts that have been swapped out. |
| @@ -607,7 +604,7 @@ void RenderViewHostImpl::ClosePage() { |
| } |
| void RenderViewHostImpl::ClosePageIgnoringUnloadEvents() { |
| - GetWidget()->StopHangMonitorTimeout(); |
| + close_timeout_->Stop(); |
| is_waiting_for_close_ack_ = false; |
| sudden_termination_allowed_ = true; |
| @@ -853,7 +850,6 @@ void RenderViewHostImpl::OnTakeFocus(bool reverse) { |
| } |
| void RenderViewHostImpl::OnClosePageACK() { |
| - GetWidget()->decrement_in_flight_event_count(); |
| ClosePageIgnoringUnloadEvents(); |
| } |
| @@ -959,4 +955,16 @@ void RenderViewHostImpl::RenderViewReady() { |
| delegate_->RenderViewReady(this); |
| } |
| +void RenderViewHostImpl::ClosePageTimeout() { |
| + if (delegate_->ShouldIgnoreUnresponsiveRenderer()) |
| + return; |
| + |
| + UMA_HISTOGRAM_ENUMERATION( |
| + "ChildProcess.HangRendererType", |
| + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_CLOSE_PAGE, |
| + RendererUnresponsiveType::RENDERER_UNRESPONSIVE_MAX); |
| + |
| + ClosePageIgnoringUnloadEvents(); |
| +} |
| + |
| } // namespace content |