| 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());
|
| }
|
|
|
|
|