Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(446)

Side by Side Diff: ui/events/gesture_detection/gesture_provider_unittest.cc

Issue 2058723003: Slop region check for multi-finger scroll (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/events/gesture_detection/gesture_provider.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « ui/events/gesture_detection/gesture_provider.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698