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..01f19e27c04a78654f74770c52845918520b9d69 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,37 +535,47 @@ 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; |
| + } |
| + |
| + if (touch_scrolling_mode_ == TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE) { |
| + needs_async_touchmove_for_outer_slop_region_ = true; |
| + pending_async_touchmove_.reset(); |
| } |
| - pending_async_touchmove_.reset(); |
| - send_touch_events_async_ = true; |
| - needs_async_touchmove_for_outer_slop_region_ = true; |
| return; |
| } |
| + if (gesture_event.event.type != blink::WebInputEvent::GestureScrollUpdate || |
| + seen_scroll_update_this_sequence_) |
| + return; |
| + |
| + seen_scroll_update_this_sequence_ = true; |
| + |
| + if (touch_scrolling_mode_ == TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE) |
| + send_touch_events_async_ = true; |
|
jdduke (slow)
2014/07/15 18:54:47
Could you add a DHECK(!pending_async_touchmove_) w
tdresser
2014/07/15 20:36:49
Oh dear...
So obviously removing "seen_scroll_upd
|
| + |
| if (touch_scrolling_mode_ != TOUCH_SCROLLING_MODE_TOUCHCANCEL) |
| return; |