| 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 6093e1799805c22f4a28c9f63b5e2ca19a3e6730..4f7d42bd1db9d3fa1680c26f0b5f730816f99c17 100644
|
| --- a/ui/touch_selection/touch_selection_controller_unittest.cc
|
| +++ b/ui/touch_selection/touch_selection_controller_unittest.cc
|
| @@ -145,16 +145,16 @@ class TouchSelectionControllerTest : public testing::Test,
|
| }
|
|
|
| void OnLongPressEvent() {
|
| - controller().HandleLongPressEvent(base::TimeTicks(),
|
| - kIgnoredPoint);
|
| + ASSERT_FALSE(controller().WillHandleLongPressEvent(base::TimeTicks(),
|
| + kIgnoredPoint));
|
| }
|
|
|
| void OnTapEvent() {
|
| - controller().HandleTapEvent(kIgnoredPoint, 1);
|
| + ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint, 1));
|
| }
|
|
|
| void OnDoubleTapEvent() {
|
| - controller().HandleTapEvent(kIgnoredPoint, 2);
|
| + ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint, 2));
|
| }
|
|
|
| void Animate() {
|
| @@ -240,7 +240,20 @@ TEST_F(TouchSelectionControllerTest, InsertionBasic) {
|
| gfx::RectF insertion_rect(5, 5, 0, 10);
|
| bool visible = true;
|
|
|
| + // Insertion handles are not shown until automatic showing is enabled.
|
| + ChangeInsertion(insertion_rect, visible);
|
| + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED));
|
| + EXPECT_EQ(gfx::PointF(), GetLastEventStart());
|
| OnTapEvent();
|
| +
|
| + // Insertion handles are not shown until the selection region is
|
| + // marked editable.
|
| + ChangeInsertion(insertion_rect, visible);
|
| + EXPECT_THAT(GetAndResetEvents(), IsEmpty());
|
| + EXPECT_EQ(gfx::PointF(), GetLastEventStart());
|
| +
|
| + OnTapEvent();
|
| + controller().OnSelectionEditable(true);
|
| ChangeInsertion(insertion_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN));
|
| EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart());
|
| @@ -257,11 +270,89 @@ TEST_F(TouchSelectionControllerTest, InsertionBasic) {
|
|
|
| ClearInsertion();
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(INSERTION_HANDLE_CLEARED));
|
| + ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED));
|
| +}
|
| +
|
| +TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) {
|
| + gfx::RectF insertion_rect(5, 5, 0, 10);
|
| + bool visible = true;
|
| + OnTapEvent();
|
| + controller().OnSelectionEditable(true);
|
| +
|
| + ChangeInsertion(insertion_rect, visible);
|
| + EXPECT_THAT(GetAndResetEvents(),
|
| + ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
|
| + EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart());
|
| +
|
| + controller().OnSelectionEditable(false);
|
| + EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED));
|
| +}
|
| +
|
| +TEST_F(TouchSelectionControllerTest, InsertionEmptyEditable) {
|
| + gfx::RectF insertion_rect(5, 5, 0, 10);
|
| + bool visible = true;
|
| + controller().OnSelectionEditable(true);
|
| +
|
| + // Taps on an empty editable region should be ignored
|
| + OnTapEvent();
|
| + controller().OnSelectionEmpty(true);
|
| + ChangeInsertion(insertion_rect, visible);
|
| + EXPECT_EQ(gfx::PointF(), GetLastEventStart());
|
| +
|
| + // Once the region becomes non-empty, taps should show the insertion handle.
|
| + OnTapEvent();
|
| + controller().OnSelectionEmpty(false);
|
| + ChangeInsertion(insertion_rect, visible);
|
| + EXPECT_THAT(GetAndResetEvents(),
|
| + ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
|
| + EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart());
|
| +
|
| + // Reset the selection.
|
| + controller().HideAndDisallowShowingAutomatically();
|
| + EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED));
|
| +
|
| + // Long-pressing should show the handle even if the editable region is empty.
|
| + insertion_rect.Offset(2, -2);
|
| + OnLongPressEvent();
|
| + controller().OnSelectionEmpty(true);
|
| + ChangeInsertion(insertion_rect, visible);
|
| + EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN));
|
| + EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart());
|
| +
|
| + // Single Tap on an empty edit field should clear insertion handle.
|
| + OnTapEvent();
|
| + EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED));
|
| +}
|
| +
|
| +TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) {
|
| + gfx::RectF insertion_rect(5, 5, 0, 10);
|
| + bool visible = true;
|
| +
|
| + // Simulate the user tapping an empty text field.
|
| + OnTapEvent();
|
| + controller().OnSelectionEditable(true);
|
| + controller().OnSelectionEmpty(true);
|
| + ChangeInsertion(insertion_rect, visible);
|
| + EXPECT_EQ(gfx::PointF(), GetLastEventStart());
|
| +
|
| + // Simulate the cursor moving while a user is typing.
|
| + insertion_rect.Offset(10, 0);
|
| + controller().OnSelectionEmpty(false);
|
| + ChangeInsertion(insertion_rect, visible);
|
| + EXPECT_EQ(gfx::PointF(), GetLastEventStart());
|
| +
|
| + // If the user taps the *same* position as the cursor at the end of the text
|
| + // entry, the handle should appear.
|
| + OnTapEvent();
|
| + ChangeInsertion(insertion_rect, visible);
|
| + EXPECT_THAT(GetAndResetEvents(),
|
| + ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
|
| + EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart());
|
| }
|
|
|
| TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) {
|
| OnLongPressEvent();
|
| + controller().OnSelectionEditable(true);
|
|
|
| gfx::RectF start_rect(5, 5, 0, 10);
|
| gfx::RectF end_rect(50, 5, 0, 10);
|
| @@ -269,7 +360,7 @@ TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) {
|
|
|
| ChangeInsertion(start_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(INSERTION_HANDLE_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
|
| EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
|
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| @@ -282,7 +373,7 @@ TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) {
|
| ElementsAre(SELECTION_HANDLES_CLEARED, INSERTION_HANDLE_SHOWN));
|
| EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart());
|
|
|
| - ClearInsertion();
|
| + controller().HideAndDisallowShowingAutomatically();
|
| EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED));
|
|
|
| OnTapEvent();
|
| @@ -294,6 +385,7 @@ TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) {
|
| TEST_F(TouchSelectionControllerTest, InsertionDragged) {
|
| base::TimeTicks event_time = base::TimeTicks::Now();
|
| OnTapEvent();
|
| + controller().OnSelectionEditable(true);
|
|
|
| // The touch sequence should not be handled if insertion is not active.
|
| MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
|
| @@ -304,7 +396,7 @@ TEST_F(TouchSelectionControllerTest, InsertionDragged) {
|
| bool visible = true;
|
| ChangeInsertion(start_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(INSERTION_HANDLE_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
|
| EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
|
|
| // The touch sequence should be handled only if the drawable reports a hit.
|
| @@ -347,13 +439,14 @@ TEST_F(TouchSelectionControllerTest, InsertionDragged) {
|
| TEST_F(TouchSelectionControllerTest, InsertionDeactivatedWhileDragging) {
|
| base::TimeTicks event_time = base::TimeTicks::Now();
|
| OnTapEvent();
|
| + controller().OnSelectionEditable(true);
|
|
|
| float line_height = 10.f;
|
| gfx::RectF start_rect(10, 0, 0, line_height);
|
| bool visible = true;
|
| ChangeInsertion(start_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(INSERTION_HANDLE_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
|
| EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
|
|
| // Enable dragging so that the following ACTION_DOWN starts handle dragging.
|
| @@ -401,13 +494,14 @@ TEST_F(TouchSelectionControllerTest, InsertionDeactivatedWhileDragging) {
|
| TEST_F(TouchSelectionControllerTest, InsertionTapped) {
|
| base::TimeTicks event_time = base::TimeTicks::Now();
|
| OnTapEvent();
|
| + controller().OnSelectionEditable(true);
|
| SetDraggingEnabled(true);
|
|
|
| gfx::RectF start_rect(10, 0, 0, 10);
|
| bool visible = true;
|
| ChangeInsertion(start_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(INSERTION_HANDLE_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
|
|
|
| MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
|
| EXPECT_TRUE(controller().WillHandleTouchEvent(event));
|
| @@ -423,7 +517,8 @@ TEST_F(TouchSelectionControllerTest, InsertionTapped) {
|
| OnTapEvent();
|
| ChangeInsertion(start_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN));
|
| + ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED,
|
| + SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
|
|
|
| // No tap should be signalled if the time between DOWN and UP was too long.
|
| event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
|
| @@ -441,7 +536,8 @@ TEST_F(TouchSelectionControllerTest, InsertionTapped) {
|
| OnTapEvent();
|
| ChangeInsertion(start_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN));
|
| + ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED,
|
| + SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
|
|
|
| // No tap should be signalled if the drag was too long.
|
| event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
|
| @@ -458,7 +554,8 @@ TEST_F(TouchSelectionControllerTest, InsertionTapped) {
|
| OnTapEvent();
|
| ChangeInsertion(start_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN));
|
| + ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED,
|
| + SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
|
|
|
| // No tap should be signalled if the touch sequence is cancelled.
|
| event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
|
| @@ -472,13 +569,14 @@ TEST_F(TouchSelectionControllerTest, InsertionTapped) {
|
| TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) {
|
| base::TimeTicks event_time = base::TimeTicks::Now();
|
| OnTapEvent();
|
| + controller().OnSelectionEditable(true);
|
| SetDraggingEnabled(true);
|
|
|
| gfx::RectF anchor_rect(10, 0, 0, 10);
|
| bool visible = true;
|
| ChangeInsertion(anchor_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(INSERTION_HANDLE_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
|
| EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart());
|
|
|
| // Tapping again shouldn't reset the active insertion point.
|
| @@ -501,6 +599,7 @@ TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) {
|
|
|
| // Pressing shouldn't reset the active insertion point.
|
| OnLongPressEvent();
|
| + controller().OnSelectionEmpty(true);
|
| event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
|
| EXPECT_TRUE(controller().WillHandleTouchEvent(event));
|
| EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED));
|
| @@ -518,10 +617,14 @@ TEST_F(TouchSelectionControllerTest, SelectionBasic) {
|
| gfx::RectF end_rect(50, 5, 0, 10);
|
| bool visible = true;
|
|
|
| + // Selection events are ignored until automatic showing is enabled.
|
| + ChangeSelection(start_rect, visible, end_rect, visible);
|
| + EXPECT_EQ(gfx::PointF(), GetLastEventStart());
|
| +
|
| OnLongPressEvent();
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
|
|
| start_rect.Offset(1, 0);
|
| @@ -533,7 +636,8 @@ TEST_F(TouchSelectionControllerTest, SelectionBasic) {
|
|
|
| ClearSelection();
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_CLEARED));
|
| + ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED));
|
| + EXPECT_EQ(gfx::PointF(), GetLastEventStart());
|
| }
|
|
|
| TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTap) {
|
| @@ -544,7 +648,7 @@ TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTap) {
|
| OnDoubleTapEvent();
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
| }
|
|
|
| @@ -553,12 +657,14 @@ TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTapOnEditable) {
|
| gfx::RectF end_rect(50, 5, 0, 10);
|
| bool visible = true;
|
|
|
| + controller().OnSelectionEditable(true);
|
| +
|
| // If the user double tap selects text in an editable region, the first tap
|
| // will register insertion and the second tap selection.
|
| OnTapEvent();
|
| ChangeInsertion(start_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(INSERTION_HANDLE_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
|
|
|
| OnDoubleTapEvent();
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| @@ -585,7 +691,7 @@ TEST_F(TouchSelectionControllerTest, SelectionAllowsEmptyUpdateAfterLongPress) {
|
|
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| }
|
|
|
| TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) {
|
| @@ -596,7 +702,7 @@ TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) {
|
| OnLongPressEvent();
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
| EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd());
|
|
|
| @@ -625,7 +731,7 @@ TEST_F(TouchSelectionControllerTest, SelectionDragged) {
|
| bool visible = true;
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
|
|
| // The touch sequence should be handled only if the drawable reports a hit.
|
| @@ -682,7 +788,7 @@ TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) {
|
| bool visible = true;
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
|
|
| // The ACTION_DOWN should lock to the closest handle.
|
| @@ -721,7 +827,7 @@ TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) {
|
| bool visible = true;
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
|
|
| SetDraggingEnabled(true);
|
| @@ -842,7 +948,7 @@ TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) {
|
| bool visible = true;
|
| ChangeSelection(small_line_rect, visible, large_line_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart());
|
|
|
| // Start dragging the handle on the small line.
|
| @@ -869,6 +975,7 @@ TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) {
|
|
|
| TEST_F(TouchSelectionControllerTest, Animation) {
|
| OnTapEvent();
|
| + controller().OnSelectionEditable(true);
|
|
|
| gfx::RectF insertion_rect(5, 5, 0, 10);
|
|
|
| @@ -900,6 +1007,7 @@ TEST_F(TouchSelectionControllerTest, TemporarilyHidden) {
|
| TouchSelectionControllerTestApi test_controller(&controller());
|
|
|
| OnTapEvent();
|
| + controller().OnSelectionEditable(true);
|
|
|
| gfx::RectF insertion_rect(5, 5, 0, 10);
|
|
|
| @@ -937,7 +1045,7 @@ TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) {
|
| OnLongPressEvent();
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
|
|
| // Selection should not be cleared if the selection bounds have not changed.
|
| OnTapEvent();
|
| @@ -947,7 +1055,118 @@ TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) {
|
| OnTapEvent();
|
| ClearSelection();
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_CLEARED));
|
| + ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED));
|
| + EXPECT_EQ(gfx::PointF(), GetLastEventStart());
|
| +}
|
| +
|
| +TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) {
|
| + gfx::RectF start_rect(5, 5, 0, 10);
|
| + gfx::RectF end_rect(50, 5, 0, 10);
|
| + bool visible = true;
|
| +
|
| + // Tap-triggered selections should not be allowed.
|
| + OnLongPressEvent();
|
| + OnTapEvent();
|
| + ChangeSelection(start_rect, visible, end_rect, visible);
|
| + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED));
|
| +
|
| + // Subsequent longpress selections will be allowed.
|
| + OnLongPressEvent();
|
| + ChangeSelection(start_rect, visible, end_rect, visible);
|
| + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN));
|
| +
|
| + // Tapping again shouldn't have any effect on subsequent selection events.
|
| + OnTapEvent();
|
| + end_rect.Offset(10, 10);
|
| + ChangeSelection(start_rect, visible, end_rect, visible);
|
| + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED));
|
| + ClearSelection();
|
| + EXPECT_THAT(GetAndResetEvents(),
|
| + ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED));
|
| +}
|
| +
|
| +TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) {
|
| + gfx::RectF start_rect(5, 5, 0, 10);
|
| + gfx::RectF end_rect(50, 5, 0, 10);
|
| + bool visible = true;
|
| +
|
| + // The selection should not be activated, as it wasn't yet allowed.
|
| + ChangeSelection(start_rect, visible, end_rect, visible);
|
| + EXPECT_EQ(gfx::PointF(), GetLastEventStart());
|
| +
|
| + // A longpress should have no immediate effect.
|
| + OnLongPressEvent();
|
| +
|
| + // Now explicitly allow showing from the previously supplied bounds.
|
| + controller().AllowShowingFromCurrentSelection();
|
| + EXPECT_THAT(GetAndResetEvents(),
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| + EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
| +
|
| + // Repeated calls to show from the current selection should be ignored.
|
| + controller().AllowShowingFromCurrentSelection();
|
| + EXPECT_THAT(GetAndResetEvents(), IsEmpty());
|
| + EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
| +
|
| + // Trying to show from an empty selection will have no result.
|
| + ClearSelection();
|
| + EXPECT_THAT(GetAndResetEvents(),
|
| + ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED));
|
| + controller().AllowShowingFromCurrentSelection();
|
| + EXPECT_THAT(GetAndResetEvents(), IsEmpty());
|
| +
|
| + // Showing the insertion handle should also be supported.
|
| + controller().OnSelectionEditable(true);
|
| + controller().OnSelectionEmpty(false);
|
| + controller().HideAndDisallowShowingAutomatically();
|
| + gfx::RectF insertion_rect(5, 5, 0, 10);
|
| + ChangeInsertion(insertion_rect, visible);
|
| + controller().AllowShowingFromCurrentSelection();
|
| + EXPECT_THAT(GetAndResetEvents(),
|
| + ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
|
| + EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart());
|
| +}
|
| +
|
| +TEST_F(TouchSelectionControllerTest, HandlesShowOnTapInsideRect) {
|
| + bool visible = false;
|
| + gfx::RectF start_rect(5, 5, 0, 10);
|
| + gfx::RectF end_rect(50, 5, 0, 10);
|
| + gfx::PointF inner_point(25, 10);
|
| + gfx::PointF outer_point(100, 100);
|
| +
|
| + // Establish a selection without handles from 5 to 50 with height 10.
|
| + ChangeSelection(start_rect, visible, end_rect, visible);
|
| + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED));
|
| +
|
| + // A point outside the rect should not be handled.
|
| + EXPECT_FALSE(controller().WillHandleTapEvent(outer_point, 1));
|
| + EXPECT_THAT(GetAndResetEvents(), IsEmpty());
|
| +
|
| + // A point inside the rect should be handled.
|
| + EXPECT_TRUE(controller().WillHandleTapEvent(inner_point, 1));
|
| + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN));
|
| +}
|
| +
|
| +TEST_F(TouchSelectionControllerTest, HandlesShowOnLongPressInsideRect) {
|
| + bool visible = false;
|
| + gfx::RectF start_rect(5, 5, 0, 10);
|
| + gfx::RectF end_rect(50, 5, 0, 10);
|
| + gfx::PointF inner_point(25, 10);
|
| + gfx::PointF outer_point(100, 100);
|
| +
|
| + // Establish a selection without handles from 5 to 50 with height 10.
|
| + ChangeSelection(start_rect, visible, end_rect, visible);
|
| + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED));
|
| +
|
| + // A point outside the rect should not be handled.
|
| + EXPECT_FALSE(
|
| + controller().WillHandleLongPressEvent(base::TimeTicks(), outer_point));
|
| + EXPECT_THAT(GetAndResetEvents(), IsEmpty());
|
| +
|
| + // A point inside the rect should be handled.
|
| + EXPECT_TRUE(
|
| + controller().WillHandleLongPressEvent(base::TimeTicks(), inner_point));
|
| + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN));
|
| }
|
|
|
| TEST_F(TouchSelectionControllerTest, LongPressDrag) {
|
| @@ -966,7 +1185,7 @@ TEST_F(TouchSelectionControllerTest, LongPressDrag) {
|
| OnLongPressEvent();
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
|
|
| // The handles should remain invisible while the touch release and longpress
|
| @@ -1032,7 +1251,7 @@ TEST_F(TouchSelectionControllerTest, LongPressNoDrag) {
|
| OnLongPressEvent();
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
|
|
| // The handles should remain invisible while the touch release and longpress
|
| @@ -1064,7 +1283,7 @@ TEST_F(TouchSelectionControllerTest, NoLongPressDragIfDisabled) {
|
| OnLongPressEvent();
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
| EXPECT_TRUE(test_controller.GetStartVisible());
|
| EXPECT_TRUE(test_controller.GetEndVisible());
|
| @@ -1085,6 +1304,46 @@ TEST_F(TouchSelectionControllerTest, NoLongPressDragIfDisabled) {
|
| EXPECT_TRUE(test_controller.GetEndVisible());
|
| }
|
|
|
| +// When there is a selection on the page and long-press drag is performed
|
| +// somewhere that has nothing to select, long-press drag selector should not get
|
| +// activated so the page can scroll.
|
| +TEST_F(TouchSelectionControllerTest, LongPressDragScroll) {
|
| + EnableLongPressDragSelection();
|
| + TouchSelectionControllerTestApi test_controller(&controller());
|
| +
|
| + gfx::RectF start_rect(10, 0, 0, 10);
|
| + gfx::RectF end_rect(20, 0, 0, 10);
|
| + gfx::PointF touch_point(0, 0);
|
| + bool visible = true;
|
| + MockMotionEvent event;
|
| +
|
| + // Pre-select something.
|
| + ChangeSelection(start_rect, visible, end_rect, visible);
|
| + EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED));
|
| +
|
| + // Start the touch sequence and perform the long-press out of the existing
|
| + // selection.
|
| + EXPECT_FALSE(controller().WillHandleTouchEvent(
|
| + event.PressPoint(touch_point.x(), touch_point.y())));
|
| + OnLongPressEvent();
|
| +
|
| + // Drag down. Selection controller should not consume the touch-move event.
|
| + touch_point.Offset(0, 2 * kDefaulTapSlop);
|
| + EXPECT_FALSE(controller().WillHandleTouchEvent(
|
| + event.MovePoint(0, touch_point.x(), touch_point.y())));
|
| +
|
| + // Begin page scroll and update the selection. Selection handles should not be
|
| + // shown which means long-press drag selector is not activated.
|
| + controller().OnScrollBeginEvent();
|
| + start_rect.Offset(0, 2 * kDefaulTapSlop);
|
| + end_rect.Offset(0, 2 * kDefaulTapSlop);
|
| + ChangeSelection(start_rect, visible, end_rect, visible);
|
| + EXPECT_THAT(GetAndResetEvents(), IsEmpty());
|
| +
|
| + // Release the touch sequence.
|
| + EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint()));
|
| +}
|
| +
|
| TEST_F(TouchSelectionControllerTest, RectBetweenBounds) {
|
| gfx::RectF start_rect(5, 5, 0, 10);
|
| gfx::RectF end_rect(50, 5, 0, 10);
|
| @@ -1095,7 +1354,7 @@ TEST_F(TouchSelectionControllerTest, RectBetweenBounds) {
|
| OnLongPressEvent();
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| ASSERT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| EXPECT_EQ(gfx::RectF(5, 5, 45, 10), controller().GetRectBetweenBounds());
|
|
|
| // The result of |GetRectBetweenBounds| should be available within the
|
| @@ -1128,7 +1387,7 @@ TEST_F(TouchSelectionControllerTest, RectBetweenBounds) {
|
|
|
| ClearSelection();
|
| ASSERT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_CLEARED));
|
| + ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED));
|
| EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds());
|
| }
|
|
|
| @@ -1143,7 +1402,7 @@ TEST_F(TouchSelectionControllerTest, SelectionNoOrientationChangeWhenSwapped) {
|
| bool visible = true;
|
| ChangeSelection(start_rect, visible, end_rect, visible);
|
| EXPECT_THAT(GetAndResetEvents(),
|
| - ElementsAre(SELECTION_HANDLES_SHOWN));
|
| + ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
|
| EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
|
| EXPECT_EQ(test_controller.GetStartHandleOrientation(),
|
| TouchHandleOrientation::LEFT);
|
|
|