| 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 15cda746b21da1b0c32c55e3ed40d47aad010373..aa8856951d52184c498422e779804aad44457432 100644
|
| --- a/content/browser/renderer_host/input/gesture_event_queue.cc
|
| +++ b/content/browser/renderer_host/input/gesture_event_queue.cc
|
| @@ -186,6 +186,9 @@ void GestureEventQueue::QueueAndForwardIfNecessary(
|
| case WebInputEvent::GestureScrollUpdate:
|
| QueueScrollOrPinchAndForwardIfNecessary(gesture_event);
|
| return;
|
| + case WebInputEvent::GestureScrollBegin:
|
| + if (OnScrollBegin(gesture_event))
|
| + return;
|
| default:
|
| break;
|
| }
|
| @@ -195,6 +198,25 @@ void GestureEventQueue::QueueAndForwardIfNecessary(
|
| client_->SendGestureEventImmediately(gesture_event);
|
| }
|
|
|
| +bool GestureEventQueue::OnScrollBegin(
|
| + const GestureEventWithLatencyInfo& gesture_event) {
|
| + // If a synthetic scroll begin is encountered, it can cancel out a previous
|
| + // synthetic scroll end. This allows a later gesture scroll update to coalesce
|
| + // with the previous one. crbug.com/607340.
|
| + bool synthetic = gesture_event.event.data.scrollBegin.synthetic;
|
| + bool have_unsent_events =
|
| + EventsInFlightCount() < coalesced_gesture_events_.size();
|
| + if (synthetic && have_unsent_events) {
|
| + GestureEventWithLatencyInfo* last_event = &coalesced_gesture_events_.back();
|
| + if (last_event->event.type == WebInputEvent::GestureScrollEnd &&
|
| + last_event->event.data.scrollEnd.synthetic) {
|
| + coalesced_gesture_events_.pop_back();
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| +}
|
| +
|
| void GestureEventQueue::ProcessGestureAck(InputEventAckState ack_result,
|
| WebInputEvent::Type type,
|
| const ui::LatencyInfo& latency) {
|
|
|