Index: content/browser/renderer_host/render_widget_host_impl.cc |
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc |
index f1cbc2a9bc2bad989f3eab13ed7a24ebd2fd4259..29ec4b7416ba4b8bfdbba64ce6c6ed13d53a2b1e 100644 |
--- a/content/browser/renderer_host/render_widget_host_impl.cc |
+++ b/content/browser/renderer_host/render_widget_host_impl.cc |
@@ -160,7 +160,8 @@ RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate, |
bool hidden) |
: view_(NULL), |
renderer_initialized_(false), |
- hung_renderer_delay_ms_(kHungRendererDelayMs), |
+ hung_renderer_delay_( |
+ base::TimeDelta::FromMilliseconds(kHungRendererDelayMs)), |
delegate_(delegate), |
process_(process), |
routing_id_(routing_id), |
@@ -537,6 +538,11 @@ void RenderWidgetHostImpl::WasShown(const ui::LatencyInfo& latency_info) { |
SendScreenRects(); |
+ // When hidden, timeout monitoring for input events is disabled. Restore it |
+ // now to ensure consistent hang detection. |
+ if (in_flight_event_count_) |
+ RestartHangMonitorTimeout(); |
+ |
// Always repaint on restore. |
bool needs_repainting = true; |
needs_repainting_on_restore_ = false; |
@@ -863,8 +869,7 @@ void RenderWidgetHostImpl::StartHangMonitorTimeout(base::TimeDelta delay) { |
void RenderWidgetHostImpl::RestartHangMonitorTimeout() { |
if (hang_monitor_timeout_) |
- hang_monitor_timeout_->Restart( |
- base::TimeDelta::FromMilliseconds(hung_renderer_delay_ms_)); |
+ hang_monitor_timeout_->Restart(hung_renderer_delay_); |
} |
void RenderWidgetHostImpl::StopHangMonitorTimeout() { |
@@ -1210,6 +1215,7 @@ void RenderWidgetHostImpl::RendererExited(base::TerminationStatus status, |
// Reset this to ensure the hung renderer mechanism is working properly. |
in_flight_event_count_ = 0; |
+ StopHangMonitorTimeout(); |
if (view_) { |
GpuSurfaceTracker::Get()->SetSurfaceHandle(surface_id_, |
@@ -1793,9 +1799,9 @@ InputEventAckState RenderWidgetHostImpl::FilterInputEvent( |
} |
void RenderWidgetHostImpl::IncrementInFlightEventCount() { |
- StartHangMonitorTimeout( |
- TimeDelta::FromMilliseconds(hung_renderer_delay_ms_)); |
increment_in_flight_event_count(); |
+ if (!is_hidden_) |
+ StartHangMonitorTimeout(hung_renderer_delay_); |
} |
void RenderWidgetHostImpl::DecrementInFlightEventCount() { |
@@ -1804,7 +1810,8 @@ void RenderWidgetHostImpl::DecrementInFlightEventCount() { |
StopHangMonitorTimeout(); |
} else { |
// The renderer is responsive, but there are in-flight events to wait for. |
- RestartHangMonitorTimeout(); |
+ if (!is_hidden_) |
+ RestartHangMonitorTimeout(); |
} |
} |