| Index: ui/events/gesture_detection/filtered_gesture_provider_unittest.cc
|
| diff --git a/ui/events/gesture_detection/filtered_gesture_provider_unittest.cc b/ui/events/gesture_detection/filtered_gesture_provider_unittest.cc
|
| index 4514946ccc7eca5d3e5398f927d65554f417baac..d3e10f637dbea59549228a9054b4e446e27da460 100644
|
| --- a/ui/events/gesture_detection/filtered_gesture_provider_unittest.cc
|
| +++ b/ui/events/gesture_detection/filtered_gesture_provider_unittest.cc
|
| @@ -22,63 +22,133 @@ class FilteredGestureProviderTest : public GestureProviderClient,
|
| base::MessageLoopForUI message_loop_;
|
| };
|
|
|
| -TEST_F(FilteredGestureProviderTest, TouchDidGenerateScroll) {
|
| +// Single touch drag test: After touch-start, the moved_beyond_slop_region bit
|
| +// should stay unset as long as the touch movement is confined to the slop
|
| +// region. Once the touch moves beyond the slop region, the bit should remain
|
| +// set until (incl) touch-end.
|
| +TEST_F(FilteredGestureProviderTest, TouchMovedBeyondSlopRegion_SingleTouch) {
|
| GestureProvider::Config config;
|
| FilteredGestureProvider provider(config, this);
|
|
|
| const float kSlopRegion = config.gesture_detector_config.touch_slop;
|
|
|
| test::MockMotionEvent event;
|
| +
|
| event.set_event_time(base::TimeTicks::Now());
|
| event.PressPoint(0, 0);
|
| auto result = provider.OnTouchEvent(event);
|
| EXPECT_TRUE(result.succeeded);
|
| - EXPECT_FALSE(result.did_generate_scroll);
|
| + EXPECT_FALSE(result.moved_beyond_slop_region);
|
|
|
| event.MovePoint(0, kSlopRegion / 2.f, 0);
|
| result = provider.OnTouchEvent(event);
|
| EXPECT_TRUE(result.succeeded);
|
| - EXPECT_FALSE(result.did_generate_scroll);
|
| + EXPECT_FALSE(result.moved_beyond_slop_region);
|
|
|
| - // Exceeding the slop should triggering scrolling and be reflected in the API.
|
| event.MovePoint(0, kSlopRegion * 2.f, 0);
|
| result = provider.OnTouchEvent(event);
|
| EXPECT_TRUE(result.succeeded);
|
| - EXPECT_TRUE(result.did_generate_scroll);
|
| + EXPECT_TRUE(result.moved_beyond_slop_region);
|
|
|
| - // No movement should indicate no scrolling.
|
| event.MovePoint(0, kSlopRegion * 2.f, 0);
|
| result = provider.OnTouchEvent(event);
|
| EXPECT_TRUE(result.succeeded);
|
| - EXPECT_FALSE(result.did_generate_scroll);
|
| + EXPECT_TRUE(result.moved_beyond_slop_region);
|
|
|
| - // Nonzero movement should reflect scrolling after exceeding the slop region.
|
| event.MovePoint(0, 0, 0);
|
| result = provider.OnTouchEvent(event);
|
| EXPECT_TRUE(result.succeeded);
|
| - EXPECT_TRUE(result.did_generate_scroll);
|
| + EXPECT_TRUE(result.moved_beyond_slop_region);
|
|
|
| - // Ending a touch with no fling should not indicate scrolling.
|
| event.ReleasePoint();
|
| result = provider.OnTouchEvent(event);
|
| EXPECT_TRUE(result.succeeded);
|
| - EXPECT_FALSE(result.did_generate_scroll);
|
| + EXPECT_TRUE(result.moved_beyond_slop_region);
|
|
|
| - // Ending a touch with a fling *should* indicate scrolling.
|
| + // A new touch sequence should reset the bit.
|
| base::TimeTicks time = base::TimeTicks::Now();
|
| event.PressPoint(0, 0);
|
| event.set_event_time(time);
|
| - ASSERT_TRUE(provider.OnTouchEvent(event).succeeded);
|
| + result = provider.OnTouchEvent(event);
|
| + ASSERT_TRUE(result.succeeded);
|
| + EXPECT_FALSE(result.moved_beyond_slop_region);
|
|
|
| + // A fling should set the bit right away.
|
| time += base::TimeDelta::FromMilliseconds(10);
|
| event.MovePoint(0, kSlopRegion * 50, 0);
|
| event.set_event_time(time);
|
| - ASSERT_TRUE(provider.OnTouchEvent(event).succeeded);
|
| + result = provider.OnTouchEvent(event);
|
| + ASSERT_TRUE(result.succeeded);
|
| + EXPECT_TRUE(result.moved_beyond_slop_region);
|
|
|
| event.ReleasePoint();
|
| result = provider.OnTouchEvent(event);
|
| EXPECT_TRUE(result.succeeded);
|
| - EXPECT_TRUE(result.did_generate_scroll);
|
| + EXPECT_TRUE(result.moved_beyond_slop_region);
|
| +}
|
| +
|
| +// Multi-touch: The moved_beyond_slop_region bit should stay unset as long as
|
| +// all touch-points are stationary, and should be set after (including) the
|
| +// first movement in any touch-point.
|
| +TEST_F(FilteredGestureProviderTest, TouchMovedBeyondSlopRegion_MultiTouch) {
|
| + GestureProvider::Config config;
|
| + FilteredGestureProvider provider(config, this);
|
| +
|
| + const float kSlopRegion = config.gesture_detector_config.touch_slop;
|
| +
|
| + test::MockMotionEvent event;
|
| +
|
| + float x = 0;
|
| + const float y0 = 0;
|
| + const float y1 = kSlopRegion * 10.f;
|
| + const float y2 = kSlopRegion * 20.f;
|
| +
|
| + event.set_event_time(base::TimeTicks::Now());
|
| + event.PressPoint(x, y0);
|
| + auto result = provider.OnTouchEvent(event);
|
| + EXPECT_TRUE(result.succeeded);
|
| + EXPECT_FALSE(result.moved_beyond_slop_region);
|
| +
|
| + event.PressPoint(x, y1);
|
| + result = provider.OnTouchEvent(event);
|
| + EXPECT_TRUE(result.succeeded);
|
| + EXPECT_FALSE(result.moved_beyond_slop_region);
|
| +
|
| + event.PressPoint(x, y2);
|
| + result = provider.OnTouchEvent(event);
|
| + EXPECT_TRUE(result.succeeded);
|
| + EXPECT_FALSE(result.moved_beyond_slop_region);
|
| +
|
| + for (float multiplier = 0.5f; multiplier < 3.f; multiplier += 2.f) {
|
| + x = kSlopRegion * multiplier;
|
| +
|
| + event.MovePoint(0, x, y0);
|
| + result = provider.OnTouchEvent(event);
|
| + EXPECT_TRUE(result.succeeded);
|
| + EXPECT_TRUE(result.moved_beyond_slop_region);
|
| +
|
| + event.MovePoint(0, x, y0);
|
| + result = provider.OnTouchEvent(event);
|
| + EXPECT_TRUE(result.succeeded);
|
| + EXPECT_TRUE(result.moved_beyond_slop_region);
|
| +
|
| + event.MovePoint(2, x, y2);
|
| + result = provider.OnTouchEvent(event);
|
| + EXPECT_TRUE(result.succeeded);
|
| + EXPECT_TRUE(result.moved_beyond_slop_region);
|
| +
|
| + event.MovePoint(1, x, y1);
|
| + result = provider.OnTouchEvent(event);
|
| + EXPECT_TRUE(result.succeeded);
|
| + EXPECT_TRUE(result.moved_beyond_slop_region);
|
| + }
|
| +
|
| + for(int i = 0; i < 3; i++) {
|
| + event.ReleasePoint();
|
| + result = provider.OnTouchEvent(event);
|
| + EXPECT_TRUE(result.succeeded);
|
| + EXPECT_TRUE(result.moved_beyond_slop_region);
|
| + }
|
| }
|
|
|
| } // namespace ui
|
|
|