Index: ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc |
diff --git a/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc b/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc |
index 1452caa1922e55c28327ed361bd3999fab7ffbfe..b01a69f7629bee51cfd02933a96e6ece3a23f359 100644 |
--- a/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc |
+++ b/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc |
@@ -128,13 +128,33 @@ class TouchDispositionGestureFilterTest |
} |
void SendTouchEventAck(bool event_consumed) { |
- queue_->OnTouchEventAck(event_consumed); |
+ queue_->OnTouchEventAckForQueueFront(event_consumed); |
} |
void SendTouchConsumedAck() { SendTouchEventAck(true); } |
void SendTouchNotConsumedAck() { SendTouchEventAck(false); } |
+ void SendTouchEventAckForQueueBack(bool event_consumed) { |
+ queue_->OnTouchEventAckForQueueBack(event_consumed); |
+ } |
+ |
+ void SendTouchConsumedAckForQueueBack() { |
+ SendTouchEventAckForQueueBack(true); |
+ } |
+ |
+ void SendTouchNotConsumedAckForQueueBack() { |
+ SendTouchEventAckForQueueBack(false); |
+ } |
+ |
+ void PushGesture(EventType type) { |
+ pending_gesture_packet_.Push(CreateGesture(type)); |
+ } |
+ |
+ void PushGesture(EventType type, float x, float y, float diameter) { |
+ pending_gesture_packet_.Push(CreateGesture(type, x, y, diameter)); |
+ } |
+ |
const MockMotionEvent& PressTouchPoint(float x, float y) { |
touch_event_.PressPoint(x, y); |
touch_event_.SetRawOffset(raw_offset_.x(), raw_offset_.y()); |
@@ -1099,4 +1119,117 @@ TEST_F(TouchDispositionGestureFilterTest, PreviousScrollPrevented) { |
.details.previous_scroll_update_in_sequence_prevented()); |
} |
+TEST_F(TouchDispositionGestureFilterTest, AckQueueBack) { |
+ SendPacket(PressTouchPoint(1, 1), Gestures(ET_GESTURE_BEGIN)); |
+ SendTouchNotConsumedAck(); |
+ |
+ SendPacket(MoveTouchPoint(), Gestures(ET_GESTURE_SCROLL_BEGIN)); |
+ SendTouchNotConsumedAck(); |
+ GetAndResetSentGestures(); |
+ |
+ // Pending touch move. |
+ GestureEventDataPacket packet1; |
+ packet1.Push(CreateGesture(ET_GESTURE_SCROLL_UPDATE, 2, 3, 0)); |
+ SendTouchGestures(MoveTouchPoint(), packet1); |
+ EXPECT_FALSE(GesturesSent()); |
+ |
+ // Additional pending touch move. |
+ SendPacket(MoveTouchPoint(), Gestures(ET_GESTURE_SCROLL_UPDATE)); |
+ |
+ // Ack back of the queue consumed. |
+ SendTouchConsumedAckForQueueBack(); |
+ |
+ // Ack the pending touch. |
+ GetAndResetSentGestures(); |
+ SendTouchNotConsumedAck(); |
+ |
+ // The consumed touch doesn't produce a gesture. |
+ EXPECT_TRUE(GesturesMatch( |
+ Gestures(ET_GESTURE_SCROLL_UPDATE), |
+ GetAndResetSentGestures())); |
+ EXPECT_EQ(gfx::PointF(2, 3), LastSentGestureLocation()); |
+ |
+ // Pending touch move. |
+ SendPacket(MoveTouchPoint(), Gestures(ET_GESTURE_SCROLL_UPDATE)); |
+ EXPECT_FALSE(GesturesSent()); |
+ |
+ // Ack back of the queue unconsumed (twice). |
+ SendPacket(MoveTouchPoint(), Gestures(ET_GESTURE_SCROLL_UPDATE)); |
+ SendTouchNotConsumedAckForQueueBack(); |
+ |
+ GestureEventDataPacket packet2; |
+ packet2.Push(CreateGesture(ET_GESTURE_SCROLL_UPDATE, 7, 8, 0)); |
+ SendTouchGestures(MoveTouchPoint(), packet2); |
+ EXPECT_FALSE(GesturesSent()); |
+ |
+ SendTouchNotConsumedAckForQueueBack(); |
+ |
+ // Ack the pending touch. |
+ GetAndResetSentGestures(); |
+ SendTouchNotConsumedAck(); |
+ |
+ // Both touches have now been acked. |
+ EXPECT_TRUE( |
+ GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE, ET_GESTURE_SCROLL_UPDATE, |
+ ET_GESTURE_SCROLL_UPDATE), |
+ GetAndResetSentGestures())); |
+ EXPECT_EQ(gfx::PointF(7, 8), LastSentGestureLocation()); |
+} |
+ |
+TEST_F(TouchDispositionGestureFilterTest, AckQueueGestureAtBack) { |
+ // Send gesture sequence |
+ SendPacket(PressTouchPoint(), Gestures(ET_GESTURE_BEGIN)); |
+ SendPacket(ReleaseTouchPoint(), Gestures(ET_GESTURE_END)); |
+ |
+ // Send second gesture sequence, and synchronously ack it. |
+ SendPacket(PressTouchPoint(), Gestures(ET_GESTURE_BEGIN)); |
+ SendTouchNotConsumedAckForQueueBack(); |
+ |
+ GestureEventDataPacket packet; |
+ packet.Push(CreateGesture(ET_GESTURE_END, 2, 3, 0)); |
+ SendTouchGestures(ReleaseTouchPoint(), packet); |
+ SendTouchNotConsumedAckForQueueBack(); |
+ |
+ // The second gesture sequence is blocked on the first. |
+ EXPECT_FALSE(GesturesSent()); |
+ |
+ SendTouchNotConsumedAck(); |
+ SendTouchNotConsumedAck(); |
+ |
+ // Both gestures have now been acked. |
+ EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_END, |
+ ET_GESTURE_BEGIN, ET_GESTURE_END), |
+ GetAndResetSentGestures())); |
+ EXPECT_EQ(gfx::PointF(2, 3), LastSentGestureLocation()); |
+} |
+ |
+TEST_F(TouchDispositionGestureFilterTest, |
+ SyncAcksOnlyTriggerAppropriateGestures) { |
+ // Queue a touch press. |
+ SendPacket(PressTouchPoint(), Gestures(ET_GESTURE_BEGIN)); |
+ |
+ // Send and synchronously ack two touch moves. |
+ SendPacket(MoveTouchPoint(), Gestures(ET_GESTURE_SCROLL_UPDATE)); |
+ SendTouchNotConsumedAckForQueueBack(); |
+ |
+ SendPacket(MoveTouchPoint(), Gestures(ET_GESTURE_SCROLL_UPDATE)); |
+ SendTouchNotConsumedAckForQueueBack(); |
+ |
+ // Queue a touch release. |
+ SendPacket(ReleaseTouchPoint(), Gestures(ET_GESTURE_END)); |
+ |
+ EXPECT_FALSE(GesturesSent()); |
+ |
+ // Ack the touch press. All events but the release should be acked. |
+ SendTouchNotConsumedAck(); |
+ EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_SCROLL_UPDATE, |
+ ET_GESTURE_SCROLL_UPDATE), |
+ GetAndResetSentGestures())); |
+ |
+ // The touch release still requires an ack. |
+ SendTouchNotConsumedAck(); |
+ EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_END), |
+ GetAndResetSentGestures())); |
+} |
+ |
} // namespace ui |