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

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: Rebase 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 46c2f4f9cd1481aec32ecef38cea46a99522b079..045d3493fd0f2934856593d1ae732b16c7416036 100644
--- a/ui/touch_selection/touch_selection_controller_unittest.cc
+++ b/ui/touch_selection/touch_selection_controller_unittest.cc
@@ -10,6 +10,7 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/test/motion_event_test_utils.h"
+using base::TimeTicks;
using testing::ElementsAre;
using testing::IsEmpty;
using ui::test::MockMotionEvent;
@@ -148,7 +149,7 @@ class TouchSelectionControllerTest : public testing::Test,
}
void Animate() {
- base::TimeTicks now = base::TimeTicks::Now();
+ TimeTicks now = TimeTicks::Now();
while (needs_animate_) {
needs_animate_ = controller_->Animate(now);
now += base::TimeDelta::FromMilliseconds(16);
@@ -285,7 +286,7 @@ TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) {
// Long-pressing should show the handle even if the editable region is empty.
insertion_rect.Offset(2, -2);
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(TimeTicks::Now(), insertion_rect.bottom_left());
controller().OnSelectionEmpty(true);
ChangeInsertion(insertion_rect, visible);
EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN));
@@ -343,7 +344,7 @@ TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) {
}
TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) {
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(TimeTicks::Now(), gfx::PointF());
controller().OnSelectionEditable(true);
gfx::RectF start_rect(5, 5, 0, 10);
@@ -526,7 +527,7 @@ TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) {
EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart());
// Pressing shouldn't reset the active insertion point.
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(TimeTicks::Now(), gfx::PointF());
controller().OnSelectionEmpty(true);
event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
EXPECT_TRUE(controller().WillHandleTouchEvent(event));
@@ -549,7 +550,7 @@ TEST_F(TouchSelectionControllerTest, SelectionBasic) {
ChangeSelection(start_rect, visible, end_rect, visible);
EXPECT_EQ(gfx::PointF(), GetLastEventStart());
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left());
ChangeSelection(start_rect, visible, end_rect, visible);
EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
@@ -571,7 +572,7 @@ TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) {
gfx::RectF end_rect(50, 5, 0, 10);
bool visible = true;
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left());
ChangeSelection(start_rect, visible, end_rect, visible);
EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
@@ -580,7 +581,7 @@ TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) {
// A long press triggering a new selection should re-send the SELECTION_SHOWN
// event notification.
start_rect.Offset(10, 10);
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left());
ChangeSelection(start_rect, visible, end_rect, visible);
EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
@@ -589,7 +590,7 @@ TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) {
TEST_F(TouchSelectionControllerTest, SelectionDragged) {
base::TimeTicks event_time = base::TimeTicks::Now();
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(event_time, gfx::PointF());
// The touch sequence should not be handled if selection is not active.
MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
@@ -647,7 +648,7 @@ TEST_F(TouchSelectionControllerTest, SelectionDragged) {
TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) {
base::TimeTicks event_time = base::TimeTicks::Now();
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(event_time, gfx::PointF());
float line_height = 10.f;
gfx::RectF start_rect(0, 0, 0, line_height);
@@ -685,7 +686,7 @@ TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) {
TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) {
base::TimeTicks event_time = base::TimeTicks::Now();
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(event_time, gfx::PointF());
float line_height = 10.f;
gfx::RectF start_rect(50, line_height, 0, line_height);
@@ -804,7 +805,7 @@ TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) {
TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) {
base::TimeTicks event_time = base::TimeTicks::Now();
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(event_time, gfx::PointF());
float small_line_height = 1.f;
float large_line_height = 50.f;
@@ -876,20 +877,27 @@ TEST_F(TouchSelectionControllerTest, TemporarilyHidden) {
bool visible = true;
ChangeInsertion(insertion_rect, visible);
EXPECT_FALSE(GetAndResetNeedsAnimate());
+ EXPECT_TRUE(controller().GetStartVisibleForTesting());
+ EXPECT_TRUE(controller().GetEndVisibleForTesting());
controller().SetTemporarilyHidden(true);
EXPECT_TRUE(GetAndResetNeedsAnimate());
+ EXPECT_FALSE(controller().GetStartVisibleForTesting());
+ EXPECT_FALSE(controller().GetEndVisibleForTesting());
visible = false;
ChangeInsertion(insertion_rect, visible);
EXPECT_FALSE(GetAndResetNeedsAnimate());
+ EXPECT_FALSE(controller().GetStartVisibleForTesting());
visible = true;
ChangeInsertion(insertion_rect, visible);
EXPECT_FALSE(GetAndResetNeedsAnimate());
+ EXPECT_FALSE(controller().GetStartVisibleForTesting());
controller().SetTemporarilyHidden(false);
EXPECT_TRUE(GetAndResetNeedsAnimate());
+ EXPECT_TRUE(controller().GetStartVisibleForTesting());
}
TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) {
@@ -897,7 +905,7 @@ TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) {
gfx::RectF end_rect(50, 5, 0, 10);
bool visible = true;
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left());
ChangeSelection(start_rect, visible, end_rect, visible);
EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
@@ -918,13 +926,13 @@ TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) {
bool visible = true;
// Tap-triggered selections should not be allowed.
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left());
controller().OnTapEvent();
ChangeSelection(start_rect, visible, end_rect, visible);
EXPECT_THAT(GetAndResetEvents(), IsEmpty());
// Subsequent longpress selections will be allowed.
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left());
ChangeSelection(start_rect, visible, end_rect, visible);
EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
@@ -947,7 +955,7 @@ TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) {
EXPECT_EQ(gfx::PointF(), GetLastEventStart());
// A longpress should have no immediate effect.
- controller().OnLongPressEvent();
+ controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left());
// Now explicitly allow showing from the previously supplied bounds.
controller().AllowShowingFromCurrentSelection();
@@ -976,4 +984,59 @@ TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) {
EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart());
}
+TEST_F(TouchSelectionControllerTest, LongPressDrag) {
mfomitchev 2015/05/13 20:52:25 Can we also add a test that the handles reappear i
jdduke (slow) 2015/05/14 18:29:27 Done.
+ 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.
+ controller().OnLongPressEvent(event.GetEventTime(), gfx::PointF());
+ 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(controller().GetStartVisibleForTesting());
+ EXPECT_FALSE(controller().GetEndVisibleForTesting());
+
+ // 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, 10)));
mfomitchev 2015/05/13 20:52:25 Can we use kDefaulTapSlop instead of ints here?
jdduke (slow) 2015/05/14 18:29:27 Done.
+ 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, 20)));
+ EXPECT_TRUE(GetAndResetSelectionMoved());
+ EXPECT_EQ(end_offset + gfx::Vector2dF(0, 10), GetLastSelectionEnd());
+
+ EXPECT_TRUE(controller().WillHandleTouchEvent(event.MovePoint(0, 10, 20)));
+ EXPECT_TRUE(GetAndResetSelectionMoved());
+ EXPECT_EQ(end_offset + gfx::Vector2dF(10, 10), GetLastSelectionEnd());
+
+ EXPECT_TRUE(controller().WillHandleTouchEvent(event.MovePoint(0, 20, 20)));
+ EXPECT_TRUE(GetAndResetSelectionMoved());
+ EXPECT_EQ(end_offset + gfx::Vector2dF(20, 10), GetLastSelectionEnd());
+
+ // The handles should still be hidden.
+ EXPECT_FALSE(controller().GetStartVisibleForTesting());
+ EXPECT_FALSE(controller().GetEndVisibleForTesting());
+
+ // 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(controller().GetStartVisibleForTesting());
+ EXPECT_TRUE(controller().GetEndVisibleForTesting());
+}
+
} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698