Index: ui/events/gesture_detection/touch_disposition_gesture_filter.cc |
diff --git a/ui/events/gesture_detection/touch_disposition_gesture_filter.cc b/ui/events/gesture_detection/touch_disposition_gesture_filter.cc |
index 564d014a4c5f94c28a7bd9a72be4ec1c8c84d594..2c7f6ae24394f196997958bf06ac79f450ff559f 100644 |
--- a/ui/events/gesture_detection/touch_disposition_gesture_filter.cc |
+++ b/ui/events/gesture_detection/touch_disposition_gesture_filter.cc |
@@ -170,7 +170,8 @@ TouchDispositionGestureFilter::OnGesturePacket( |
return SUCCESS; |
} |
-void TouchDispositionGestureFilter::OnTouchEventAck(bool event_consumed) { |
+void TouchDispositionGestureFilter::OnTouchEventAckForQueueFront( |
+ bool event_consumed) { |
// Spurious touch acks from the renderer should not trigger a crash. |
if (IsEmpty() || (Head().empty() && sequences_.size() == 1)) |
return; |
@@ -207,6 +208,23 @@ void TouchDispositionGestureFilter::OnTouchEventAck(bool event_consumed) { |
FilterAndSendPacket(packet); |
} |
DCHECK(touch_packet_for_current_ack_handled); |
+ |
+ // If the next event has already been acked, process it. |
+ if (!sequence.empty() && |
+ sequence.front().ack_state() != |
+ GestureEventDataPacket::AckState::PENDING) { |
+ OnTouchEventAckForQueueFront(sequence.front().ack_state() == |
+ GestureEventDataPacket::AckState::CONSUMED); |
+ } |
+} |
+ |
+void TouchDispositionGestureFilter::OnTouchEventAckForQueueBack( |
+ bool event_consumed) { |
+ DCHECK(!Tail().empty()); |
+ if (Tail().size() == 1) |
+ OnTouchEventAckForQueueFront(event_consumed); |
+ else |
+ Tail().back().ack(event_consumed); |
} |
bool TouchDispositionGestureFilter::IsEmpty() const { |