OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/events/gesture_detection/gesture_provider.h" | 5 #include "ui/events/gesture_detection/gesture_provider.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
(...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
938 kFakeCoordY + delta_y); | 938 kFakeCoordY + delta_y); |
939 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); | 939 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
940 EXPECT_TRUE(gesture_provider_->IsScrollInProgress()); | 940 EXPECT_TRUE(gesture_provider_->IsScrollInProgress()); |
941 | 941 |
942 const GestureEventData* scroll_begin_gesture = GetActiveScrollBeginEvent(); | 942 const GestureEventData* scroll_begin_gesture = GetActiveScrollBeginEvent(); |
943 ASSERT_TRUE(scroll_begin_gesture); | 943 ASSERT_TRUE(scroll_begin_gesture); |
944 EXPECT_EQ(delta_x, scroll_begin_gesture->details.scroll_x_hint()); | 944 EXPECT_EQ(delta_x, scroll_begin_gesture->details.scroll_x_hint()); |
945 EXPECT_EQ(delta_y, scroll_begin_gesture->details.scroll_y_hint()); | 945 EXPECT_EQ(delta_y, scroll_begin_gesture->details.scroll_y_hint()); |
946 } | 946 } |
947 | 947 |
| 948 // The following three tests verify that slop regions are checked for |
| 949 // one and two finger scrolls. Three-finger tap doesn't exist, so, |
| 950 // no slop region check is needed for three-finger scrolls. |
| 951 |
| 952 TEST_F(GestureProviderTest, SlopRegionCheckOnOneFingerScroll) { |
| 953 EnableTwoFingerTap(kMaxTwoFingerTapSeparation, base::TimeDelta()); |
| 954 const float scaled_touch_slop = GetTouchSlop(); |
| 955 |
| 956 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 957 |
| 958 MockMotionEvent event = |
| 959 ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN, 0, 0); |
| 960 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 961 |
| 962 // Move within slop region. |
| 963 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_MOVE, 0, |
| 964 scaled_touch_slop / 2); |
| 965 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 966 |
| 967 // Exceed slop region. |
| 968 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_MOVE, 0, |
| 969 2 * scaled_touch_slop); |
| 970 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 971 |
| 972 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_UP, 0, |
| 973 2 * scaled_touch_slop); |
| 974 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 975 |
| 976 EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetReceivedGesture(0).type()); |
| 977 EXPECT_EQ(ET_GESTURE_SCROLL_BEGIN, GetReceivedGesture(1).type()); |
| 978 EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetReceivedGesture(2).type()); |
| 979 EXPECT_EQ(ET_GESTURE_SCROLL_END, GetReceivedGesture(3).type()); |
| 980 EXPECT_EQ(4U, GetReceivedGestureCount()); |
| 981 } |
| 982 |
| 983 TEST_F(GestureProviderTest, SlopRegionCheckOnTwoFingerScroll) { |
| 984 EnableTwoFingerTap(kMaxTwoFingerTapSeparation, base::TimeDelta()); |
| 985 const float scaled_touch_slop = GetTouchSlop(); |
| 986 |
| 987 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 988 |
| 989 MockMotionEvent event = |
| 990 ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN, 0, 0); |
| 991 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 992 |
| 993 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_POINTER_DOWN, 0, 0, |
| 994 kMaxTwoFingerTapSeparation / 2, 0); |
| 995 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 996 |
| 997 // Move within slop region: two-finger tap happens. |
| 998 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_MOVE, 0, |
| 999 scaled_touch_slop / 2, |
| 1000 kMaxTwoFingerTapSeparation / 2, 0); |
| 1001 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 1002 |
| 1003 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_POINTER_UP, 0, |
| 1004 scaled_touch_slop / 2, |
| 1005 kMaxTwoFingerTapSeparation / 2, 0); |
| 1006 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 1007 |
| 1008 // Exceed slop region: scroll. |
| 1009 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_POINTER_DOWN, 0, |
| 1010 scaled_touch_slop / 2, |
| 1011 kMaxTwoFingerTapSeparation / 2, 0); |
| 1012 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 1013 |
| 1014 event = ObtainMotionEvent( |
| 1015 event_time, MotionEvent::ACTION_MOVE, 0, scaled_touch_slop / 2, |
| 1016 kMaxTwoFingerTapSeparation / 2, 2 * scaled_touch_slop); |
| 1017 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 1018 |
| 1019 event = ObtainMotionEvent( |
| 1020 event_time, MotionEvent::ACTION_POINTER_UP, 0, scaled_touch_slop / 2, |
| 1021 kMaxTwoFingerTapSeparation / 2, 2 * scaled_touch_slop); |
| 1022 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 1023 |
| 1024 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_UP, 0, |
| 1025 scaled_touch_slop / 2); |
| 1026 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 1027 |
| 1028 EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetReceivedGesture(0).type()); |
| 1029 EXPECT_EQ(ET_GESTURE_TWO_FINGER_TAP, GetReceivedGesture(1).type()); |
| 1030 EXPECT_EQ(ET_GESTURE_SCROLL_BEGIN, GetReceivedGesture(2).type()); |
| 1031 EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetReceivedGesture(3).type()); |
| 1032 EXPECT_EQ(ET_GESTURE_SCROLL_END, GetReceivedGesture(4).type()); |
| 1033 EXPECT_EQ(5U, GetReceivedGestureCount()); |
| 1034 } |
| 1035 |
| 1036 TEST_F(GestureProviderTest, NoSlopRegionCheckOnThreeFingerScroll) { |
| 1037 EnableTwoFingerTap(kMaxTwoFingerTapSeparation, base::TimeDelta()); |
| 1038 const float scaled_touch_slop = GetTouchSlop(); |
| 1039 |
| 1040 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 1041 |
| 1042 MockMotionEvent event = |
| 1043 ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN, 0, 0); |
| 1044 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 1045 |
| 1046 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_POINTER_DOWN, 0, 0, |
| 1047 kMaxTwoFingerTapSeparation / 2, 0); |
| 1048 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 1049 |
| 1050 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_POINTER_DOWN, 0, 0, |
| 1051 kMaxTwoFingerTapSeparation / 2, 0, |
| 1052 2 * kMaxTwoFingerTapSeparation, 0); |
| 1053 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 1054 |
| 1055 // Move within slop region, three-finger scroll always happens. |
| 1056 event = ObtainMotionEvent( |
| 1057 event_time, MotionEvent::ACTION_MOVE, 0, scaled_touch_slop / 2, |
| 1058 kMaxTwoFingerTapSeparation / 2, 0, 2 * kMaxTwoFingerTapSeparation, 0); |
| 1059 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
| 1060 |
| 1061 EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetReceivedGesture(0).type()); |
| 1062 EXPECT_EQ(ET_GESTURE_SCROLL_BEGIN, GetReceivedGesture(1).type()); |
| 1063 EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetReceivedGesture(2).type()); |
| 1064 EXPECT_EQ(3U, GetReceivedGestureCount()); |
| 1065 } |
| 1066 |
948 TEST_F(GestureProviderTest, LongPressAndTapCancelledWhenScrollBegins) { | 1067 TEST_F(GestureProviderTest, LongPressAndTapCancelledWhenScrollBegins) { |
949 base::TimeTicks event_time = base::TimeTicks::Now(); | 1068 base::TimeTicks event_time = base::TimeTicks::Now(); |
950 | 1069 |
951 MockMotionEvent event = | 1070 MockMotionEvent event = |
952 ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN); | 1071 ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN); |
953 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); | 1072 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
954 event = ObtainMotionEvent(event_time + kOneMicrosecond, | 1073 event = ObtainMotionEvent(event_time + kOneMicrosecond, |
955 MotionEvent::ACTION_MOVE, | 1074 MotionEvent::ACTION_MOVE, |
956 kFakeCoordX * 5, | 1075 kFakeCoordX * 5, |
957 kFakeCoordY * 5); | 1076 kFakeCoordY * 5); |
(...skipping 1194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2152 | 2271 |
2153 event = ObtainMotionEvent(event_time, | 2272 event = ObtainMotionEvent(event_time, |
2154 MotionEvent::ACTION_POINTER_UP, | 2273 MotionEvent::ACTION_POINTER_UP, |
2155 0, | 2274 0, |
2156 0, | 2275 0, |
2157 kMaxTwoFingerTapSeparation, | 2276 kMaxTwoFingerTapSeparation, |
2158 0); | 2277 0); |
2159 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); | 2278 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
2160 | 2279 |
2161 EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetReceivedGesture(0).type()); | 2280 EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetReceivedGesture(0).type()); |
2162 EXPECT_EQ(ET_GESTURE_SCROLL_BEGIN, GetReceivedGesture(1).type()); | 2281 EXPECT_EQ(ET_GESTURE_TWO_FINGER_TAP, GetReceivedGesture(1).type()); |
2163 EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetReceivedGesture(2).type()); | 2282 EXPECT_EQ(2U, GetReceivedGestureCount()); |
2164 EXPECT_EQ(ET_GESTURE_TWO_FINGER_TAP, GetReceivedGesture(3).type()); | |
2165 EXPECT_EQ(4U, GetReceivedGestureCount()); | |
2166 | |
2167 EXPECT_EQ(kMockTouchRadius * 2, | 2283 EXPECT_EQ(kMockTouchRadius * 2, |
2168 GetReceivedGesture(3).details.first_finger_width()); | 2284 GetReceivedGesture(1).details.first_finger_width()); |
2169 EXPECT_EQ(kMockTouchRadius * 2, | 2285 EXPECT_EQ(kMockTouchRadius * 2, |
2170 GetReceivedGesture(3).details.first_finger_height()); | 2286 GetReceivedGesture(1).details.first_finger_height()); |
2171 } | 2287 } |
2172 | 2288 |
2173 // Test preventing a two finger tap via finger movement. | 2289 // Test preventing a two finger tap via finger movement. |
2174 TEST_F(GestureProviderTest, TwoFingerTapCancelledByFingerMovement) { | 2290 TEST_F(GestureProviderTest, TwoFingerTapCancelledByFingerMovement) { |
2175 EnableTwoFingerTap(kMaxTwoFingerTapSeparation, base::TimeDelta()); | 2291 EnableTwoFingerTap(kMaxTwoFingerTapSeparation, base::TimeDelta()); |
2176 const float scaled_touch_slop = GetTouchSlop(); | 2292 const float scaled_touch_slop = GetTouchSlop(); |
2177 base::TimeTicks event_time = base::TimeTicks::Now(); | 2293 base::TimeTicks event_time = base::TimeTicks::Now(); |
2178 | 2294 |
2179 MockMotionEvent event = ObtainMotionEvent( | 2295 MockMotionEvent event = ObtainMotionEvent( |
2180 event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY); | 2296 event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY); |
2181 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); | 2297 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
2182 | 2298 |
2183 event = ObtainMotionEvent(event_time, | 2299 event = ObtainMotionEvent(event_time, |
2184 MotionEvent::ACTION_POINTER_DOWN, | 2300 MotionEvent::ACTION_POINTER_DOWN, |
2185 kFakeCoordX, | 2301 kFakeCoordX, |
2186 kFakeCoordY, | 2302 kFakeCoordY, |
2187 kFakeCoordX, | 2303 kFakeCoordX, |
2188 kFakeCoordY); | 2304 kFakeCoordY); |
2189 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); | 2305 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
2190 | 2306 |
2191 event = ObtainMotionEvent(event_time, | 2307 event = ObtainMotionEvent( |
2192 MotionEvent::ACTION_MOVE, | 2308 event_time, MotionEvent::ACTION_MOVE, kFakeCoordX, kFakeCoordY, |
2193 kFakeCoordX, | 2309 kFakeCoordX + 2 * scaled_touch_slop + 2, kFakeCoordY); |
2194 kFakeCoordY, | |
2195 kFakeCoordX + scaled_touch_slop + 0.1, | |
2196 kFakeCoordY); | |
2197 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); | 2310 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
2198 | 2311 |
2199 event = ObtainMotionEvent(event_time, | 2312 event = ObtainMotionEvent(event_time, |
2200 MotionEvent::ACTION_POINTER_UP, | 2313 MotionEvent::ACTION_POINTER_UP, |
2201 kFakeCoordX, | 2314 kFakeCoordX, |
2202 kFakeCoordY, | 2315 kFakeCoordY, |
2203 kFakeCoordX, | 2316 kFakeCoordX, |
2204 kFakeCoordY); | 2317 kFakeCoordY); |
2205 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); | 2318 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
2206 | 2319 |
2207 EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetReceivedGesture(0).type()); | 2320 EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetReceivedGesture(0).type()); |
2208 EXPECT_EQ(ET_GESTURE_SCROLL_BEGIN, GetReceivedGesture(1).type()); | 2321 EXPECT_EQ(ET_GESTURE_SCROLL_BEGIN, GetReceivedGesture(1).type()); |
2209 EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetReceivedGesture(2).type()); | 2322 EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetReceivedGesture(2).type()); |
2210 EXPECT_FLOAT_EQ((scaled_touch_slop + 0.1) / 2, | 2323 // d_x = 2 * scaled_touch_slop + 2, |
| 2324 // d_focus_x = scaled_touch_slop + 1, |
| 2325 // touch_slop / event.GetPointerCount() is deducted from first scroll, |
| 2326 // scroll_x = scaled_touch_slop + 1 - scaled_touch_slop / 2 |
| 2327 EXPECT_FLOAT_EQ(scaled_touch_slop / 2 + 1, |
2211 GetReceivedGesture(2).details.scroll_x()); | 2328 GetReceivedGesture(2).details.scroll_x()); |
2212 EXPECT_EQ(0, GetReceivedGesture(2).details.scroll_y()); | 2329 EXPECT_EQ(0, GetReceivedGesture(2).details.scroll_y()); |
2213 EXPECT_EQ(3U, GetReceivedGestureCount()); | 2330 EXPECT_EQ(3U, GetReceivedGestureCount()); |
2214 } | 2331 } |
2215 | 2332 |
2216 // Test preventing a two finger tap by waiting too long before releasing the | 2333 // Test preventing a two finger tap by waiting too long before releasing the |
2217 // secondary pointer. | 2334 // secondary pointer. |
2218 TEST_F(GestureProviderTest, TwoFingerTapCancelledByDelay) { | 2335 TEST_F(GestureProviderTest, TwoFingerTapCancelledByDelay) { |
2219 base::TimeDelta two_finger_tap_timeout = kOneSecond; | 2336 base::TimeDelta two_finger_tap_timeout = kOneSecond; |
2220 EnableTwoFingerTap(kMaxTwoFingerTapSeparation, two_finger_tap_timeout); | 2337 EnableTwoFingerTap(kMaxTwoFingerTapSeparation, two_finger_tap_timeout); |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2643 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, | 2760 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, |
2644 kFakeCoordY + GetTouchSlop() / 2); | 2761 kFakeCoordY + GetTouchSlop() / 2); |
2645 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); | 2762 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
2646 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_UP); | 2763 event = ObtainMotionEvent(event_time, MotionEvent::ACTION_UP); |
2647 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); | 2764 EXPECT_TRUE(gesture_provider_->OnTouchEvent(event)); |
2648 EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType()); | 2765 EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType()); |
2649 EXPECT_EQ(1, GetMostRecentGestureEvent().details.tap_count()); | 2766 EXPECT_EQ(1, GetMostRecentGestureEvent().details.tap_count()); |
2650 } | 2767 } |
2651 | 2768 |
2652 } // namespace ui | 2769 } // namespace ui |
OLD | NEW |