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 187728134120ad9edc378fe6fb60347a9a123535..d97a4db8b59f684e62cc4abab9a153535b97fc5a 100644 |
--- a/content/browser/renderer_host/input/touch_event_queue.cc |
+++ b/content/browser/renderer_host/input/touch_event_queue.cc |
@@ -204,6 +204,10 @@ class TouchEventQueue::TouchMoveSlopSuppressor { |
suppressing_touchmoves_ = slop_suppression_length_dips_squared_ != 0; |
} |
+ if (event.type == WebInputEvent::TouchEnd || |
+ event.type == WebInputEvent::TouchCancel) |
+ suppressing_touchmoves_ = false; |
+ |
if (event.type != WebInputEvent::TouchMove) |
return false; |
@@ -227,6 +231,8 @@ class TouchEventQueue::TouchMoveSlopSuppressor { |
suppressing_touchmoves_ = false; |
} |
+ bool suppressing_touchmoves() const { return suppressing_touchmoves_; } |
+ |
private: |
double slop_suppression_length_dips_squared_; |
gfx::PointF touch_sequence_start_position_; |
@@ -322,6 +328,7 @@ class CoalescedWebTouchEvent { |
TouchEventQueue::Config::Config() |
: touchmove_slop_suppression_length_dips(0), |
+ touchmove_slop_suppression_region_includes_boundary(true), |
touch_scrolling_mode(TOUCH_SCROLLING_MODE_DEFAULT), |
touch_ack_timeout_delay(base::TimeDelta::FromMilliseconds(200)), |
touch_ack_timeout_supported(false) { |
@@ -335,7 +342,10 @@ TouchEventQueue::TouchEventQueue(TouchEventQueueClient* client, |
touch_filtering_state_(TOUCH_FILTERING_STATE_DEFAULT), |
ack_timeout_enabled_(config.touch_ack_timeout_supported), |
touchmove_slop_suppressor_(new TouchMoveSlopSuppressor( |
- config.touchmove_slop_suppression_length_dips + kSlopEpsilon)), |
+ config.touchmove_slop_suppression_length_dips + |
+ (config.touchmove_slop_suppression_region_includes_boundary |
+ ? kSlopEpsilon |
+ : -kSlopEpsilon))), |
send_touch_events_async_(false), |
needs_async_touchmove_for_outer_slop_region_(false), |
last_sent_touch_timestamp_sec_(0), |
@@ -527,6 +537,12 @@ void TouchEventQueue::OnGestureScrollEvent( |
if (gesture_event.event.type != blink::WebInputEvent::GestureScrollBegin) |
return; |
+ if (touch_filtering_state_ != DROP_ALL_TOUCHES && |
+ touch_filtering_state_ != DROP_TOUCHES_IN_SEQUENCE) { |
+ DCHECK(!touchmove_slop_suppressor_->suppressing_touchmoves()) |
+ << "The renderer should be offered a touchmove before scrolling begins"; |
+ } |
+ |
if (touch_scrolling_mode_ == TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE) { |
if (touch_filtering_state_ != DROP_ALL_TOUCHES && |
touch_filtering_state_ != DROP_TOUCHES_IN_SEQUENCE) { |