| Index: content/browser/renderer_host/input/gesture_event_queue.cc
|
| diff --git a/content/browser/renderer_host/input/gesture_event_queue.cc b/content/browser/renderer_host/input/gesture_event_queue.cc
|
| index a13fde15a429ec47c2b6eaa59361171706eb0bad..c7028f8a375eaef3f4f29b63f682a4d4f37d9424 100644
|
| --- a/content/browser/renderer_host/input/gesture_event_queue.cc
|
| +++ b/content/browser/renderer_host/input/gesture_event_queue.cc
|
| @@ -62,7 +62,7 @@ GestureEventQueue::GestureEventQueue(
|
| TouchpadTapSuppressionControllerClient* touchpad_client,
|
| const Config& config)
|
| : client_(client),
|
| - fling_in_progress_(false),
|
| + active_fling_count_(0),
|
| scrolling_in_progress_(false),
|
| ignore_next_ack_(false),
|
| touchpad_tap_suppression_controller_(
|
| @@ -92,8 +92,6 @@ void GestureEventQueue::QueueEvent(
|
|
|
| bool GestureEventQueue::ShouldDiscardFlingCancelEvent(
|
| const GestureEventWithLatencyInfo& gesture_event) const {
|
| - if (coalesced_gesture_events_.empty() && fling_in_progress_)
|
| - return false;
|
| GestureQueue::const_reverse_iterator it =
|
| coalesced_gesture_events_.rbegin();
|
| while (it != coalesced_gesture_events_.rend()) {
|
| @@ -103,7 +101,9 @@ bool GestureEventQueue::ShouldDiscardFlingCancelEvent(
|
| return true;
|
| it++;
|
| }
|
| - return true;
|
| + // If there are no fling-affecting events in the queue, and there's still an
|
| + // active fling in the renderer, the cancel event should not be dropped.
|
| + return !active_fling_count_;
|
| }
|
|
|
| bool GestureEventQueue::ShouldForwardForBounceReduction(
|
| @@ -175,12 +175,6 @@ bool GestureEventQueue::ShouldForwardForTapSuppression(
|
| void GestureEventQueue::QueueAndForwardIfNecessary(
|
| const GestureEventWithLatencyInfo& gesture_event) {
|
| switch (gesture_event.event.type) {
|
| - case WebInputEvent::GestureFlingCancel:
|
| - fling_in_progress_ = false;
|
| - break;
|
| - case WebInputEvent::GestureFlingStart:
|
| - fling_in_progress_ = true;
|
| - break;
|
| case WebInputEvent::GesturePinchUpdate:
|
| case WebInputEvent::GestureScrollUpdate:
|
| QueueScrollOrPinchAndForwardIfNecessary(gesture_event);
|
| @@ -204,6 +198,11 @@ void GestureEventQueue::ProcessGestureAck(InputEventAckState ack_result,
|
| return;
|
| }
|
|
|
| + if (ack_result == INPUT_EVENT_ACK_STATE_CONSUMED &&
|
| + type == blink::WebInputEvent::GestureFlingStart) {
|
| + ++active_fling_count_;
|
| + }
|
| +
|
| // It's possible that the ack for the second event in an in-flight, coalesced
|
| // Gesture{Scroll,Pinch}Update pair is received prior to the first event ack.
|
| // TODO(jdduke): Unify GSU/GPU pairs into a single event, crbug.com/359115.
|
| @@ -269,8 +268,9 @@ TouchpadTapSuppressionController*
|
| return &touchpad_tap_suppression_controller_;
|
| }
|
|
|
| -void GestureEventQueue::FlingHasBeenHalted() {
|
| - fling_in_progress_ = false;
|
| +void GestureEventQueue::DidStopFlinging() {
|
| + DCHECK_GE(active_fling_count_, 0);
|
| + --active_fling_count_;
|
| }
|
|
|
| void GestureEventQueue::ForwardGestureEvent(
|
|
|