diff options
author | andreip@chromium.org <andreip@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-25 20:16:30 +0000 |
---|---|---|
committer | andreip@chromium.org <andreip@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-25 20:16:30 +0000 |
commit | 9c2e485e2933a69d051c0ea91c15064885823c6f (patch) | |
tree | 06a8396b6f725ba890ee3de8c06ba2dc4844b765 /content/browser/renderer_host/render_widget_host.cc | |
parent | b0079a9450486ad44b398a645f8dcde68f5dbf75 (diff) | |
download | chromium_src-9c2e485e2933a69d051c0ea91c15064885823c6f.zip chromium_src-9c2e485e2933a69d051c0ea91c15064885823c6f.tar.gz chromium_src-9c2e485e2933a69d051c0ea91c15064885823c6f.tar.bz2 |
Fix for crbug.com/111185.
Count input events and the corresponding acks coming from the renderer
and only consider a renderer responsive when all acks have been
received.
BUG=111185
TEST=RenderWidgetHostTest.MultipleInputEvents
Review URL: http://codereview.chromium.org/9129024
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@119112 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/renderer_host/render_widget_host.cc')
-rw-r--r-- | content/browser/renderer_host/render_widget_host.cc | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/content/browser/renderer_host/render_widget_host.cc b/content/browser/renderer_host/render_widget_host.cc index 18562bd..d8aac2d 100644 --- a/content/browser/renderer_host/render_widget_host.cc +++ b/content/browser/renderer_host/render_widget_host.cc @@ -77,6 +77,7 @@ bool ShouldCoalesceMouseWheelEvents(const WebMouseWheelEvent& last_event, RenderWidgetHost::RenderWidgetHost(content::RenderProcessHost* process, int routing_id) : renderer_initialized_(false), + hung_renderer_delay_ms_(kHungRendererDelayMs), renderer_accessible_(false), view_(NULL), process_(process), @@ -94,6 +95,7 @@ RenderWidgetHost::RenderWidgetHost(content::RenderProcessHost* process, touch_event_is_queued_(false), needs_repainting_on_restore_(false), is_unresponsive_(false), + in_flight_event_count_(0), in_get_backing_store_(false), view_being_painted_(false), ignore_input_events_(false), @@ -538,13 +540,13 @@ void RenderWidgetHost::StartHangMonitorTimeout(TimeDelta delay) { void RenderWidgetHost::RestartHangMonitorTimeout() { // Setting to null will cause StartHangMonitorTimeout to restart the timer. time_when_considered_hung_ = Time(); - StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kHungRendererDelayMs)); + StartHangMonitorTimeout( + TimeDelta::FromMilliseconds(hung_renderer_delay_ms_)); } void RenderWidgetHost::StopHangMonitorTimeout() { time_when_considered_hung_ = Time(); RendererIsResponsive(); - // We do not bother to stop the hung_renderer_timer_ here in case it will be // started again shortly, which happens to be the common use case. } @@ -719,7 +721,9 @@ void RenderWidgetHost::ForwardInputEvent(const WebInputEvent& input_event, // after this line. next_mouse_move_.reset(); - StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kHungRendererDelayMs)); + in_flight_event_count_++; + StartHangMonitorTimeout( + TimeDelta::FromMilliseconds(hung_renderer_delay_ms_)); } void RenderWidgetHost::ForwardTouchEvent( @@ -770,6 +774,9 @@ void RenderWidgetHost::RendererExited(base::TerminationStatus status, is_hidden_ = false; is_accelerated_compositing_active_ = false; + // Reset this to ensure the hung renderer mechanism is working properly. + in_flight_event_count_ = 0; + if (view_) { view_->RenderViewGone(status, exit_code); view_ = NULL; // The View should be deleted by RenderViewGone. @@ -1149,7 +1156,8 @@ void RenderWidgetHost::OnMsgInputEventAck(WebInputEvent::Type event_type, UMA_HISTOGRAM_TIMES("MPArch.RWH_InputEventDelta", delta); // Cancel pending hung renderer checks since the renderer is responsive. - StopHangMonitorTimeout(); + if (--in_flight_event_count_ == 0) + StopHangMonitorTimeout(); int type = static_cast<int>(event_type); if (type < WebInputEvent::Undefined) { |