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 bbac01c3ebff51081f112419068c5525a4bad5cf..424c8faa99ccf416456fc7669f2a1d37f0ce6cd9 100644 |
--- a/content/browser/renderer_host/input/touch_event_queue.cc |
+++ b/content/browser/renderer_host/input/touch_event_queue.cc |
@@ -349,7 +349,8 @@ TouchEventQueue::TouchEventQueue(TouchEventQueueClient* client, |
send_touch_events_async_(false), |
needs_async_touchmove_for_outer_slop_region_(false), |
last_sent_touch_timestamp_sec_(0), |
- touch_scrolling_mode_(config.touch_scrolling_mode) { |
+ touch_scrolling_mode_(config.touch_scrolling_mode), |
+ seen_scroll_update_this_sequence_(false) { |
DCHECK(client); |
if (ack_timeout_enabled_) { |
timeout_handler_.reset( |
@@ -534,31 +535,36 @@ void TouchEventQueue::ForwardNextEventToRenderer() { |
void TouchEventQueue::OnGestureScrollEvent( |
const GestureEventWithLatencyInfo& gesture_event) { |
- 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 (gesture_event.event.type == blink::WebInputEvent::GestureScrollBegin) { |
+ seen_scroll_update_this_sequence_ = false; |
- if (touch_scrolling_mode_ == TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE) { |
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 && |
+ touch_filtering_state_ != DROP_ALL_TOUCHES && |
+ touch_filtering_state_ != DROP_TOUCHES_IN_SEQUENCE && |
+ (touch_ack_states_.empty() || |
+ AllTouchAckStatesHaveState( |
+ INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS))) { |
// If no touch points have a consumer, prevent all subsequent touch events |
// received during the scroll from reaching the renderer. This ensures |
// that the first touchstart the renderer sees in any given sequence can |
// always be preventDefault'ed (cancelable == true). |
// TODO(jdduke): Revisit if touchstarts during scroll are made cancelable. |
- if (touch_ack_states_.empty() || |
- AllTouchAckStatesHaveState( |
- INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS)) { |
- touch_filtering_state_ = DROP_TOUCHES_IN_SEQUENCE; |
- return; |
- } |
+ touch_filtering_state_ = DROP_TOUCHES_IN_SEQUENCE; |
} |
jdduke (slow)
2014/07/08 16:30:18
Could we return here (the end of the == GestureScr
tdresser
2014/07/08 18:10:36
Fine with me. Done.
|
+ } |
+ if (gesture_event.event.type != blink::WebInputEvent::GestureScrollUpdate || |
+ seen_scroll_update_this_sequence_) |
+ return; |
+ |
+ if (touch_scrolling_mode_ == TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE) { |
pending_async_touchmove_.reset(); |
send_touch_events_async_ = true; |
needs_async_touchmove_for_outer_slop_region_ = true; |