Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/views/controls/textfield/textfield.h" | 5 #include "ui/views/controls/textfield/textfield.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <set> | 10 #include <set> |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 32 #include "ui/events/event_processor.h" | 32 #include "ui/events/event_processor.h" |
| 33 #include "ui/events/event_utils.h" | 33 #include "ui/events/event_utils.h" |
| 34 #include "ui/events/keycodes/keyboard_codes.h" | 34 #include "ui/events/keycodes/keyboard_codes.h" |
| 35 #include "ui/events/test/event_generator.h" | 35 #include "ui/events/test/event_generator.h" |
| 36 #include "ui/gfx/render_text.h" | 36 #include "ui/gfx/render_text.h" |
| 37 #include "ui/strings/grit/ui_strings.h" | 37 #include "ui/strings/grit/ui_strings.h" |
| 38 #include "ui/views/controls/textfield/textfield_controller.h" | 38 #include "ui/views/controls/textfield/textfield_controller.h" |
| 39 #include "ui/views/controls/textfield/textfield_model.h" | 39 #include "ui/views/controls/textfield/textfield_model.h" |
| 40 #include "ui/views/controls/textfield/textfield_test_api.h" | 40 #include "ui/views/controls/textfield/textfield_test_api.h" |
| 41 #include "ui/views/focus/focus_manager.h" | 41 #include "ui/views/focus/focus_manager.h" |
| 42 #include "ui/views/style/platform_style.h" | |
| 42 #include "ui/views/test/test_views_delegate.h" | 43 #include "ui/views/test/test_views_delegate.h" |
| 43 #include "ui/views/test/views_test_base.h" | 44 #include "ui/views/test/views_test_base.h" |
| 44 #include "ui/views/test/widget_test.h" | 45 #include "ui/views/test/widget_test.h" |
| 45 #include "ui/views/widget/widget.h" | 46 #include "ui/views/widget/widget.h" |
| 46 #include "url/gurl.h" | 47 #include "url/gurl.h" |
| 47 | 48 |
| 48 #if defined(OS_WIN) | 49 #if defined(OS_WIN) |
| 49 #include "base/win/windows_version.h" | 50 #include "base/win/windows_version.h" |
| 50 #endif | 51 #endif |
| 51 | 52 |
| (...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 627 EXPECT_TRUE(menu->IsEnabledAt(1 /* Separator */)); | 628 EXPECT_TRUE(menu->IsEnabledAt(1 /* Separator */)); |
| 628 EXPECT_EQ(textfield_has_selection, menu->IsEnabledAt(2 /* CUT */)); | 629 EXPECT_EQ(textfield_has_selection, menu->IsEnabledAt(2 /* CUT */)); |
| 629 EXPECT_EQ(textfield_has_selection, menu->IsEnabledAt(3 /* COPY */)); | 630 EXPECT_EQ(textfield_has_selection, menu->IsEnabledAt(3 /* COPY */)); |
| 630 EXPECT_NE(GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE).empty(), | 631 EXPECT_NE(GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE).empty(), |
| 631 menu->IsEnabledAt(4 /* PASTE */)); | 632 menu->IsEnabledAt(4 /* PASTE */)); |
| 632 EXPECT_EQ(textfield_has_selection, menu->IsEnabledAt(5 /* DELETE */)); | 633 EXPECT_EQ(textfield_has_selection, menu->IsEnabledAt(5 /* DELETE */)); |
| 633 EXPECT_TRUE(menu->IsEnabledAt(6 /* Separator */)); | 634 EXPECT_TRUE(menu->IsEnabledAt(6 /* Separator */)); |
| 634 EXPECT_TRUE(menu->IsEnabledAt(7 /* SELECT ALL */)); | 635 EXPECT_TRUE(menu->IsEnabledAt(7 /* SELECT ALL */)); |
| 635 } | 636 } |
| 636 | 637 |
| 638 void PressLeftMouseButton(int extra_flags) { | |
| 639 ui::MouseEvent click(ui::ET_MOUSE_PRESSED, mouse_position_, mouse_position_, | |
| 640 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, | |
| 641 ui::EF_LEFT_MOUSE_BUTTON | extra_flags); | |
| 642 textfield_->OnMousePressed(click); | |
| 643 } | |
| 644 | |
| 645 void PressLeftMouseButton() { | |
|
tapted
2016/04/18 01:12:51
(note style guide now allows default arguments if
| |
| 646 PressLeftMouseButton(0); | |
| 647 } | |
| 648 | |
| 649 void ReleaseLeftMouseButton() { | |
| 650 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, mouse_position_, | |
| 651 mouse_position_, ui::EventTimeForNow(), | |
| 652 ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); | |
| 653 textfield_->OnMouseReleased(release); | |
| 654 } | |
| 655 | |
| 656 void ClickLeftMouseButton(int extra_flags) { | |
| 657 PressLeftMouseButton(extra_flags); | |
| 658 ReleaseLeftMouseButton(); | |
| 659 } | |
| 660 | |
| 661 void ClickLeftMouseButton() { | |
| 662 ClickLeftMouseButton(0); | |
| 663 } | |
| 664 | |
| 665 void DragMouseTo(const gfx::Point& where) { | |
| 666 mouse_position_ = where; | |
| 667 ui::MouseEvent drag(ui::ET_MOUSE_DRAGGED, where, where, | |
| 668 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0); | |
| 669 textfield_->OnMouseDragged(drag); | |
| 670 } | |
| 671 | |
| 672 // Textfield does not listen to OnMouseMoved, so this function does not send | |
| 673 // an event when it updates the cursor position. | |
| 674 void MoveMouseTo(const gfx::Point& where) { mouse_position_ = where; } | |
| 675 | |
| 637 // We need widget to populate wrapper class. | 676 // We need widget to populate wrapper class. |
| 638 Widget* widget_; | 677 Widget* widget_; |
| 639 | 678 |
| 640 TestTextfield* textfield_; | 679 TestTextfield* textfield_; |
| 641 std::unique_ptr<TextfieldTestApi> test_api_; | 680 std::unique_ptr<TextfieldTestApi> test_api_; |
| 642 TextfieldModel* model_; | 681 TextfieldModel* model_; |
| 643 | 682 |
| 644 // The string from Controller::ContentsChanged callback. | 683 // The string from Controller::ContentsChanged callback. |
| 645 base::string16 last_contents_; | 684 base::string16 last_contents_; |
| 646 | 685 |
| 647 // For testing input method related behaviors. | 686 // For testing input method related behaviors. |
| 648 MockInputMethod* input_method_; | 687 MockInputMethod* input_method_; |
| 649 | 688 |
| 650 // Indicates how many times OnBeforeUserAction() is called. | 689 // Indicates how many times OnBeforeUserAction() is called. |
| 651 int on_before_user_action_; | 690 int on_before_user_action_; |
| 652 | 691 |
| 653 // Indicates how many times OnAfterUserAction() is called. | 692 // Indicates how many times OnAfterUserAction() is called. |
| 654 int on_after_user_action_; | 693 int on_after_user_action_; |
| 655 | 694 |
| 656 private: | 695 private: |
| 696 // Position of the mouse for synthetic mouse events. | |
| 697 gfx::Point mouse_position_; | |
| 657 ui::ClipboardType copied_to_clipboard_; | 698 ui::ClipboardType copied_to_clipboard_; |
| 658 std::unique_ptr<ui::test::EventGenerator> event_generator_; | 699 std::unique_ptr<ui::test::EventGenerator> event_generator_; |
| 659 DISALLOW_COPY_AND_ASSIGN(TextfieldTest); | 700 DISALLOW_COPY_AND_ASSIGN(TextfieldTest); |
| 660 }; | 701 }; |
| 661 | 702 |
| 662 TEST_F(TextfieldTest, ModelChangesTest) { | 703 TEST_F(TextfieldTest, ModelChangesTest) { |
| 663 InitTextfield(); | 704 InitTextfield(); |
| 664 | 705 |
| 665 // TextfieldController::ContentsChanged() shouldn't be called when changing | 706 // TextfieldController::ContentsChanged() shouldn't be called when changing |
| 666 // text programmatically. | 707 // text programmatically. |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1066 widget_->GetFocusManager()->AdvanceFocus(true); | 1107 widget_->GetFocusManager()->AdvanceFocus(true); |
| 1067 EXPECT_EQ(3, GetFocusedView()->id()); | 1108 EXPECT_EQ(3, GetFocusedView()->id()); |
| 1068 | 1109 |
| 1069 // Request focus should still work. | 1110 // Request focus should still work. |
| 1070 textfield_->RequestFocus(); | 1111 textfield_->RequestFocus(); |
| 1071 EXPECT_EQ(1, GetFocusedView()->id()); | 1112 EXPECT_EQ(1, GetFocusedView()->id()); |
| 1072 | 1113 |
| 1073 // Test if clicking on textfield view sets the focus. | 1114 // Test if clicking on textfield view sets the focus. |
| 1074 widget_->GetFocusManager()->AdvanceFocus(true); | 1115 widget_->GetFocusManager()->AdvanceFocus(true); |
| 1075 EXPECT_EQ(3, GetFocusedView()->id()); | 1116 EXPECT_EQ(3, GetFocusedView()->id()); |
| 1076 ui::MouseEvent click(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), | 1117 MoveMouseTo(gfx::Point()); |
| 1077 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, | 1118 ClickLeftMouseButton(); |
| 1078 ui::EF_LEFT_MOUSE_BUTTON); | |
| 1079 textfield_->OnMousePressed(click); | |
| 1080 EXPECT_EQ(1, GetFocusedView()->id()); | 1119 EXPECT_EQ(1, GetFocusedView()->id()); |
| 1081 | 1120 |
| 1082 // Tab/Shift+Tab should also cycle focus, not insert a tab character. | 1121 // Tab/Shift+Tab should also cycle focus, not insert a tab character. |
| 1083 SendKeyEvent(ui::VKEY_TAB, false, false); | 1122 SendKeyEvent(ui::VKEY_TAB, false, false); |
| 1084 EXPECT_EQ(2, GetFocusedView()->id()); | 1123 EXPECT_EQ(2, GetFocusedView()->id()); |
| 1085 SendKeyEvent(ui::VKEY_TAB, false, false); | 1124 SendKeyEvent(ui::VKEY_TAB, false, false); |
| 1086 EXPECT_EQ(3, GetFocusedView()->id()); | 1125 EXPECT_EQ(3, GetFocusedView()->id()); |
| 1087 // Cycle back to the first textfield. | 1126 // Cycle back to the first textfield. |
| 1088 SendKeyEvent(ui::VKEY_TAB, false, false); | 1127 SendKeyEvent(ui::VKEY_TAB, false, false); |
| 1089 EXPECT_EQ(1, GetFocusedView()->id()); | 1128 EXPECT_EQ(1, GetFocusedView()->id()); |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 1118 VerifyTextfieldContextMenuContents(true, true, GetContextMenuModel()); | 1157 VerifyTextfieldContextMenuContents(true, true, GetContextMenuModel()); |
| 1119 | 1158 |
| 1120 // Exercise the "paste enabled?" check in the verifier. | 1159 // Exercise the "paste enabled?" check in the verifier. |
| 1121 SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "Test"); | 1160 SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "Test"); |
| 1122 VerifyTextfieldContextMenuContents(true, true, GetContextMenuModel()); | 1161 VerifyTextfieldContextMenuContents(true, true, GetContextMenuModel()); |
| 1123 } | 1162 } |
| 1124 | 1163 |
| 1125 TEST_F(TextfieldTest, DoubleAndTripleClickTest) { | 1164 TEST_F(TextfieldTest, DoubleAndTripleClickTest) { |
| 1126 InitTextfield(); | 1165 InitTextfield(); |
| 1127 textfield_->SetText(ASCIIToUTF16("hello world")); | 1166 textfield_->SetText(ASCIIToUTF16("hello world")); |
| 1128 ui::MouseEvent click(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), | |
| 1129 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, | |
| 1130 ui::EF_LEFT_MOUSE_BUTTON); | |
| 1131 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), | |
| 1132 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, | |
| 1133 ui::EF_LEFT_MOUSE_BUTTON); | |
| 1134 ui::MouseEvent double_click(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), | |
| 1135 ui::EventTimeForNow(), | |
| 1136 ui::EF_LEFT_MOUSE_BUTTON | ui::EF_IS_DOUBLE_CLICK, | |
| 1137 ui::EF_LEFT_MOUSE_BUTTON); | |
| 1138 | 1167 |
| 1139 // Test for double click. | 1168 // Test for double click. |
| 1140 textfield_->OnMousePressed(click); | 1169 MoveMouseTo(gfx::Point()); |
| 1141 textfield_->OnMouseReleased(release); | 1170 ClickLeftMouseButton(); |
| 1142 EXPECT_TRUE(textfield_->GetSelectedText().empty()); | 1171 EXPECT_TRUE(textfield_->GetSelectedText().empty()); |
| 1143 textfield_->OnMousePressed(double_click); | 1172 ClickLeftMouseButton(ui::EF_IS_DOUBLE_CLICK); |
| 1144 textfield_->OnMouseReleased(release); | |
| 1145 EXPECT_STR_EQ("hello", textfield_->GetSelectedText()); | 1173 EXPECT_STR_EQ("hello", textfield_->GetSelectedText()); |
| 1146 | 1174 |
| 1147 // Test for triple click. | 1175 // Test for triple click. |
| 1148 textfield_->OnMousePressed(click); | 1176 ClickLeftMouseButton(); |
| 1149 textfield_->OnMouseReleased(release); | |
| 1150 EXPECT_STR_EQ("hello world", textfield_->GetSelectedText()); | 1177 EXPECT_STR_EQ("hello world", textfield_->GetSelectedText()); |
| 1151 | 1178 |
| 1152 // Another click should reset back to double click. | 1179 // Another click should reset back to double click. |
| 1153 textfield_->OnMousePressed(click); | 1180 ClickLeftMouseButton(); |
| 1154 textfield_->OnMouseReleased(release); | |
| 1155 EXPECT_STR_EQ("hello", textfield_->GetSelectedText()); | 1181 EXPECT_STR_EQ("hello", textfield_->GetSelectedText()); |
| 1156 } | 1182 } |
| 1157 | 1183 |
| 1158 TEST_F(TextfieldTest, DragToSelect) { | 1184 TEST_F(TextfieldTest, DragToSelect) { |
| 1159 InitTextfield(); | 1185 InitTextfield(); |
| 1160 textfield_->SetText(ASCIIToUTF16("hello world")); | 1186 textfield_->SetText(ASCIIToUTF16("hello world")); |
| 1161 const int kStart = GetCursorPositionX(5); | 1187 const int kStart = GetCursorPositionX(5); |
| 1162 const int kEnd = 500; | 1188 const int kEnd = 500; |
| 1163 gfx::Point start_point(kStart, 0); | 1189 gfx::Point start_point(kStart, 0); |
| 1164 gfx::Point end_point(kEnd, 0); | 1190 gfx::Point end_point(kEnd, 0); |
| 1165 ui::MouseEvent click_a(ui::ET_MOUSE_PRESSED, start_point, start_point, | 1191 |
| 1166 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, | 1192 MoveMouseTo(start_point); |
| 1167 ui::EF_LEFT_MOUSE_BUTTON); | 1193 PressLeftMouseButton(); |
| 1168 ui::MouseEvent click_b(ui::ET_MOUSE_PRESSED, end_point, end_point, | |
| 1169 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, | |
| 1170 ui::EF_LEFT_MOUSE_BUTTON); | |
| 1171 ui::MouseEvent drag_left(ui::ET_MOUSE_DRAGGED, gfx::Point(), gfx::Point(), | |
| 1172 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0); | |
| 1173 ui::MouseEvent drag_right(ui::ET_MOUSE_DRAGGED, end_point, end_point, | |
| 1174 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0); | |
| 1175 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, end_point, end_point, | |
| 1176 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, | |
| 1177 ui::EF_LEFT_MOUSE_BUTTON); | |
| 1178 textfield_->OnMousePressed(click_a); | |
| 1179 EXPECT_TRUE(textfield_->GetSelectedText().empty()); | 1194 EXPECT_TRUE(textfield_->GetSelectedText().empty()); |
| 1195 | |
| 1180 // Check that dragging left selects the beginning of the string. | 1196 // Check that dragging left selects the beginning of the string. |
| 1181 textfield_->OnMouseDragged(drag_left); | 1197 DragMouseTo(gfx::Point()); |
| 1182 base::string16 text_left = textfield_->GetSelectedText(); | 1198 base::string16 text_left = textfield_->GetSelectedText(); |
| 1183 EXPECT_STR_EQ("hello", text_left); | 1199 EXPECT_STR_EQ("hello", text_left); |
| 1200 | |
| 1184 // Check that dragging right selects the rest of the string. | 1201 // Check that dragging right selects the rest of the string. |
| 1185 textfield_->OnMouseDragged(drag_right); | 1202 DragMouseTo(end_point); |
| 1186 base::string16 text_right = textfield_->GetSelectedText(); | 1203 base::string16 text_right = textfield_->GetSelectedText(); |
| 1187 EXPECT_STR_EQ(" world", text_right); | 1204 EXPECT_STR_EQ(" world", text_right); |
| 1205 | |
| 1188 // Check that releasing in the same location does not alter the selection. | 1206 // Check that releasing in the same location does not alter the selection. |
| 1189 textfield_->OnMouseReleased(release); | 1207 ReleaseLeftMouseButton(); |
| 1190 EXPECT_EQ(text_right, textfield_->GetSelectedText()); | 1208 EXPECT_EQ(text_right, textfield_->GetSelectedText()); |
| 1209 | |
| 1191 // Check that dragging from beyond the text length works too. | 1210 // Check that dragging from beyond the text length works too. |
| 1192 textfield_->OnMousePressed(click_b); | 1211 MoveMouseTo(end_point); |
| 1193 textfield_->OnMouseDragged(drag_left); | 1212 PressLeftMouseButton(); |
| 1194 textfield_->OnMouseReleased(release); | 1213 DragMouseTo(gfx::Point()); |
| 1214 ReleaseLeftMouseButton(); | |
| 1195 EXPECT_EQ(textfield_->text(), textfield_->GetSelectedText()); | 1215 EXPECT_EQ(textfield_->text(), textfield_->GetSelectedText()); |
| 1196 } | 1216 } |
| 1197 | 1217 |
| 1218 // This test checks that dragging above the textfield selects to the beginning | |
| 1219 // and dragging below the textfield selects to the end, but only on platforms | |
| 1220 // where that is the expected behavior. | |
| 1221 TEST_F(TextfieldTest, DragUpOrDownSelectsToEnd) { | |
| 1222 InitTextfield(); | |
| 1223 textfield_->SetText(ASCIIToUTF16("hello world")); | |
| 1224 const base::string16 expected_up = base::ASCIIToUTF16( | |
| 1225 PlatformStyle::kTextfieldDragVerticallyDragsToEnd ? "hello" : "lo"); | |
| 1226 const base::string16 expected_down = base::ASCIIToUTF16( | |
| 1227 PlatformStyle::kTextfieldDragVerticallyDragsToEnd ? " world" : " w"); | |
| 1228 const int kStartX = GetCursorPositionX(5); | |
| 1229 const int kDownX = GetCursorPositionX(7); | |
| 1230 const int kUpX = GetCursorPositionX(3); | |
| 1231 gfx::Point start_point(kStartX, 0); | |
| 1232 gfx::Point down_point(kDownX, 500); | |
| 1233 gfx::Point up_point(kUpX, -500); | |
| 1234 | |
| 1235 MoveMouseTo(start_point); | |
| 1236 PressLeftMouseButton(); | |
| 1237 DragMouseTo(up_point); | |
| 1238 ReleaseLeftMouseButton(); | |
| 1239 EXPECT_EQ(textfield_->GetSelectedText(), expected_up); | |
| 1240 | |
| 1241 MoveMouseTo(start_point); | |
| 1242 PressLeftMouseButton(); | |
| 1243 DragMouseTo(down_point); | |
| 1244 ReleaseLeftMouseButton(); | |
| 1245 EXPECT_EQ(textfield_->GetSelectedText(), expected_down); | |
| 1246 } | |
| 1247 | |
| 1198 #if defined(OS_WIN) | 1248 #if defined(OS_WIN) |
| 1199 TEST_F(TextfieldTest, DragAndDrop_AcceptDrop) { | 1249 TEST_F(TextfieldTest, DragAndDrop_AcceptDrop) { |
| 1200 InitTextfield(); | 1250 InitTextfield(); |
| 1201 textfield_->SetText(ASCIIToUTF16("hello world")); | 1251 textfield_->SetText(ASCIIToUTF16("hello world")); |
| 1202 | 1252 |
| 1203 ui::OSExchangeData data; | 1253 ui::OSExchangeData data; |
| 1204 base::string16 string(ASCIIToUTF16("string ")); | 1254 base::string16 string(ASCIIToUTF16("string ")); |
| 1205 data.SetString(string); | 1255 data.SetString(string); |
| 1206 int formats = 0; | 1256 int formats = 0; |
| 1207 std::set<ui::Clipboard::FormatType> format_types; | 1257 std::set<ui::Clipboard::FormatType> format_types; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1270 // Ensure that textfields without selections do not support drag operations. | 1320 // Ensure that textfields without selections do not support drag operations. |
| 1271 textfield_->ClearSelection(); | 1321 textfield_->ClearSelection(); |
| 1272 EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, | 1322 EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, |
| 1273 textfield_->GetDragOperationsForView(NULL, kStringPoint)); | 1323 textfield_->GetDragOperationsForView(NULL, kStringPoint)); |
| 1274 textfield_->SelectRange(kStringRange); | 1324 textfield_->SelectRange(kStringRange); |
| 1275 // Ensure that password textfields do not support drag operations. | 1325 // Ensure that password textfields do not support drag operations. |
| 1276 textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD); | 1326 textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD); |
| 1277 EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, | 1327 EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, |
| 1278 textfield_->GetDragOperationsForView(NULL, kStringPoint)); | 1328 textfield_->GetDragOperationsForView(NULL, kStringPoint)); |
| 1279 textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_TEXT); | 1329 textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_TEXT); |
| 1330 MoveMouseTo(kStringPoint); | |
| 1331 PressLeftMouseButton(); | |
| 1280 // Ensure that textfields only initiate drag operations inside the selection. | 1332 // Ensure that textfields only initiate drag operations inside the selection. |
| 1281 ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, kStringPoint, kStringPoint, | |
| 1282 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, | |
| 1283 ui::EF_LEFT_MOUSE_BUTTON); | |
| 1284 textfield_->OnMousePressed(press_event); | |
| 1285 EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, | 1333 EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, |
| 1286 textfield_->GetDragOperationsForView(NULL, gfx::Point())); | 1334 textfield_->GetDragOperationsForView(NULL, gfx::Point())); |
| 1287 EXPECT_FALSE(textfield_->CanStartDragForView(NULL, gfx::Point(), | 1335 EXPECT_FALSE(textfield_->CanStartDragForView(NULL, gfx::Point(), |
| 1288 gfx::Point())); | 1336 gfx::Point())); |
| 1289 EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, | 1337 EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, |
| 1290 textfield_->GetDragOperationsForView(NULL, kStringPoint)); | 1338 textfield_->GetDragOperationsForView(NULL, kStringPoint)); |
| 1291 EXPECT_TRUE(textfield_->CanStartDragForView(NULL, kStringPoint, | 1339 EXPECT_TRUE(textfield_->CanStartDragForView(NULL, kStringPoint, |
| 1292 gfx::Point())); | 1340 gfx::Point())); |
| 1293 // Ensure that textfields support local moves. | 1341 // Ensure that textfields support local moves. |
| 1294 EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY, | 1342 EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY, |
| 1295 textfield_->GetDragOperationsForView(textfield_, kStringPoint)); | 1343 textfield_->GetDragOperationsForView(textfield_, kStringPoint)); |
| 1296 } | 1344 } |
| 1297 | 1345 |
| 1298 TEST_F(TextfieldTest, DragAndDrop_ToTheRight) { | 1346 TEST_F(TextfieldTest, DragAndDrop_ToTheRight) { |
| 1299 InitTextfield(); | 1347 InitTextfield(); |
| 1300 textfield_->SetText(ASCIIToUTF16("hello world")); | 1348 textfield_->SetText(ASCIIToUTF16("hello world")); |
| 1301 | 1349 |
| 1302 base::string16 string; | 1350 base::string16 string; |
| 1303 ui::OSExchangeData data; | 1351 ui::OSExchangeData data; |
| 1304 int formats = 0; | 1352 int formats = 0; |
| 1305 int operations = 0; | 1353 int operations = 0; |
| 1306 std::set<ui::Clipboard::FormatType> format_types; | 1354 std::set<ui::Clipboard::FormatType> format_types; |
| 1307 | 1355 |
| 1308 // Start dragging "ello". | 1356 // Start dragging "ello". |
| 1309 textfield_->SelectRange(gfx::Range(1, 5)); | 1357 textfield_->SelectRange(gfx::Range(1, 5)); |
| 1310 gfx::Point point(GetCursorPositionX(3), 0); | 1358 gfx::Point point(GetCursorPositionX(3), 0); |
| 1311 ui::MouseEvent click_a(ui::ET_MOUSE_PRESSED, point, point, | 1359 MoveMouseTo(point); |
| 1312 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, | 1360 PressLeftMouseButton(); |
| 1313 ui::EF_LEFT_MOUSE_BUTTON); | 1361 EXPECT_TRUE(textfield_->CanStartDragForView(textfield_, point, point)); |
| 1314 textfield_->OnMousePressed(click_a); | 1362 operations = textfield_->GetDragOperationsForView(textfield_, point); |
| 1315 EXPECT_TRUE(textfield_->CanStartDragForView(textfield_, click_a.location(), | |
| 1316 gfx::Point())); | |
| 1317 operations = textfield_->GetDragOperationsForView(textfield_, | |
| 1318 click_a.location()); | |
| 1319 EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY, | 1363 EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY, |
| 1320 operations); | 1364 operations); |
| 1321 textfield_->WriteDragDataForView(NULL, click_a.location(), &data); | 1365 textfield_->WriteDragDataForView(nullptr, point, &data); |
| 1322 EXPECT_TRUE(data.GetString(&string)); | 1366 EXPECT_TRUE(data.GetString(&string)); |
| 1323 EXPECT_EQ(textfield_->GetSelectedText(), string); | 1367 EXPECT_EQ(textfield_->GetSelectedText(), string); |
| 1324 EXPECT_TRUE(textfield_->GetDropFormats(&formats, &format_types)); | 1368 EXPECT_TRUE(textfield_->GetDropFormats(&formats, &format_types)); |
| 1325 EXPECT_EQ(ui::OSExchangeData::STRING, formats); | 1369 EXPECT_EQ(ui::OSExchangeData::STRING, formats); |
| 1326 EXPECT_TRUE(format_types.empty()); | 1370 EXPECT_TRUE(format_types.empty()); |
| 1327 | 1371 |
| 1328 // Drop "ello" after "w". | 1372 // Drop "ello" after "w". |
| 1329 const gfx::Point kDropPoint(GetCursorPositionX(7), 0); | 1373 const gfx::Point kDropPoint(GetCursorPositionX(7), 0); |
| 1330 EXPECT_TRUE(textfield_->CanDrop(data)); | 1374 EXPECT_TRUE(textfield_->CanDrop(data)); |
| 1331 ui::DropTargetEvent drop_a(data, kDropPoint, kDropPoint, operations); | 1375 ui::DropTargetEvent drop_a(data, kDropPoint, kDropPoint, operations); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 1355 | 1399 |
| 1356 base::string16 string; | 1400 base::string16 string; |
| 1357 ui::OSExchangeData data; | 1401 ui::OSExchangeData data; |
| 1358 int formats = 0; | 1402 int formats = 0; |
| 1359 int operations = 0; | 1403 int operations = 0; |
| 1360 std::set<ui::Clipboard::FormatType> format_types; | 1404 std::set<ui::Clipboard::FormatType> format_types; |
| 1361 | 1405 |
| 1362 // Start dragging " worl". | 1406 // Start dragging " worl". |
| 1363 textfield_->SelectRange(gfx::Range(5, 10)); | 1407 textfield_->SelectRange(gfx::Range(5, 10)); |
| 1364 gfx::Point point(GetCursorPositionX(7), 0); | 1408 gfx::Point point(GetCursorPositionX(7), 0); |
| 1365 ui::MouseEvent click_a(ui::ET_MOUSE_PRESSED, point, point, | 1409 MoveMouseTo(point); |
| 1366 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, | 1410 PressLeftMouseButton(); |
| 1367 ui::EF_LEFT_MOUSE_BUTTON); | 1411 EXPECT_TRUE(textfield_->CanStartDragForView(textfield_, point, gfx::Point())); |
| 1368 textfield_->OnMousePressed(click_a); | 1412 operations = textfield_->GetDragOperationsForView(textfield_, point); |
| 1369 EXPECT_TRUE(textfield_->CanStartDragForView(textfield_, click_a.location(), | |
| 1370 gfx::Point())); | |
| 1371 operations = textfield_->GetDragOperationsForView(textfield_, | |
| 1372 click_a.location()); | |
| 1373 EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY, | 1413 EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY, |
| 1374 operations); | 1414 operations); |
| 1375 textfield_->WriteDragDataForView(NULL, click_a.location(), &data); | 1415 textfield_->WriteDragDataForView(nullptr, point, &data); |
| 1376 EXPECT_TRUE(data.GetString(&string)); | 1416 EXPECT_TRUE(data.GetString(&string)); |
| 1377 EXPECT_EQ(textfield_->GetSelectedText(), string); | 1417 EXPECT_EQ(textfield_->GetSelectedText(), string); |
| 1378 EXPECT_TRUE(textfield_->GetDropFormats(&formats, &format_types)); | 1418 EXPECT_TRUE(textfield_->GetDropFormats(&formats, &format_types)); |
| 1379 EXPECT_EQ(ui::OSExchangeData::STRING, formats); | 1419 EXPECT_EQ(ui::OSExchangeData::STRING, formats); |
| 1380 EXPECT_TRUE(format_types.empty()); | 1420 EXPECT_TRUE(format_types.empty()); |
| 1381 | 1421 |
| 1382 // Drop " worl" after "h". | 1422 // Drop " worl" after "h". |
| 1383 EXPECT_TRUE(textfield_->CanDrop(data)); | 1423 EXPECT_TRUE(textfield_->CanDrop(data)); |
| 1384 gfx::Point drop_point(GetCursorPositionX(1), 0); | 1424 gfx::Point drop_point(GetCursorPositionX(1), 0); |
| 1385 ui::DropTargetEvent drop_a(data, drop_point, drop_point, operations); | 1425 ui::DropTargetEvent drop_a(data, drop_point, drop_point, operations); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 1403 EXPECT_STR_EQ("h worlellod", textfield_->text()); | 1443 EXPECT_STR_EQ("h worlellod", textfield_->text()); |
| 1404 } | 1444 } |
| 1405 | 1445 |
| 1406 TEST_F(TextfieldTest, DragAndDrop_Canceled) { | 1446 TEST_F(TextfieldTest, DragAndDrop_Canceled) { |
| 1407 InitTextfield(); | 1447 InitTextfield(); |
| 1408 textfield_->SetText(ASCIIToUTF16("hello world")); | 1448 textfield_->SetText(ASCIIToUTF16("hello world")); |
| 1409 | 1449 |
| 1410 // Start dragging "worl". | 1450 // Start dragging "worl". |
| 1411 textfield_->SelectRange(gfx::Range(6, 10)); | 1451 textfield_->SelectRange(gfx::Range(6, 10)); |
| 1412 gfx::Point point(GetCursorPositionX(8), 0); | 1452 gfx::Point point(GetCursorPositionX(8), 0); |
| 1413 ui::MouseEvent click(ui::ET_MOUSE_PRESSED, point, point, | 1453 MoveMouseTo(point); |
| 1414 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, | 1454 PressLeftMouseButton(); |
| 1415 ui::EF_LEFT_MOUSE_BUTTON); | |
| 1416 textfield_->OnMousePressed(click); | |
| 1417 ui::OSExchangeData data; | 1455 ui::OSExchangeData data; |
| 1418 textfield_->WriteDragDataForView(NULL, click.location(), &data); | 1456 textfield_->WriteDragDataForView(nullptr, point, &data); |
| 1419 EXPECT_TRUE(textfield_->CanDrop(data)); | 1457 EXPECT_TRUE(textfield_->CanDrop(data)); |
| 1420 // Drag the text over somewhere valid, outside the current selection. | 1458 // Drag the text over somewhere valid, outside the current selection. |
| 1421 gfx::Point drop_point(GetCursorPositionX(2), 0); | 1459 gfx::Point drop_point(GetCursorPositionX(2), 0); |
| 1422 ui::DropTargetEvent drop(data, drop_point, drop_point, | 1460 ui::DropTargetEvent drop(data, drop_point, drop_point, |
| 1423 ui::DragDropTypes::DRAG_MOVE); | 1461 ui::DragDropTypes::DRAG_MOVE); |
| 1424 EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnDragUpdated(drop)); | 1462 EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnDragUpdated(drop)); |
| 1425 // "Cancel" the drag, via move and release over the selection, and OnDragDone. | 1463 // "Cancel" the drag, via move and release over the selection, and OnDragDone. |
| 1426 gfx::Point drag_point(GetCursorPositionX(9), 0); | 1464 gfx::Point drag_point(GetCursorPositionX(9), 0); |
| 1427 ui::MouseEvent drag(ui::ET_MOUSE_DRAGGED, drag_point, drag_point, | 1465 DragMouseTo(drag_point); |
| 1428 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0); | 1466 ReleaseLeftMouseButton(); |
| 1429 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, drag_point, drag_point, | |
| 1430 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, | |
| 1431 ui::EF_LEFT_MOUSE_BUTTON); | |
| 1432 textfield_->OnMouseDragged(drag); | |
| 1433 textfield_->OnMouseReleased(release); | |
| 1434 textfield_->OnDragDone(); | |
| 1435 EXPECT_EQ(ASCIIToUTF16("hello world"), textfield_->text()); | 1467 EXPECT_EQ(ASCIIToUTF16("hello world"), textfield_->text()); |
| 1436 } | 1468 } |
| 1437 | 1469 |
| 1438 TEST_F(TextfieldTest, ReadOnlyTest) { | 1470 TEST_F(TextfieldTest, ReadOnlyTest) { |
| 1439 InitTextfield(); | 1471 InitTextfield(); |
| 1440 textfield_->SetText(ASCIIToUTF16("read only")); | 1472 textfield_->SetText(ASCIIToUTF16("read only")); |
| 1441 textfield_->SetReadOnly(true); | 1473 textfield_->SetReadOnly(true); |
| 1442 EXPECT_TRUE(textfield_->enabled()); | 1474 EXPECT_TRUE(textfield_->enabled()); |
| 1443 EXPECT_TRUE(textfield_->IsFocusable()); | 1475 EXPECT_TRUE(textfield_->IsFocusable()); |
| 1444 | 1476 |
| (...skipping 753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2198 | 2230 |
| 2199 textfield_->SelectRange(gfx::Range(5, 5)); | 2231 textfield_->SelectRange(gfx::Range(5, 5)); |
| 2200 const gfx::Rect middle_cursor = GetCursorBounds(); | 2232 const gfx::Rect middle_cursor = GetCursorBounds(); |
| 2201 textfield_->SelectRange(gfx::Range(0, 0)); | 2233 textfield_->SelectRange(gfx::Range(0, 0)); |
| 2202 const gfx::Point beginning = GetCursorBounds().origin(); | 2234 const gfx::Point beginning = GetCursorBounds().origin(); |
| 2203 | 2235 |
| 2204 // Double click, but do not release the left button. | 2236 // Double click, but do not release the left button. |
| 2205 MouseClick(middle_cursor, 0); | 2237 MouseClick(middle_cursor, 0); |
| 2206 const gfx::Point middle(middle_cursor.x(), | 2238 const gfx::Point middle(middle_cursor.x(), |
| 2207 middle_cursor.y() + middle_cursor.height() / 2); | 2239 middle_cursor.y() + middle_cursor.height() / 2); |
| 2208 ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, middle, middle, | 2240 MoveMouseTo(middle); |
| 2209 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, | 2241 PressLeftMouseButton(); |
| 2210 ui::EF_LEFT_MOUSE_BUTTON); | |
| 2211 textfield_->OnMousePressed(press_event); | |
| 2212 EXPECT_EQ(gfx::Range(4, 7), textfield_->GetSelectedRange()); | 2242 EXPECT_EQ(gfx::Range(4, 7), textfield_->GetSelectedRange()); |
| 2213 | 2243 |
| 2214 // Drag the mouse to the beginning of the textfield. | 2244 // Drag the mouse to the beginning of the textfield. |
| 2215 ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, beginning, beginning, | 2245 DragMouseTo(beginning); |
| 2216 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0); | |
| 2217 textfield_->OnMouseDragged(drag_event); | |
| 2218 EXPECT_EQ(gfx::Range(7, 0), textfield_->GetSelectedRange()); | 2246 EXPECT_EQ(gfx::Range(7, 0), textfield_->GetSelectedRange()); |
| 2219 } | 2247 } |
| 2220 | 2248 |
| 2221 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 2249 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| 2222 // flaky: http://crbug.com/396477 | 2250 // flaky: http://crbug.com/396477 |
| 2223 TEST_F(TextfieldTest, DISABLED_SelectionClipboard) { | 2251 TEST_F(TextfieldTest, DISABLED_SelectionClipboard) { |
| 2224 InitTextfield(); | 2252 InitTextfield(); |
| 2225 textfield_->SetText(ASCIIToUTF16("0123")); | 2253 textfield_->SetText(ASCIIToUTF16("0123")); |
| 2226 gfx::Point point_1(GetCursorPositionX(1), 0); | 2254 gfx::Point point_1(GetCursorPositionX(1), 0); |
| 2227 gfx::Point point_2(GetCursorPositionX(2), 0); | 2255 gfx::Point point_2(GetCursorPositionX(2), 0); |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2569 | 2597 |
| 2570 textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD); | 2598 textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD); |
| 2571 ui::AXViewState state_protected; | 2599 ui::AXViewState state_protected; |
| 2572 textfield_->GetAccessibleState(&state_protected); | 2600 textfield_->GetAccessibleState(&state_protected); |
| 2573 EXPECT_EQ(ui::AX_ROLE_TEXT_FIELD, state_protected.role); | 2601 EXPECT_EQ(ui::AX_ROLE_TEXT_FIELD, state_protected.role); |
| 2574 EXPECT_EQ(ASCIIToUTF16("********"), state_protected.value); | 2602 EXPECT_EQ(ASCIIToUTF16("********"), state_protected.value); |
| 2575 EXPECT_TRUE(state_protected.HasStateFlag(ui::AX_STATE_PROTECTED)); | 2603 EXPECT_TRUE(state_protected.HasStateFlag(ui::AX_STATE_PROTECTED)); |
| 2576 } | 2604 } |
| 2577 | 2605 |
| 2578 } // namespace views | 2606 } // namespace views |
| OLD | NEW |