| Index: ui/events/gesture_detection/gesture_provider_unittest.cc
|
| diff --git a/ui/events/gesture_detection/gesture_provider_unittest.cc b/ui/events/gesture_detection/gesture_provider_unittest.cc
|
| index bf483ef4f99c85d8e337c15287ebc53765f80441..ecffe2289623c70e665e39ef4a147f3e18d95863 100644
|
| --- a/ui/events/gesture_detection/gesture_provider_unittest.cc
|
| +++ b/ui/events/gesture_detection/gesture_provider_unittest.cc
|
| @@ -12,7 +12,7 @@
|
| #include "ui/events/gesture_detection/gesture_event_data.h"
|
| #include "ui/events/gesture_detection/gesture_provider.h"
|
| #include "ui/events/gesture_detection/motion_event.h"
|
| -#include "ui/events/test/mock_motion_event.h"
|
| +#include "ui/events/test/motion_event_test_utils.h"
|
| #include "ui/gfx/geometry/point_f.h"
|
|
|
| using base::TimeDelta;
|
| @@ -143,9 +143,10 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient {
|
| }
|
|
|
| void ResetGestureDetection() {
|
| - CancelActiveTouchSequence();
|
| + gesture_provider_->ResetDetection();
|
| gestures_.clear();
|
| }
|
| +
|
| bool CancelActiveTouchSequence() {
|
| if (!gesture_provider_->current_down_event())
|
| return false;
|
| @@ -273,12 +274,12 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient {
|
| base::TimeTicks event_time = base::TimeTicks::Now();
|
| const float scroll_to_x = kFakeCoordX + 100;
|
| const float scroll_to_y = kFakeCoordY + 100;
|
| - int motion_event_id = 0;
|
| + int motion_event_id = 3;
|
| int motion_event_flags = EF_SHIFT_DOWN | EF_CAPS_LOCK_DOWN;
|
|
|
| MockMotionEvent event =
|
| ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| event.set_flags(motion_event_flags);
|
|
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| @@ -289,7 +290,7 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient {
|
| scroll_to_x,
|
| scroll_to_y);
|
| event.SetToolType(0, MotionEvent::TOOL_TYPE_FINGER);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| event.set_flags(motion_event_flags);
|
|
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| @@ -314,7 +315,7 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient {
|
| event = ObtainMotionEvent(
|
| event_time + kOneSecond, end_action_type, scroll_to_x, scroll_to_y);
|
| event.SetToolType(0, MotionEvent::TOOL_TYPE_FINGER);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
|
|
| gesture_provider_->OnTouchEvent(event);
|
| EXPECT_FALSE(gesture_provider_->IsScrollInProgress());
|
| @@ -415,7 +416,7 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient {
|
| // Verify that a DOWN followed shortly by an UP will trigger a single tap.
|
| TEST_F(GestureProviderTest, GestureTap) {
|
| base::TimeTicks event_time = base::TimeTicks::Now();
|
| - int motion_event_id = 0;
|
| + int motion_event_id = 6;
|
| int motion_event_flags = EF_CONTROL_DOWN | EF_ALT_DOWN;
|
|
|
| gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
|
| @@ -423,7 +424,7 @@ TEST_F(GestureProviderTest, GestureTap) {
|
| MockMotionEvent event =
|
| ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
|
| event.SetToolType(0, MotionEvent::TOOL_TYPE_FINGER);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| event.set_flags(motion_event_flags);
|
|
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| @@ -438,7 +439,7 @@ TEST_F(GestureProviderTest, GestureTap) {
|
| event = ObtainMotionEvent(event_time + kOneMicrosecond,
|
| MotionEvent::ACTION_UP);
|
| event.SetToolType(0, MotionEvent::TOOL_TYPE_FINGER);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| event.set_flags(motion_event_flags);
|
|
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| @@ -458,14 +459,14 @@ TEST_F(GestureProviderTest, GestureTap) {
|
| // a ET_GESTURE_TAP_UNCONFIRMED event if double-tap is enabled.
|
| TEST_F(GestureProviderTest, GestureTapWithDelay) {
|
| base::TimeTicks event_time = base::TimeTicks::Now();
|
| - int motion_event_id = 0;
|
| + int motion_event_id = 6;
|
| int motion_event_flags = EF_CONTROL_DOWN | EF_ALT_DOWN | EF_CAPS_LOCK_DOWN;
|
|
|
| gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
|
|
|
| MockMotionEvent event =
|
| ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| event.set_flags(motion_event_flags);
|
|
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| @@ -478,7 +479,7 @@ TEST_F(GestureProviderTest, GestureTapWithDelay) {
|
|
|
| event = ObtainMotionEvent(event_time + kOneMicrosecond,
|
| MotionEvent::ACTION_UP);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| event.set_flags(motion_event_flags);
|
|
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| @@ -490,22 +491,25 @@ TEST_F(GestureProviderTest, GestureTapWithDelay) {
|
| EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
|
| EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
|
| GetMostRecentGestureEvent().details.bounding_box());
|
| + EXPECT_EQ(event.GetEventTime(), GetMostRecentGestureEvent().time);
|
|
|
| EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_TAP));
|
| RunTasksAndWait(GetDoubleTapTimeout());
|
| EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_TAP));
|
| + EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
|
| + EXPECT_EQ(event.GetEventTime(), GetMostRecentGestureEvent().time);
|
| }
|
|
|
| // Verify that a DOWN followed by a MOVE will trigger fling (but not LONG).
|
| TEST_F(GestureProviderTest, GestureFlingAndCancelLongPress) {
|
| base::TimeTicks event_time = TimeTicks::Now();
|
| base::TimeDelta delta_time = kDeltaTimeForFlingSequences;
|
| - int motion_event_id = 0;
|
| + int motion_event_id = 6;
|
| int motion_event_flags = EF_ALT_DOWN;
|
|
|
| MockMotionEvent event =
|
| ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| event.set_flags(motion_event_flags);
|
|
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| @@ -518,7 +522,7 @@ TEST_F(GestureProviderTest, GestureFlingAndCancelLongPress) {
|
| MotionEvent::ACTION_MOVE,
|
| kFakeCoordX * 10,
|
| kFakeCoordY * 10);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| event.set_flags(motion_event_flags);
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
|
|
| @@ -526,7 +530,7 @@ TEST_F(GestureProviderTest, GestureFlingAndCancelLongPress) {
|
| MotionEvent::ACTION_UP,
|
| kFakeCoordX * 10,
|
| kFakeCoordY * 10);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| event.set_flags(motion_event_flags);
|
|
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| @@ -563,11 +567,11 @@ TEST_F(GestureProviderTest, ScrollEventActionCancelSequence) {
|
| TEST_F(GestureProviderTest, FlingEventSequence) {
|
| base::TimeTicks event_time = base::TimeTicks::Now();
|
| base::TimeDelta delta_time = kDeltaTimeForFlingSequences;
|
| - int motion_event_id = 0;
|
| + int motion_event_id = 6;
|
|
|
| MockMotionEvent event =
|
| ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
|
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
|
|
| @@ -575,7 +579,7 @@ TEST_F(GestureProviderTest, FlingEventSequence) {
|
| MotionEvent::ACTION_MOVE,
|
| kFakeCoordX * 5,
|
| kFakeCoordY * 5);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
|
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| EXPECT_TRUE(gesture_provider_->IsScrollInProgress());
|
| @@ -597,7 +601,7 @@ TEST_F(GestureProviderTest, FlingEventSequence) {
|
| MotionEvent::ACTION_UP,
|
| kFakeCoordX * 10,
|
| kFakeCoordY * 10);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
|
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| EXPECT_FALSE(gesture_provider_->IsScrollInProgress());
|
| @@ -609,7 +613,7 @@ TEST_F(GestureProviderTest, FlingEventSequence) {
|
| << "FlingStart should have the time of the ACTION_UP";
|
| }
|
|
|
| -TEST_F(GestureProviderTest, GestureCancelledWhenWindowFocusLost) {
|
| +TEST_F(GestureProviderTest, GestureCancelledOnCancelEvent) {
|
| const base::TimeTicks event_time = TimeTicks::Now();
|
|
|
| MockMotionEvent event =
|
| @@ -622,7 +626,8 @@ TEST_F(GestureProviderTest, GestureCancelledWhenWindowFocusLost) {
|
| EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SHOW_PRESS));
|
| EXPECT_EQ(ET_GESTURE_LONG_PRESS, GetMostRecentGestureEventType());
|
|
|
| - // The long press triggers window focus loss by opening a context menu.
|
| + // A cancellation event may be triggered for a number of reasons, e.g.,
|
| + // from a context-menu-triggering long press resulting in loss of focus.
|
| EXPECT_TRUE(CancelActiveTouchSequence());
|
| EXPECT_FALSE(HasDownEvent());
|
|
|
| @@ -632,6 +637,28 @@ TEST_F(GestureProviderTest, GestureCancelledWhenWindowFocusLost) {
|
| EXPECT_FALSE(gesture_provider_->OnTouchEvent(event));
|
| }
|
|
|
| +TEST_F(GestureProviderTest, GestureCancelledOnDetectionReset) {
|
| + const base::TimeTicks event_time = TimeTicks::Now();
|
| +
|
| + MockMotionEvent event =
|
| + ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
|
| + EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| + EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
|
| +
|
| + RunTasksAndWait(GetLongPressTimeout() + GetShowPressTimeout() +
|
| + kOneMicrosecond);
|
| + EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SHOW_PRESS));
|
| + EXPECT_EQ(ET_GESTURE_LONG_PRESS, GetMostRecentGestureEventType());
|
| +
|
| + ResetGestureDetection();
|
| + EXPECT_FALSE(HasDownEvent());
|
| +
|
| + // A final ACTION_UP should have no effect.
|
| + event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
|
| + MotionEvent::ACTION_UP);
|
| + EXPECT_FALSE(gesture_provider_->OnTouchEvent(event));
|
| +}
|
| +
|
| TEST_F(GestureProviderTest, NoTapAfterScrollBegins) {
|
| base::TimeTicks event_time = base::TimeTicks::Now();
|
|
|
| @@ -841,7 +868,7 @@ TEST_F(GestureProviderTest, FractionalScroll) {
|
|
|
| // Now move up slowly, mostly vertically but with a (fractional) bit of
|
| // horizontal motion.
|
| - for(int i = 1; i <= 10; i++) {
|
| + for (int i = 1; i <= 10; i++) {
|
| event = ObtainMotionEvent(event_time + kOneMicrosecond * i,
|
| MotionEvent::ACTION_MOVE,
|
| kFakeCoordX + delta_x * i,
|
| @@ -898,7 +925,7 @@ TEST_F(GestureProviderTest, ScrollBeginValues) {
|
| EXPECT_TRUE(gesture_provider_->IsScrollInProgress());
|
|
|
| const GestureEventData* scroll_begin_gesture = GetActiveScrollBeginEvent();
|
| - ASSERT_TRUE(!!scroll_begin_gesture);
|
| + ASSERT_TRUE(scroll_begin_gesture);
|
| EXPECT_EQ(delta_x, scroll_begin_gesture->details.scroll_x_hint());
|
| EXPECT_EQ(delta_y, scroll_begin_gesture->details.scroll_y_hint());
|
| }
|
| @@ -985,7 +1012,7 @@ TEST_F(GestureProviderTest, GestureLongPressDoesNotPreventScrolling) {
|
|
|
| TEST_F(GestureProviderTest, NoGestureLongPressDuringDoubleTap) {
|
| base::TimeTicks event_time = base::TimeTicks::Now();
|
| - int motion_event_id = 0;
|
| + int motion_event_id = 6;
|
|
|
| MockMotionEvent event = ObtainMotionEvent(
|
| event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
|
| @@ -1018,7 +1045,7 @@ TEST_F(GestureProviderTest, NoGestureLongPressDuringDoubleTap) {
|
| MotionEvent::ACTION_MOVE,
|
| kFakeCoordX + 20,
|
| kFakeCoordY + 20);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
|
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| EXPECT_EQ(ET_GESTURE_PINCH_BEGIN, GetMostRecentGestureEventType());
|
| @@ -1030,7 +1057,7 @@ TEST_F(GestureProviderTest, NoGestureLongPressDuringDoubleTap) {
|
| MotionEvent::ACTION_UP,
|
| kFakeCoordX,
|
| kFakeCoordY + 1);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType());
|
| EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
|
| @@ -1464,7 +1491,7 @@ TEST_F(GestureProviderTest, PinchZoom) {
|
| const float touch_slop = GetTouchSlop();
|
| const float raw_offset_x = 3.2f;
|
| const float raw_offset_y = 4.3f;
|
| - int motion_event_id = 0;
|
| + int motion_event_id = 6;
|
|
|
| gesture_provider_->SetDoubleTapSupportForPageEnabled(false);
|
| gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
|
| @@ -1475,7 +1502,7 @@ TEST_F(GestureProviderTest, PinchZoom) {
|
|
|
| MockMotionEvent event =
|
| ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| event.SetRawOffset(raw_offset_x, raw_offset_y);
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
|
| @@ -1496,7 +1523,7 @@ TEST_F(GestureProviderTest, PinchZoom) {
|
| kFakeCoordY,
|
| secondary_coord_x,
|
| secondary_coord_y);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| event.SetRawOffset(raw_offset_x, raw_offset_y);
|
|
|
| gesture_provider_->OnTouchEvent(event);
|
| @@ -1513,7 +1540,7 @@ TEST_F(GestureProviderTest, PinchZoom) {
|
| kFakeCoordY,
|
| secondary_coord_x,
|
| secondary_coord_y);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| event.SetRawOffset(raw_offset_x, raw_offset_y);
|
|
|
| // Toggling double-tap support should not take effect until the next sequence.
|
| @@ -1548,7 +1575,7 @@ TEST_F(GestureProviderTest, PinchZoom) {
|
| kFakeCoordY,
|
| secondary_coord_x,
|
| secondary_coord_y);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
|
|
| // Toggling double-tap support should not take effect until the next sequence.
|
| gesture_provider_->SetDoubleTapSupportForPageEnabled(true);
|
| @@ -1572,7 +1599,7 @@ TEST_F(GestureProviderTest, PinchZoom) {
|
| kFakeCoordY,
|
| secondary_coord_x,
|
| secondary_coord_y);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
|
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
|
| @@ -1811,14 +1838,14 @@ TEST_F(GestureProviderTest, GesturesCancelledAfterLongPressCausesLostFocus) {
|
| // gesture sequence cancellation.
|
| TEST_F(GestureProviderTest, CancelActiveTouchSequence) {
|
| base::TimeTicks event_time = base::TimeTicks::Now();
|
| - int motion_event_id = 0;
|
| + int motion_event_id = 6;
|
|
|
| EXPECT_FALSE(CancelActiveTouchSequence());
|
| EXPECT_EQ(0U, GetReceivedGestureCount());
|
|
|
| MockMotionEvent event =
|
| ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
|
| - event.set_id(++motion_event_id);
|
| + event.SetPrimaryPointerId(motion_event_id);
|
| EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
|
| EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
|
| EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
|
| @@ -2126,13 +2153,14 @@ TEST_F(GestureProviderTest, TwoFingerTap) {
|
|
|
| EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetReceivedGesture(0).type());
|
| EXPECT_EQ(ET_GESTURE_SCROLL_BEGIN, GetReceivedGesture(1).type());
|
| - EXPECT_EQ(ET_GESTURE_TWO_FINGER_TAP, GetReceivedGesture(2).type());
|
| - EXPECT_EQ(3U, GetReceivedGestureCount());
|
| + EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetReceivedGesture(2).type());
|
| + EXPECT_EQ(ET_GESTURE_TWO_FINGER_TAP, GetReceivedGesture(3).type());
|
| + EXPECT_EQ(4U, GetReceivedGestureCount());
|
|
|
| EXPECT_EQ(kMockTouchRadius * 2,
|
| - GetReceivedGesture(2).details.first_finger_width());
|
| + GetReceivedGesture(3).details.first_finger_width());
|
| EXPECT_EQ(kMockTouchRadius * 2,
|
| - GetReceivedGesture(2).details.first_finger_height());
|
| + GetReceivedGesture(3).details.first_finger_height());
|
| }
|
|
|
| // Test preventing a two finger tap via finger movement.
|
| @@ -2171,7 +2199,11 @@ TEST_F(GestureProviderTest, TwoFingerTapCancelledByFingerMovement) {
|
|
|
| EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetReceivedGesture(0).type());
|
| EXPECT_EQ(ET_GESTURE_SCROLL_BEGIN, GetReceivedGesture(1).type());
|
| - EXPECT_EQ(2U, GetReceivedGestureCount());
|
| + EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetReceivedGesture(2).type());
|
| + EXPECT_FLOAT_EQ((scaled_touch_slop + 0.1) / 2,
|
| + GetReceivedGesture(2).details.scroll_x());
|
| + EXPECT_EQ(0, GetReceivedGesture(2).details.scroll_y());
|
| + EXPECT_EQ(3U, GetReceivedGestureCount());
|
| }
|
|
|
| // Test preventing a two finger tap by waiting too long before releasing the
|
|
|