| 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 {
|
|
|