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..01b239ab8de0aa0334160d5cea9fb15011db71f2 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; |
@@ -178,12 +179,29 @@ void TouchDispositionGestureFilter::OnTouchEventAck(bool event_consumed) { |
if (Head().empty()) |
PopGestureSequence(); |
- GestureSequence& sequence = Head(); |
+ Head().front().ack(event_consumed); |
+ SendAckedEvents(); |
+} |
+ |
+void TouchDispositionGestureFilter::OnTouchEventAckForQueueBack( |
+ bool event_consumed) { |
+ // Spurious touch acks from the renderer should not trigger a crash. |
+ if(IsEmpty() || Tail().empty()) |
jdduke (slow)
2014/11/26 16:07:09
Hmm, should an ack from the renderer ever hit the
tdresser
2014/11/27 18:26:25
Done.
|
+ return; |
+ Tail().back().ack(event_consumed); |
+ SendAckedEvents(); |
jdduke (slow)
2014/11/26 16:07:09
Hmm, I'm not sure about this. Don't we only want t
tdresser
2014/11/27 18:26:24
I haven't come up with a case where having that gu
|
+} |
+ |
+void TouchDispositionGestureFilter::SendAckedEvents() { |
jdduke (slow)
2014/11/26 16:07:09
Nice, the recursion avoidance may have been premat
tdresser
2014/11/27 18:26:25
I think its a fair bit clearer this way, yeah.
|
+ // Dispatch all packets corresponding to ack'ed touches, as well as |
+ // any pending timeout-based packets. |
+ while (true) { |
jdduke (slow)
2014/11/26 16:07:09
Would it make sense to push the if condition below
tdresser
2014/11/27 18:26:24
Yuck. Fixed.
|
+ if (IsEmpty() || (Head().empty() && sequences_.size() == 1)) |
+ break; |
+ if (Head().empty()) |
+ PopGestureSequence(); |
+ GestureSequence& sequence = Head(); |
- // Dispatch the packet corresponding to the ack'ed touch, as well as any |
- // additional timeout-based packets queued before the ack was received. |
- bool touch_packet_for_current_ack_handled = false; |
- while (!sequence.empty()) { |
DCHECK_NE(sequence.front().gesture_source(), |
GestureEventDataPacket::UNDEFINED); |
DCHECK_NE(sequence.front().gesture_source(), |
@@ -191,12 +209,15 @@ void TouchDispositionGestureFilter::OnTouchEventAck(bool event_consumed) { |
GestureEventDataPacket::GestureSource source = |
sequence.front().gesture_source(); |
+ GestureEventDataPacket::AckState ack_state = sequence.front().ack_state(); |
+ |
if (source != GestureEventDataPacket::TOUCH_TIMEOUT) { |
- // We should handle at most one non-timeout based packet. |
- if (touch_packet_for_current_ack_handled) |
+ // We've sent all packets which aren't pending their ack. |
+ if (ack_state == GestureEventDataPacket::AckState::PENDING) |
break; |
- state_.OnTouchEventAck(event_consumed, IsTouchStartEvent(source)); |
- touch_packet_for_current_ack_handled = true; |
+ state_.OnTouchEventAck(sequence.front().ack_state() == |
jdduke (slow)
2014/11/26 16:07:09
Nit: (ack_state == GestureEventDataPacket::AckStat
tdresser
2014/11/27 18:26:24
Done.
|
+ GestureEventDataPacket::AckState::CONSUMED, |
+ IsTouchStartEvent(source)); |
} |
// We need to pop the current sequence before sending the packet, because |
// sending the packet could result in this method being re-entered (e.g. on |
@@ -206,7 +227,6 @@ void TouchDispositionGestureFilter::OnTouchEventAck(bool event_consumed) { |
sequence.pop(); |
FilterAndSendPacket(packet); |
} |
- DCHECK(touch_packet_for_current_ack_handled); |
jdduke (slow)
2014/11/26 16:07:09
Do we still want to validate that at least one pac
tdresser
2014/11/27 18:26:25
Done.
|
} |
bool TouchDispositionGestureFilter::IsEmpty() const { |