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

Unified Diff: ui/touch_selection/touch_selection_controller_unittest.cc

Issue 1087893003: Support longpress drag selection (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Code review Created 5 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: ui/touch_selection/touch_selection_controller_unittest.cc
diff --git a/ui/touch_selection/touch_selection_controller_unittest.cc b/ui/touch_selection/touch_selection_controller_unittest.cc
index c78a5d55c3b19f519d522d891e9f3727aa7fb07f..8f1ff8a65f6b3da39f293897dbe0343c739ee8e3 100644
--- a/ui/touch_selection/touch_selection_controller_unittest.cc
+++ b/ui/touch_selection/touch_selection_controller_unittest.cc
@@ -43,6 +43,21 @@ class MockTouchHandleDrawable : public TouchHandleDrawable {
} // namespace
+class TouchSelectionControllerTestApi {
+ public:
+ explicit TouchSelectionControllerTestApi(TouchSelectionController* controller)
+ : controller_(controller) {}
+ ~TouchSelectionControllerTestApi() {}
+
+ bool GetStartVisible() const { return controller_->GetStartVisible(); }
+ bool GetEndVisible() const { return controller_->GetEndVisible(); }
+
+ private:
+ TouchSelectionController* controller_;
+
+ DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerTestApi);
+};
+
class TouchSelectionControllerTest : public testing::Test,
public TouchSelectionControllerClient {
public:
@@ -149,7 +164,8 @@ class TouchSelectionControllerTest : public testing::Test,
}
void OnLongPressEvent() {
- ASSERT_FALSE(controller().WillHandleLongPressEvent(kIgnoredPoint));
+ ASSERT_FALSE(controller().WillHandleLongPressEvent(base::TimeTicks(),
+ kIgnoredPoint));
}
void OnTapEvent() {
@@ -877,6 +893,8 @@ TEST_F(TouchSelectionControllerTest, Animation) {
}
TEST_F(TouchSelectionControllerTest, TemporarilyHidden) {
+ TouchSelectionControllerTestApi test_controller(&controller());
+
OnTapEvent();
controller().OnSelectionEditable(true);
@@ -885,20 +903,27 @@ TEST_F(TouchSelectionControllerTest, TemporarilyHidden) {
bool visible = true;
ChangeInsertion(insertion_rect, visible);
EXPECT_FALSE(GetAndResetNeedsAnimate());
+ EXPECT_TRUE(test_controller.GetStartVisible());
+ EXPECT_TRUE(test_controller.GetEndVisible());
controller().SetTemporarilyHidden(true);
EXPECT_TRUE(GetAndResetNeedsAnimate());
+ EXPECT_FALSE(test_controller.GetStartVisible());
+ EXPECT_FALSE(test_controller.GetEndVisible());
visible = false;
ChangeInsertion(insertion_rect, visible);
EXPECT_FALSE(GetAndResetNeedsAnimate());
+ EXPECT_FALSE(test_controller.GetStartVisible());
visible = true;
ChangeInsertion(insertion_rect, visible);
EXPECT_FALSE(GetAndResetNeedsAnimate());
+ EXPECT_FALSE(test_controller.GetStartVisible());
controller().SetTemporarilyHidden(false);
EXPECT_TRUE(GetAndResetNeedsAnimate());
+ EXPECT_TRUE(test_controller.GetStartVisible());
}
TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) {
@@ -1017,12 +1042,108 @@ TEST_F(TouchSelectionControllerTest, HandlesShowOnLongPressInsideRect) {
EXPECT_THAT(GetAndResetEvents(), IsEmpty());
// A point outside the rect should not be handled.
- EXPECT_FALSE(controller().WillHandleLongPressEvent(outer_point));
+ EXPECT_FALSE(
+ controller().WillHandleLongPressEvent(base::TimeTicks(), outer_point));
EXPECT_THAT(GetAndResetEvents(), IsEmpty());
// A point inside the rect should be handled.
- EXPECT_TRUE(controller().WillHandleLongPressEvent(inner_point));
+ EXPECT_TRUE(
+ controller().WillHandleLongPressEvent(base::TimeTicks(), inner_point));
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
+}
+
+TEST_F(TouchSelectionControllerTest, LongPressDrag) {
+ TouchSelectionControllerTestApi test_controller(&controller());
+
+ gfx::RectF start_rect(-50, 0, 0, 10);
+ gfx::RectF end_rect(50, 0, 0, 10);
+ bool visible = true;
+
+ // Start a touch sequence.
+ MockMotionEvent event;
+ EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0)));
+
+ // Activate a longpress-triggered selection.
+ OnLongPressEvent();
+ ChangeSelection(start_rect, visible, end_rect, visible);
EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
+ EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
+
+ // The handles should remain invisible while the touch release and longpress
+ // drag gesture are pending.
+ EXPECT_FALSE(test_controller.GetStartVisible());
+ EXPECT_FALSE(test_controller.GetEndVisible());
+
+ // The selection coordinates should reflect the drag movement.
+ gfx::PointF fixed_offset = start_rect.CenterPoint();
+ gfx::PointF end_offset = end_rect.CenterPoint();
+ EXPECT_TRUE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 0)));
+ EXPECT_THAT(GetAndResetEvents(), IsEmpty());
+
+ EXPECT_TRUE(
+ controller().WillHandleTouchEvent(event.MovePoint(0, 0, kDefaulTapSlop)));
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED));
+ EXPECT_EQ(fixed_offset, GetLastSelectionStart());
+ EXPECT_EQ(end_offset, GetLastSelectionEnd());
+
+ // Movement after the start of drag will be relative to the moved endpoint.
+ EXPECT_TRUE(controller().WillHandleTouchEvent(
+ event.MovePoint(0, 0, 2 * kDefaulTapSlop)));
+ EXPECT_TRUE(GetAndResetSelectionMoved());
+ EXPECT_EQ(end_offset + gfx::Vector2dF(0, kDefaulTapSlop),
+ GetLastSelectionEnd());
+
+ EXPECT_TRUE(controller().WillHandleTouchEvent(
+ event.MovePoint(0, kDefaulTapSlop, 2 * kDefaulTapSlop)));
+ EXPECT_TRUE(GetAndResetSelectionMoved());
+ EXPECT_EQ(end_offset + gfx::Vector2dF(kDefaulTapSlop, kDefaulTapSlop),
+ GetLastSelectionEnd());
+
+ EXPECT_TRUE(controller().WillHandleTouchEvent(
+ event.MovePoint(0, 2 * kDefaulTapSlop, 2 * kDefaulTapSlop)));
+ EXPECT_TRUE(GetAndResetSelectionMoved());
+ EXPECT_EQ(end_offset + gfx::Vector2dF(2 * kDefaulTapSlop, kDefaulTapSlop),
+ GetLastSelectionEnd());
+
+ // The handles should still be hidden.
+ EXPECT_FALSE(test_controller.GetStartVisible());
+ EXPECT_FALSE(test_controller.GetEndVisible());
+
+ // Releasing the touch sequence should end the drag and show the handles.
+ EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint()));
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED));
+ EXPECT_TRUE(test_controller.GetStartVisible());
+ EXPECT_TRUE(test_controller.GetEndVisible());
+}
+
+TEST_F(TouchSelectionControllerTest, LongPressNoDrag) {
+ TouchSelectionControllerTestApi test_controller(&controller());
+
+ gfx::RectF start_rect(-50, 0, 0, 10);
+ gfx::RectF end_rect(50, 0, 0, 10);
+ bool visible = true;
+
+ // Start a touch sequence.
+ MockMotionEvent event;
+ EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0)));
+
+ // Activate a longpress-triggered selection.
+ OnLongPressEvent();
+ ChangeSelection(start_rect, visible, end_rect, visible);
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
+ EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
+
+ // The handles should remain invisible while the touch release and longpress
+ // drag gesture are pending.
+ EXPECT_FALSE(test_controller.GetStartVisible());
+ EXPECT_FALSE(test_controller.GetEndVisible());
+
+ // If no drag movement occurs, the handles should reappear after the touch
+ // is released.
+ EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint()));
+ EXPECT_THAT(GetAndResetEvents(), IsEmpty());
+ EXPECT_TRUE(test_controller.GetStartVisible());
+ EXPECT_TRUE(test_controller.GetEndVisible());
}
} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698