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 73e11323534ffe527ac3ae5cce9af3ba8ea182c6..cabfd04c2bb1cad8a816df6069624cbfc568e72e 100644 |
--- a/ui/touch_selection/touch_selection_controller_unittest.cc |
+++ b/ui/touch_selection/touch_selection_controller_unittest.cc |
@@ -1321,4 +1321,122 @@ TEST_F(TouchSelectionControllerTest, RectBetweenBounds) { |
EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); |
} |
+TEST_F(TouchSelectionControllerTest, SelectionNoOrientationChangeWhenSwapped) { |
+ TouchSelectionControllerTestApi test_controller(&controller()); |
+ base::TimeTicks event_time = base::TimeTicks::Now(); |
+ OnLongPressEvent(); |
+ |
+ float line_height = 10.f; |
+ gfx::RectF start_rect(50, line_height, 0, line_height); |
+ gfx::RectF end_rect(100, line_height, 0, line_height); |
+ bool visible = true; |
+ ChangeSelection(start_rect, visible, end_rect, visible); |
+ EXPECT_THAT(GetAndResetEvents(), |
+ ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); |
+ EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
+ EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
+ TouchHandleOrientation::LEFT); |
+ EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
+ TouchHandleOrientation::RIGHT); |
+ |
+ SetDraggingEnabled(true); |
+ |
+ // Simulate moving the base, not triggering a swap of points. |
+ MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
+ start_rect.x(), start_rect.bottom()); |
+ EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); |
+ |
+ gfx::RectF offset_rect = end_rect; |
+ offset_rect.Offset(gfx::Vector2dF(-10, 0)); |
+ ChangeSelection(offset_rect, visible, end_rect, visible); |
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
+ EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
+ TouchHandleOrientation::LEFT); |
+ EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
+ TouchHandleOrientation::RIGHT); |
+ |
+ event_time += base::TimeDelta::FromMilliseconds(2 * kDefaultTapTimeoutMs); |
+ event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, |
+ offset_rect.x(), offset_rect.bottom()); |
+ EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); |
+ EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
+ TouchHandleOrientation::LEFT); |
+ EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
+ TouchHandleOrientation::RIGHT); |
+ |
+ // Simulate moving the base, triggering a swap of points. |
+ event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, |
+ offset_rect.x(), offset_rect.bottom()); |
+ EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); |
+ |
+ offset_rect.Offset(gfx::Vector2dF(20, 0)); |
+ ChangeSelection(end_rect, visible, offset_rect, visible); |
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
+ EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
+ TouchHandleOrientation::LEFT); |
+ EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
+ TouchHandleOrientation::LEFT); |
+ |
+ event_time += base::TimeDelta::FromMilliseconds(2 * kDefaultTapTimeoutMs); |
+ event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, |
+ offset_rect.x(), offset_rect.bottom()); |
+ EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); |
+ EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
+ TouchHandleOrientation::LEFT); |
+ EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
+ TouchHandleOrientation::RIGHT); |
+ |
+ // Simulate moving the anchor, not triggering a swap of points. |
+ event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, |
+ offset_rect.x(), offset_rect.bottom()); |
+ EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); |
+ |
+ offset_rect.Offset(gfx::Vector2dF(-5, 0)); |
+ ChangeSelection(end_rect, visible, offset_rect, visible); |
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
+ EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
+ TouchHandleOrientation::LEFT); |
+ EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
+ TouchHandleOrientation::RIGHT); |
+ |
+ event_time += base::TimeDelta::FromMilliseconds(2 * kDefaultTapTimeoutMs); |
+ event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, |
+ offset_rect.x(), offset_rect.bottom()); |
+ EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); |
+ EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
+ TouchHandleOrientation::LEFT); |
+ EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
+ TouchHandleOrientation::RIGHT); |
+ |
+ // Simulate moving the anchor, triggering a swap of points. |
+ event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, |
+ offset_rect.x(), offset_rect.bottom()); |
+ EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); |
+ |
+ offset_rect.Offset(gfx::Vector2dF(-15, 0)); |
+ ChangeSelection(offset_rect, visible, end_rect, visible); |
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
+ EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
+ TouchHandleOrientation::RIGHT); |
+ EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
+ TouchHandleOrientation::RIGHT); |
+ |
+ event_time += base::TimeDelta::FromMilliseconds(2 * kDefaultTapTimeoutMs); |
+ event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, |
+ offset_rect.x(), offset_rect.bottom()); |
+ EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); |
+ EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
+ TouchHandleOrientation::LEFT); |
+ EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
+ TouchHandleOrientation::RIGHT); |
+} |
+ |
} // namespace ui |