Chromium Code Reviews| 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; |