summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ui/views/controls/textfield/native_textfield_views.cc5
-rw-r--r--ui/views/controls/textfield/native_textfield_views_unittest.cc64
2 files changed, 58 insertions, 11 deletions
diff --git a/ui/views/controls/textfield/native_textfield_views.cc b/ui/views/controls/textfield/native_textfield_views.cc
index d02c71f..c4cae0e 100644
--- a/ui/views/controls/textfield/native_textfield_views.cc
+++ b/ui/views/controls/textfield/native_textfield_views.cc
@@ -180,6 +180,11 @@ void NativeTextfieldViews::OnGestureEvent(ui::GestureEvent* event) {
OnAfterUserAction();
event->SetHandled();
break;
+ case ui::ET_GESTURE_SCROLL_END:
+ case ui::ET_SCROLL_FLING_START:
+ CreateTouchSelectionControllerAndNotifyIt();
+ event->SetHandled();
+ break;
case ui::ET_GESTURE_TAP:
if (event->details().tap_count() == 1) {
CreateTouchSelectionControllerAndNotifyIt();
diff --git a/ui/views/controls/textfield/native_textfield_views_unittest.cc b/ui/views/controls/textfield/native_textfield_views_unittest.cc
index b003cce..df0b24e 100644
--- a/ui/views/controls/textfield/native_textfield_views_unittest.cc
+++ b/ui/views/controls/textfield/native_textfield_views_unittest.cc
@@ -99,9 +99,10 @@ class GetTextHelper {
// Convenience to make constructing a GestureEvent simpler.
class GestureEventForTest : public ui::GestureEvent {
public:
- GestureEventForTest(ui::EventType type, int x, int y, int flags)
- : GestureEvent(type, x, y, flags, base::TimeDelta(),
- ui::GestureEventDetails(type, 0.0f, 0.0f), 0) {
+ GestureEventForTest(ui::EventType type, int x, int y, float delta_x,
+ float delta_y)
+ : GestureEvent(type, x, y, 0, base::TimeDelta(),
+ ui::GestureEventDetails(type, delta_x, delta_y), 0) {
}
private:
@@ -1836,9 +1837,7 @@ TEST_F(NativeTextfieldViewsTest, TouchSelectionAndDraggingTest) {
CommandLine::ForCurrentProcess()->AppendSwitch(switches::kEnableTouchEditing);
// Tapping on the textfield should turn on the TouchSelectionController.
- ui::GestureEvent tap(ui::ET_GESTURE_TAP, eventX, eventY, 0, base::TimeDelta(),
- ui::GestureEventDetails(ui::ET_GESTURE_TAP, 1.0f, 0.0f),
- 0);
+ GestureEventForTest tap(ui::ET_GESTURE_TAP, eventX, eventY, 1.0f, 0.0f);
textfield_view_->OnGestureEvent(&tap);
EXPECT_TRUE(GetTouchSelectionController());
@@ -1848,9 +1847,11 @@ TEST_F(NativeTextfieldViewsTest, TouchSelectionAndDraggingTest) {
// With touch editing enabled, long press should not show context menu.
// Instead, select word and invoke TouchSelectionController.
- GestureEventForTest tap_down(ui::ET_GESTURE_TAP_DOWN, eventX, eventY, 0);
+ GestureEventForTest tap_down(ui::ET_GESTURE_TAP_DOWN, eventX, eventY, 0.0f,
+ 0.0f);
textfield_view_->OnGestureEvent(&tap_down);
- GestureEventForTest long_press(ui::ET_GESTURE_LONG_PRESS, eventX, eventY, 0);
+ GestureEventForTest long_press(ui::ET_GESTURE_LONG_PRESS, eventX, eventY,
+ 0.0f, 0.0f);
textfield_view_->OnGestureEvent(&long_press);
EXPECT_STR_EQ("hello", textfield_->GetSelectedText());
EXPECT_TRUE(GetTouchSelectionController());
@@ -1870,11 +1871,52 @@ TEST_F(NativeTextfieldViewsTest, TouchSelectionAndDraggingTest) {
textfield_view_->OnGestureEvent(&tap_down);
// Create a new long press event since the previous one is not marked handled.
- GestureEventForTest long_press2(ui::ET_GESTURE_LONG_PRESS, eventX, eventY, 0);
+ GestureEventForTest long_press2(ui::ET_GESTURE_LONG_PRESS, eventX, eventY,
+ 0.0f, 0.0f);
textfield_view_->OnGestureEvent(&long_press2);
EXPECT_STR_EQ("hello", textfield_->GetSelectedText());
EXPECT_FALSE(GetTouchSelectionController());
}
+
+TEST_F(NativeTextfieldViewsTest, TouchScrubbingSelection) {
+ InitTextfield(Textfield::STYLE_DEFAULT);
+ textfield_->SetText(ASCIIToUTF16("hello world"));
+ EXPECT_FALSE(GetTouchSelectionController());
+
+ CommandLine::ForCurrentProcess()->AppendSwitch(switches::kEnableTouchEditing);
+
+ // Simulate touch-scrubbing.
+ int scrubbing_start = GetCursorPositionX(1);
+ int scrubbing_end = GetCursorPositionX(6);
+
+ GestureEventForTest tap_down(ui::ET_GESTURE_TAP_DOWN, scrubbing_start, 0,
+ 0.0f, 0.0f);
+ textfield_view_->OnGestureEvent(&tap_down);
+
+ GestureEventForTest tap_cancel(ui::ET_GESTURE_TAP_CANCEL, scrubbing_start, 0,
+ 0.0f, 0.0f);
+ textfield_view_->OnGestureEvent(&tap_cancel);
+
+ GestureEventForTest scroll_begin(ui::ET_GESTURE_SCROLL_BEGIN, scrubbing_start,
+ 0, 0.0f, 0.0f);
+ textfield_view_->OnGestureEvent(&scroll_begin);
+
+ GestureEventForTest scroll_update(ui::ET_GESTURE_SCROLL_UPDATE, scrubbing_end,
+ 0, scrubbing_end - scrubbing_start, 0.0f);
+ textfield_view_->OnGestureEvent(&scroll_update);
+
+ GestureEventForTest scroll_end(ui::ET_GESTURE_SCROLL_END, scrubbing_end, 0,
+ 0.0f, 0.0f);
+ textfield_view_->OnGestureEvent(&scroll_end);
+
+ GestureEventForTest end(ui::ET_GESTURE_END, scrubbing_end, 0, 0.0f, 0.0f);
+ textfield_view_->OnGestureEvent(&end);
+
+ // In the end, part of text should have been selected and handles should have
+ // appeared.
+ EXPECT_STR_EQ("ello ", textfield_->GetSelectedText());
+ EXPECT_TRUE(GetTouchSelectionController());
+}
#endif
// Long_Press gesture in NativeTextfieldViews can initiate a drag and drop now.
@@ -1891,8 +1933,8 @@ TEST_F(NativeTextfieldViewsTest, TestLongPressInitiatesDragDrop) {
switches::kEnableTouchDragDrop);
// Create a long press event in the selected region should start a drag.
- GestureEventForTest long_press(ui::ET_GESTURE_LONG_PRESS,
- kStringPoint.x(), kStringPoint.y(), 0);
+ GestureEventForTest long_press(ui::ET_GESTURE_LONG_PRESS, kStringPoint.x(),
+ kStringPoint.y(), 0.0f, 0.0f);
textfield_view_->OnGestureEvent(&long_press);
EXPECT_TRUE(textfield_view_->CanStartDragForView(NULL,
kStringPoint, kStringPoint));