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

Unified Diff: ui/views/controls/textfield/textfield_unittest.cc

Issue 1865063004: views: support vertical-drag-to-end on textfields (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix test on win/linux Created 4 years, 8 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
« no previous file with comments | « ui/views/controls/textfield/textfield.cc ('k') | ui/views/style/platform_style.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/controls/textfield/textfield_unittest.cc
diff --git a/ui/views/controls/textfield/textfield_unittest.cc b/ui/views/controls/textfield/textfield_unittest.cc
index 9732010195017cfaf35717e47463c3517d6b6cf9..8e14fa064c08840e994791923b0ba10c72409426 100644
--- a/ui/views/controls/textfield/textfield_unittest.cc
+++ b/ui/views/controls/textfield/textfield_unittest.cc
@@ -39,6 +39,7 @@
#include "ui/views/controls/textfield/textfield_model.h"
#include "ui/views/controls/textfield/textfield_test_api.h"
#include "ui/views/focus/focus_manager.h"
+#include "ui/views/style/platform_style.h"
#include "ui/views/test/test_views_delegate.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/test/widget_test.h"
@@ -634,6 +635,44 @@ class TextfieldTest : public ViewsTestBase, public TextfieldController {
EXPECT_TRUE(menu->IsEnabledAt(7 /* SELECT ALL */));
}
+ void PressLeftMouseButton(int extra_flags) {
+ ui::MouseEvent click(ui::ET_MOUSE_PRESSED, mouse_position_, mouse_position_,
+ ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
+ ui::EF_LEFT_MOUSE_BUTTON | extra_flags);
+ textfield_->OnMousePressed(click);
+ }
+
+ void PressLeftMouseButton() {
+ PressLeftMouseButton(0);
+ }
+
+ void ReleaseLeftMouseButton() {
+ ui::MouseEvent release(ui::ET_MOUSE_RELEASED, mouse_position_,
+ mouse_position_, ui::EventTimeForNow(),
+ ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
+ textfield_->OnMouseReleased(release);
+ }
+
+ void ClickLeftMouseButton(int extra_flags) {
+ PressLeftMouseButton(extra_flags);
+ ReleaseLeftMouseButton();
+ }
+
+ void ClickLeftMouseButton() {
+ ClickLeftMouseButton(0);
+ }
+
+ void DragMouseTo(const gfx::Point& where) {
+ mouse_position_ = where;
+ ui::MouseEvent drag(ui::ET_MOUSE_DRAGGED, where, where,
+ ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0);
+ textfield_->OnMouseDragged(drag);
+ }
+
+ // Textfield does not listen to OnMouseMoved, so this function does not send
+ // an event when it updates the cursor position.
+ void MoveMouseTo(const gfx::Point& where) { mouse_position_ = where; }
+
// We need widget to populate wrapper class.
Widget* widget_;
@@ -654,6 +693,8 @@ class TextfieldTest : public ViewsTestBase, public TextfieldController {
int on_after_user_action_;
private:
+ // Position of the mouse for synthetic mouse events.
+ gfx::Point mouse_position_;
ui::ClipboardType copied_to_clipboard_;
std::unique_ptr<ui::test::EventGenerator> event_generator_;
DISALLOW_COPY_AND_ASSIGN(TextfieldTest);
@@ -1073,10 +1114,8 @@ TEST_F(TextfieldTest, FocusTraversalTest) {
// Test if clicking on textfield view sets the focus.
widget_->GetFocusManager()->AdvanceFocus(true);
EXPECT_EQ(3, GetFocusedView()->id());
- ui::MouseEvent click(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
- ui::EF_LEFT_MOUSE_BUTTON);
- textfield_->OnMousePressed(click);
+ MoveMouseTo(gfx::Point());
+ ClickLeftMouseButton();
EXPECT_EQ(1, GetFocusedView()->id());
// Tab/Shift+Tab should also cycle focus, not insert a tab character.
@@ -1125,33 +1164,20 @@ TEST_F(TextfieldTest, ContextMenuDisplayTest) {
TEST_F(TextfieldTest, DoubleAndTripleClickTest) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("hello world"));
- ui::MouseEvent click(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
- ui::EF_LEFT_MOUSE_BUTTON);
- ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
- ui::EF_LEFT_MOUSE_BUTTON);
- ui::MouseEvent double_click(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
- ui::EventTimeForNow(),
- ui::EF_LEFT_MOUSE_BUTTON | ui::EF_IS_DOUBLE_CLICK,
- ui::EF_LEFT_MOUSE_BUTTON);
// Test for double click.
- textfield_->OnMousePressed(click);
- textfield_->OnMouseReleased(release);
+ MoveMouseTo(gfx::Point());
+ ClickLeftMouseButton();
EXPECT_TRUE(textfield_->GetSelectedText().empty());
- textfield_->OnMousePressed(double_click);
- textfield_->OnMouseReleased(release);
+ ClickLeftMouseButton(ui::EF_IS_DOUBLE_CLICK);
EXPECT_STR_EQ("hello", textfield_->GetSelectedText());
// Test for triple click.
- textfield_->OnMousePressed(click);
- textfield_->OnMouseReleased(release);
+ ClickLeftMouseButton();
EXPECT_STR_EQ("hello world", textfield_->GetSelectedText());
// Another click should reset back to double click.
- textfield_->OnMousePressed(click);
- textfield_->OnMouseReleased(release);
+ ClickLeftMouseButton();
EXPECT_STR_EQ("hello", textfield_->GetSelectedText());
}
@@ -1162,39 +1188,70 @@ TEST_F(TextfieldTest, DragToSelect) {
const int kEnd = 500;
gfx::Point start_point(kStart, 0);
gfx::Point end_point(kEnd, 0);
- ui::MouseEvent click_a(ui::ET_MOUSE_PRESSED, start_point, start_point,
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
- ui::EF_LEFT_MOUSE_BUTTON);
- ui::MouseEvent click_b(ui::ET_MOUSE_PRESSED, end_point, end_point,
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
- ui::EF_LEFT_MOUSE_BUTTON);
- ui::MouseEvent drag_left(ui::ET_MOUSE_DRAGGED, gfx::Point(), gfx::Point(),
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0);
- ui::MouseEvent drag_right(ui::ET_MOUSE_DRAGGED, end_point, end_point,
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0);
- ui::MouseEvent release(ui::ET_MOUSE_RELEASED, end_point, end_point,
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
- ui::EF_LEFT_MOUSE_BUTTON);
- textfield_->OnMousePressed(click_a);
+
+ MoveMouseTo(start_point);
+ PressLeftMouseButton();
EXPECT_TRUE(textfield_->GetSelectedText().empty());
+
// Check that dragging left selects the beginning of the string.
- textfield_->OnMouseDragged(drag_left);
+ DragMouseTo(gfx::Point());
base::string16 text_left = textfield_->GetSelectedText();
EXPECT_STR_EQ("hello", text_left);
+
// Check that dragging right selects the rest of the string.
- textfield_->OnMouseDragged(drag_right);
+ DragMouseTo(end_point);
base::string16 text_right = textfield_->GetSelectedText();
EXPECT_STR_EQ(" world", text_right);
+
// Check that releasing in the same location does not alter the selection.
- textfield_->OnMouseReleased(release);
+ ReleaseLeftMouseButton();
EXPECT_EQ(text_right, textfield_->GetSelectedText());
+
// Check that dragging from beyond the text length works too.
- textfield_->OnMousePressed(click_b);
- textfield_->OnMouseDragged(drag_left);
- textfield_->OnMouseReleased(release);
+ MoveMouseTo(end_point);
+ PressLeftMouseButton();
+ DragMouseTo(gfx::Point());
+ ReleaseLeftMouseButton();
EXPECT_EQ(textfield_->text(), textfield_->GetSelectedText());
}
+// This test checks that dragging above the textfield selects to the beginning
+// and dragging below the textfield selects to the end, but only on platforms
+// where that is the expected behavior.
+TEST_F(TextfieldTest, DragUpOrDownSelectsToEnd) {
+ InitTextfield();
+ textfield_->SetText(ASCIIToUTF16("hello world"));
+ const base::string16 expected_up = base::ASCIIToUTF16(
+ PlatformStyle::kTextfieldDragVerticallyDragsToEnd ? "hello" : "lo");
+ const base::string16 expected_down = base::ASCIIToUTF16(
+ PlatformStyle::kTextfieldDragVerticallyDragsToEnd ? " world" : " w");
+ const int kStartX = GetCursorPositionX(5);
+ const int kDownX = GetCursorPositionX(7);
+ const int kUpX = GetCursorPositionX(3);
+ gfx::Point start_point(kStartX, 0);
+ gfx::Point down_point(kDownX, 500);
+ gfx::Point up_point(kUpX, -500);
+
+ MoveMouseTo(start_point);
+ PressLeftMouseButton();
+ DragMouseTo(up_point);
+ ReleaseLeftMouseButton();
+ EXPECT_EQ(textfield_->GetSelectedText(), expected_up);
+
+ // Click at |up_point|. This is important because drags do not count as clicks
+ // for the purpose of double-click detection, so if this test doesn't click
+ // somewhere other than |start_point| before the code below runs, the second
+ // click at |start_point| will be interpreted as a double-click instead of the
+ // start of a drag.
+ ClickLeftMouseButton();
+
+ MoveMouseTo(start_point);
+ PressLeftMouseButton();
+ DragMouseTo(down_point);
+ ReleaseLeftMouseButton();
+ EXPECT_EQ(textfield_->GetSelectedText(), expected_down);
+}
+
#if defined(OS_WIN)
TEST_F(TextfieldTest, DragAndDrop_AcceptDrop) {
InitTextfield();
@@ -1277,11 +1334,9 @@ TEST_F(TextfieldTest, DragAndDrop_InitiateDrag) {
EXPECT_EQ(ui::DragDropTypes::DRAG_NONE,
textfield_->GetDragOperationsForView(NULL, kStringPoint));
textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_TEXT);
+ MoveMouseTo(kStringPoint);
+ PressLeftMouseButton();
// Ensure that textfields only initiate drag operations inside the selection.
- ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, kStringPoint, kStringPoint,
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
- ui::EF_LEFT_MOUSE_BUTTON);
- textfield_->OnMousePressed(press_event);
EXPECT_EQ(ui::DragDropTypes::DRAG_NONE,
textfield_->GetDragOperationsForView(NULL, gfx::Point()));
EXPECT_FALSE(textfield_->CanStartDragForView(NULL, gfx::Point(),
@@ -1308,17 +1363,13 @@ TEST_F(TextfieldTest, DragAndDrop_ToTheRight) {
// Start dragging "ello".
textfield_->SelectRange(gfx::Range(1, 5));
gfx::Point point(GetCursorPositionX(3), 0);
- ui::MouseEvent click_a(ui::ET_MOUSE_PRESSED, point, point,
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
- ui::EF_LEFT_MOUSE_BUTTON);
- textfield_->OnMousePressed(click_a);
- EXPECT_TRUE(textfield_->CanStartDragForView(textfield_, click_a.location(),
- gfx::Point()));
- operations = textfield_->GetDragOperationsForView(textfield_,
- click_a.location());
+ MoveMouseTo(point);
+ PressLeftMouseButton();
+ EXPECT_TRUE(textfield_->CanStartDragForView(textfield_, point, point));
+ operations = textfield_->GetDragOperationsForView(textfield_, point);
EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY,
operations);
- textfield_->WriteDragDataForView(NULL, click_a.location(), &data);
+ textfield_->WriteDragDataForView(nullptr, point, &data);
EXPECT_TRUE(data.GetString(&string));
EXPECT_EQ(textfield_->GetSelectedText(), string);
EXPECT_TRUE(textfield_->GetDropFormats(&formats, &format_types));
@@ -1362,17 +1413,13 @@ TEST_F(TextfieldTest, DragAndDrop_ToTheLeft) {
// Start dragging " worl".
textfield_->SelectRange(gfx::Range(5, 10));
gfx::Point point(GetCursorPositionX(7), 0);
- ui::MouseEvent click_a(ui::ET_MOUSE_PRESSED, point, point,
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
- ui::EF_LEFT_MOUSE_BUTTON);
- textfield_->OnMousePressed(click_a);
- EXPECT_TRUE(textfield_->CanStartDragForView(textfield_, click_a.location(),
- gfx::Point()));
- operations = textfield_->GetDragOperationsForView(textfield_,
- click_a.location());
+ MoveMouseTo(point);
+ PressLeftMouseButton();
+ EXPECT_TRUE(textfield_->CanStartDragForView(textfield_, point, gfx::Point()));
+ operations = textfield_->GetDragOperationsForView(textfield_, point);
EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY,
operations);
- textfield_->WriteDragDataForView(NULL, click_a.location(), &data);
+ textfield_->WriteDragDataForView(nullptr, point, &data);
EXPECT_TRUE(data.GetString(&string));
EXPECT_EQ(textfield_->GetSelectedText(), string);
EXPECT_TRUE(textfield_->GetDropFormats(&formats, &format_types));
@@ -1410,12 +1457,10 @@ TEST_F(TextfieldTest, DragAndDrop_Canceled) {
// Start dragging "worl".
textfield_->SelectRange(gfx::Range(6, 10));
gfx::Point point(GetCursorPositionX(8), 0);
- ui::MouseEvent click(ui::ET_MOUSE_PRESSED, point, point,
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
- ui::EF_LEFT_MOUSE_BUTTON);
- textfield_->OnMousePressed(click);
+ MoveMouseTo(point);
+ PressLeftMouseButton();
ui::OSExchangeData data;
- textfield_->WriteDragDataForView(NULL, click.location(), &data);
+ textfield_->WriteDragDataForView(nullptr, point, &data);
EXPECT_TRUE(textfield_->CanDrop(data));
// Drag the text over somewhere valid, outside the current selection.
gfx::Point drop_point(GetCursorPositionX(2), 0);
@@ -1424,14 +1469,8 @@ TEST_F(TextfieldTest, DragAndDrop_Canceled) {
EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnDragUpdated(drop));
// "Cancel" the drag, via move and release over the selection, and OnDragDone.
gfx::Point drag_point(GetCursorPositionX(9), 0);
- ui::MouseEvent drag(ui::ET_MOUSE_DRAGGED, drag_point, drag_point,
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0);
- ui::MouseEvent release(ui::ET_MOUSE_RELEASED, drag_point, drag_point,
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
- ui::EF_LEFT_MOUSE_BUTTON);
- textfield_->OnMouseDragged(drag);
- textfield_->OnMouseReleased(release);
- textfield_->OnDragDone();
+ DragMouseTo(drag_point);
+ ReleaseLeftMouseButton();
EXPECT_EQ(ASCIIToUTF16("hello world"), textfield_->text());
}
@@ -2205,16 +2244,12 @@ TEST_F(TextfieldTest, KeepInitiallySelectedWord) {
MouseClick(middle_cursor, 0);
const gfx::Point middle(middle_cursor.x(),
middle_cursor.y() + middle_cursor.height() / 2);
- ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, middle, middle,
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
- ui::EF_LEFT_MOUSE_BUTTON);
- textfield_->OnMousePressed(press_event);
+ MoveMouseTo(middle);
+ PressLeftMouseButton();
EXPECT_EQ(gfx::Range(4, 7), textfield_->GetSelectedRange());
// Drag the mouse to the beginning of the textfield.
- ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, beginning, beginning,
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0);
- textfield_->OnMouseDragged(drag_event);
+ DragMouseTo(beginning);
EXPECT_EQ(gfx::Range(7, 0), textfield_->GetSelectedRange());
}
« no previous file with comments | « ui/views/controls/textfield/textfield.cc ('k') | ui/views/style/platform_style.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698