| Index: content/browser/renderer_host/input/gesture_event_filter.cc
|
| diff --git a/content/browser/renderer_host/input/gesture_event_filter.cc b/content/browser/renderer_host/input/gesture_event_filter.cc
|
| index 9a80a06b4ffade3b286d785690c46c528f0d118f..1d75e367ad3974f47e37bbbb3237a47659b93fd3 100644
|
| --- a/content/browser/renderer_host/input/gesture_event_filter.cc
|
| +++ b/content/browser/renderer_host/input/gesture_event_filter.cc
|
| @@ -239,10 +239,18 @@ bool GestureEventFilter::ShouldForwardForCoalescing(
|
| break;
|
| }
|
| coalesced_gesture_events_.push_back(gesture_event);
|
| +
|
| + // Ensure that if the added event is asynchonous, it is fired and
|
| + // removed from |coalesced_gesture_events_|.
|
| + SendAsyncEvents();
|
| return ShouldHandleEventNow();
|
| }
|
|
|
| -void GestureEventFilter::ProcessGestureAck(bool processed, int type) {
|
| +void GestureEventFilter::ProcessGestureAck(bool processed,
|
| + WebInputEvent::Type type) {
|
| + if (IsGestureEventTypeAsync(type))
|
| + return;
|
| +
|
| if (coalesced_gesture_events_.empty()) {
|
| DLOG(ERROR) << "Received unexpected ACK for event type " << type;
|
| return;
|
| @@ -256,6 +264,9 @@ void GestureEventFilter::ProcessGestureAck(bool processed, int type) {
|
| touchpad_tap_suppression_controller_->GestureFlingCancelAck(processed);
|
| }
|
| coalesced_gesture_events_.pop_front();
|
| + // If the event which was just ACKed was blocking asynchronous
|
| + // events, fire those asynchronous events now.
|
| + SendAsyncEvents();
|
| if (ignore_next_ack_) {
|
| ignore_next_ack_ = false;
|
| } else if (!coalesced_gesture_events_.empty()) {
|
| @@ -436,4 +447,20 @@ gfx::Transform GestureEventFilter::GetTransformForEvent(
|
| }
|
| return gesture_transform;
|
| }
|
| +
|
| +void GestureEventFilter::SendAsyncEvents() {
|
| + GestureEventWithLatencyInfo gesture_event;
|
| + while (!coalesced_gesture_events_.empty()) {
|
| + gesture_event = coalesced_gesture_events_.front();
|
| + if (!GestureEventFilter::IsGestureEventTypeAsync(gesture_event.event.type))
|
| + return;
|
| + coalesced_gesture_events_.pop_front();
|
| + input_router_->SendGestureEventImmediately(gesture_event);
|
| + }
|
| +}
|
| +
|
| +bool GestureEventFilter::IsGestureEventTypeAsync(WebInputEvent::Type type) {
|
| + return type == WebInputEvent::GestureTapDown;
|
| +}
|
| +
|
| } // namespace content
|
|
|