Index: content/browser/renderer_host/input/touch_event_queue.cc |
diff --git a/content/browser/renderer_host/input/touch_event_queue.cc b/content/browser/renderer_host/input/touch_event_queue.cc |
index 14118d0e0c0d9f22d5d14afbf2450433a9315481..ecac867df010c896a497e7f370863aa107592502 100644 |
--- a/content/browser/renderer_host/input/touch_event_queue.cc |
+++ b/content/browser/renderer_host/input/touch_event_queue.cc |
@@ -47,9 +47,10 @@ bool ShouldTouchTypeTriggerTimeout(WebInputEvent::Type type) { |
// sufficiently delayed. |
class TouchEventQueue::TouchTimeoutHandler { |
public: |
- TouchTimeoutHandler(TouchEventQueue* touch_queue, size_t timeout_delay_ms) |
+ TouchTimeoutHandler(TouchEventQueue* touch_queue, |
+ base::TimeDelta timeout_delay) |
: touch_queue_(touch_queue), |
- timeout_delay_(base::TimeDelta::FromMilliseconds(timeout_delay_ms)), |
+ timeout_delay_(timeout_delay), |
pending_ack_state_(PENDING_ACK_NONE), |
timeout_monitor_(base::Bind(&TouchTimeoutHandler::OnTimeOut, |
base::Unretained(this))) {} |
@@ -99,6 +100,10 @@ class TouchEventQueue::TouchTimeoutHandler { |
timeout_monitor_.Stop(); |
} |
+ void set_timeout_delay(base::TimeDelta timeout_delay) { |
+ timeout_delay_ = timeout_delay; |
+ } |
+ |
private: |
enum PendingAckState { |
PENDING_ACK_NONE, |
@@ -506,17 +511,24 @@ bool TouchEventQueue::IsPendingAckTouchStart() const { |
} |
void TouchEventQueue::SetAckTimeoutEnabled(bool enabled, |
- size_t ack_timeout_delay_ms) { |
+ base::TimeDelta ack_timeout_delay) { |
if (!enabled) { |
- // Avoid resetting |timeout_handler_|, as an outstanding timeout may |
- // be active and must be completed for ack handling consistency. |
ack_timeout_enabled_ = false; |
+ if (touch_filtering_state_ == FORWARD_TOUCHES_UNTIL_TIMEOUT) |
+ touch_filtering_state_ = FORWARD_ALL_TOUCHES; |
+ // Only reset the |timeout_handler_| if the timer is running and has not yet |
+ // timed out. This ensures that an already timed out sequence is properly |
+ // flushed by the handler. |
+ if (timeout_handler_ && timeout_handler_->IsTimeoutTimerRunning()) |
+ timeout_handler_->Reset(); |
return; |
} |
ack_timeout_enabled_ = true; |
if (!timeout_handler_) |
- timeout_handler_.reset(new TouchTimeoutHandler(this, ack_timeout_delay_ms)); |
+ timeout_handler_.reset(new TouchTimeoutHandler(this, ack_timeout_delay)); |
+ else |
+ timeout_handler_->set_timeout_delay(ack_timeout_delay); |
} |
bool TouchEventQueue::IsTimeoutRunningForTesting() const { |