summaryrefslogtreecommitdiffstats
path: root/content/browser/renderer_host/render_widget_host.cc
diff options
context:
space:
mode:
authorandreip@chromium.org <andreip@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-25 20:16:30 +0000
committerandreip@chromium.org <andreip@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-25 20:16:30 +0000
commit9c2e485e2933a69d051c0ea91c15064885823c6f (patch)
tree06a8396b6f725ba890ee3de8c06ba2dc4844b765 /content/browser/renderer_host/render_widget_host.cc
parentb0079a9450486ad44b398a645f8dcde68f5dbf75 (diff)
downloadchromium_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.cc16
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) {