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 <set> | 7 #include <set> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 369 } | 369 } |
| 370 | 370 |
| 371 // Sends Shift+Insert if supported, otherwise Cmd+V again. | 371 // Sends Shift+Insert if supported, otherwise Cmd+V again. |
| 372 void SendAlternatePaste() { | 372 void SendAlternatePaste() { |
| 373 if (TestingNativeMac()) | 373 if (TestingNativeMac()) |
| 374 SendKeyEvent(ui::VKEY_V, false, true); | 374 SendKeyEvent(ui::VKEY_V, false, true); |
| 375 else | 375 else |
| 376 SendKeyEvent(ui::VKEY_INSERT, true, false); | 376 SendKeyEvent(ui::VKEY_INSERT, true, false); |
| 377 } | 377 } |
| 378 | 378 |
| 379 // Most platforms support Ctrl+Y as an alternative to Ctrl+Shift+Z, but on Mac | |
|
msw
2015/02/18 19:10:42
nit: CTRL+SHIFT+Z works on windows and linux. Mayb
tapted
2015/02/19 03:19:10
Done.
| |
| 380 // that is bound to "Show full history", so is not mapped as an editing | |
| 381 // command. So, on Mac, send Cmd+Shift+Z. | |
| 382 void SendAlternateRedo() { | |
| 383 if (TestingNativeMac()) | |
| 384 SendKeyEvent(ui::VKEY_Z, true, true); | |
| 385 else | |
| 386 SendKeyEvent(ui::VKEY_Y, false, true); | |
| 387 } | |
| 388 | |
| 379 View* GetFocusedView() { | 389 View* GetFocusedView() { |
| 380 return widget_->GetFocusManager()->GetFocusedView(); | 390 return widget_->GetFocusManager()->GetFocusedView(); |
| 381 } | 391 } |
| 382 | 392 |
| 383 int GetCursorPositionX(int cursor_pos) { | 393 int GetCursorPositionX(int cursor_pos) { |
| 384 return test_api_->GetRenderText()->GetCursorBounds( | 394 return test_api_->GetRenderText()->GetCursorBounds( |
| 385 gfx::SelectionModel(cursor_pos, gfx::CURSOR_FORWARD), false).x(); | 395 gfx::SelectionModel(cursor_pos, gfx::CURSOR_FORWARD), false).x(); |
| 386 } | 396 } |
| 387 | 397 |
| 388 // Get the current cursor bounds. | 398 // Get the current cursor bounds. |
| (...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1068 EXPECT_STR_EQ("h welloorld", textfield_->text()); | 1078 EXPECT_STR_EQ("h welloorld", textfield_->text()); |
| 1069 textfield_->OnDragDone(); | 1079 textfield_->OnDragDone(); |
| 1070 | 1080 |
| 1071 // Undo/Redo the drag&drop change. | 1081 // Undo/Redo the drag&drop change. |
| 1072 SendKeyEvent(ui::VKEY_Z, false, true); | 1082 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1073 EXPECT_STR_EQ("hello world", textfield_->text()); | 1083 EXPECT_STR_EQ("hello world", textfield_->text()); |
| 1074 SendKeyEvent(ui::VKEY_Z, false, true); | 1084 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1075 EXPECT_STR_EQ("", textfield_->text()); | 1085 EXPECT_STR_EQ("", textfield_->text()); |
| 1076 SendKeyEvent(ui::VKEY_Z, false, true); | 1086 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1077 EXPECT_STR_EQ("", textfield_->text()); | 1087 EXPECT_STR_EQ("", textfield_->text()); |
| 1078 SendKeyEvent(ui::VKEY_Y, false, true); | 1088 SendAlternateRedo(); |
| 1079 EXPECT_STR_EQ("hello world", textfield_->text()); | 1089 EXPECT_STR_EQ("hello world", textfield_->text()); |
| 1080 SendKeyEvent(ui::VKEY_Y, false, true); | 1090 SendAlternateRedo(); |
| 1081 EXPECT_STR_EQ("h welloorld", textfield_->text()); | 1091 EXPECT_STR_EQ("h welloorld", textfield_->text()); |
| 1082 SendKeyEvent(ui::VKEY_Y, false, true); | 1092 SendAlternateRedo(); |
| 1083 EXPECT_STR_EQ("h welloorld", textfield_->text()); | 1093 EXPECT_STR_EQ("h welloorld", textfield_->text()); |
| 1084 } | 1094 } |
| 1085 | 1095 |
| 1086 TEST_F(TextfieldTest, DragAndDrop_ToTheLeft) { | 1096 TEST_F(TextfieldTest, DragAndDrop_ToTheLeft) { |
| 1087 InitTextfield(); | 1097 InitTextfield(); |
| 1088 textfield_->SetText(ASCIIToUTF16("hello world")); | 1098 textfield_->SetText(ASCIIToUTF16("hello world")); |
| 1089 | 1099 |
| 1090 base::string16 string; | 1100 base::string16 string; |
| 1091 ui::OSExchangeData data; | 1101 ui::OSExchangeData data; |
| 1092 int formats = 0; | 1102 int formats = 0; |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 1121 EXPECT_STR_EQ("h worlellod", textfield_->text()); | 1131 EXPECT_STR_EQ("h worlellod", textfield_->text()); |
| 1122 textfield_->OnDragDone(); | 1132 textfield_->OnDragDone(); |
| 1123 | 1133 |
| 1124 // Undo/Redo the drag&drop change. | 1134 // Undo/Redo the drag&drop change. |
| 1125 SendKeyEvent(ui::VKEY_Z, false, true); | 1135 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1126 EXPECT_STR_EQ("hello world", textfield_->text()); | 1136 EXPECT_STR_EQ("hello world", textfield_->text()); |
| 1127 SendKeyEvent(ui::VKEY_Z, false, true); | 1137 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1128 EXPECT_STR_EQ("", textfield_->text()); | 1138 EXPECT_STR_EQ("", textfield_->text()); |
| 1129 SendKeyEvent(ui::VKEY_Z, false, true); | 1139 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1130 EXPECT_STR_EQ("", textfield_->text()); | 1140 EXPECT_STR_EQ("", textfield_->text()); |
| 1131 SendKeyEvent(ui::VKEY_Y, false, true); | 1141 SendAlternateRedo(); |
| 1132 EXPECT_STR_EQ("hello world", textfield_->text()); | 1142 EXPECT_STR_EQ("hello world", textfield_->text()); |
| 1133 SendKeyEvent(ui::VKEY_Y, false, true); | 1143 SendAlternateRedo(); |
| 1134 EXPECT_STR_EQ("h worlellod", textfield_->text()); | 1144 EXPECT_STR_EQ("h worlellod", textfield_->text()); |
| 1135 SendKeyEvent(ui::VKEY_Y, false, true); | 1145 SendAlternateRedo(); |
| 1136 EXPECT_STR_EQ("h worlellod", textfield_->text()); | 1146 EXPECT_STR_EQ("h worlellod", textfield_->text()); |
| 1137 } | 1147 } |
| 1138 | 1148 |
| 1139 TEST_F(TextfieldTest, DragAndDrop_Canceled) { | 1149 TEST_F(TextfieldTest, DragAndDrop_Canceled) { |
| 1140 InitTextfield(); | 1150 InitTextfield(); |
| 1141 textfield_->SetText(ASCIIToUTF16("hello world")); | 1151 textfield_->SetText(ASCIIToUTF16("hello world")); |
| 1142 | 1152 |
| 1143 // Start dragging "worl". | 1153 // Start dragging "worl". |
| 1144 textfield_->SelectRange(gfx::Range(6, 10)); | 1154 textfield_->SelectRange(gfx::Range(6, 10)); |
| 1145 gfx::Point point(GetCursorPositionX(8), 0); | 1155 gfx::Point point(GetCursorPositionX(8), 0); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1342 } | 1352 } |
| 1343 | 1353 |
| 1344 TEST_F(TextfieldTest, UndoRedoTest) { | 1354 TEST_F(TextfieldTest, UndoRedoTest) { |
| 1345 InitTextfield(); | 1355 InitTextfield(); |
| 1346 SendKeyEvent(ui::VKEY_A); | 1356 SendKeyEvent(ui::VKEY_A); |
| 1347 EXPECT_STR_EQ("a", textfield_->text()); | 1357 EXPECT_STR_EQ("a", textfield_->text()); |
| 1348 SendKeyEvent(ui::VKEY_Z, false, true); | 1358 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1349 EXPECT_STR_EQ("", textfield_->text()); | 1359 EXPECT_STR_EQ("", textfield_->text()); |
| 1350 SendKeyEvent(ui::VKEY_Z, false, true); | 1360 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1351 EXPECT_STR_EQ("", textfield_->text()); | 1361 EXPECT_STR_EQ("", textfield_->text()); |
| 1352 SendKeyEvent(ui::VKEY_Y, false, true); | 1362 SendAlternateRedo(); |
| 1353 EXPECT_STR_EQ("a", textfield_->text()); | 1363 EXPECT_STR_EQ("a", textfield_->text()); |
| 1354 SendKeyEvent(ui::VKEY_Y, false, true); | 1364 SendAlternateRedo(); |
| 1355 EXPECT_STR_EQ("a", textfield_->text()); | 1365 EXPECT_STR_EQ("a", textfield_->text()); |
| 1356 | 1366 |
| 1357 // AppendText | 1367 // AppendText |
| 1358 textfield_->AppendText(ASCIIToUTF16("b")); | 1368 textfield_->AppendText(ASCIIToUTF16("b")); |
| 1359 last_contents_.clear(); // AppendText doesn't call ContentsChanged. | 1369 last_contents_.clear(); // AppendText doesn't call ContentsChanged. |
| 1360 EXPECT_STR_EQ("ab", textfield_->text()); | 1370 EXPECT_STR_EQ("ab", textfield_->text()); |
| 1361 SendKeyEvent(ui::VKEY_Z, false, true); | 1371 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1362 EXPECT_STR_EQ("a", textfield_->text()); | 1372 EXPECT_STR_EQ("a", textfield_->text()); |
| 1363 SendKeyEvent(ui::VKEY_Y, false, true); | 1373 SendAlternateRedo(); |
| 1364 EXPECT_STR_EQ("ab", textfield_->text()); | 1374 EXPECT_STR_EQ("ab", textfield_->text()); |
| 1365 | 1375 |
| 1366 // SetText | 1376 // SetText |
| 1367 SendKeyEvent(ui::VKEY_C); | 1377 SendKeyEvent(ui::VKEY_C); |
| 1368 // Undo'ing append moves the cursor to the end for now. | 1378 // Undo'ing append moves the cursor to the end for now. |
| 1369 // A no-op SetText won't add a new edit; see TextfieldModel::SetText. | 1379 // A no-op SetText won't add a new edit; see TextfieldModel::SetText. |
| 1370 EXPECT_STR_EQ("abc", textfield_->text()); | 1380 EXPECT_STR_EQ("abc", textfield_->text()); |
| 1371 textfield_->SetText(ASCIIToUTF16("abc")); | 1381 textfield_->SetText(ASCIIToUTF16("abc")); |
| 1372 EXPECT_STR_EQ("abc", textfield_->text()); | 1382 EXPECT_STR_EQ("abc", textfield_->text()); |
| 1373 SendKeyEvent(ui::VKEY_Z, false, true); | 1383 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1374 EXPECT_STR_EQ("ab", textfield_->text()); | 1384 EXPECT_STR_EQ("ab", textfield_->text()); |
| 1375 SendKeyEvent(ui::VKEY_Y, false, true); | 1385 SendAlternateRedo(); |
| 1376 EXPECT_STR_EQ("abc", textfield_->text()); | 1386 EXPECT_STR_EQ("abc", textfield_->text()); |
| 1377 SendKeyEvent(ui::VKEY_Y, false, true); | 1387 SendAlternateRedo(); |
| 1378 EXPECT_STR_EQ("abc", textfield_->text()); | 1388 EXPECT_STR_EQ("abc", textfield_->text()); |
| 1379 textfield_->SetText(ASCIIToUTF16("123")); | 1389 textfield_->SetText(ASCIIToUTF16("123")); |
| 1380 textfield_->SetText(ASCIIToUTF16("123")); | 1390 textfield_->SetText(ASCIIToUTF16("123")); |
| 1381 EXPECT_STR_EQ("123", textfield_->text()); | 1391 EXPECT_STR_EQ("123", textfield_->text()); |
| 1382 SendKeyEvent(ui::VKEY_END, false, false); | 1392 SendKeyEvent(ui::VKEY_END, false, false); |
| 1383 SendKeyEvent(ui::VKEY_4, false, false); | 1393 SendKeyEvent(ui::VKEY_4, false, false); |
| 1384 EXPECT_STR_EQ("1234", textfield_->text()); | 1394 EXPECT_STR_EQ("1234", textfield_->text()); |
| 1385 last_contents_.clear(); | 1395 last_contents_.clear(); |
| 1386 SendKeyEvent(ui::VKEY_Z, false, true); | 1396 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1387 EXPECT_STR_EQ("123", textfield_->text()); | 1397 EXPECT_STR_EQ("123", textfield_->text()); |
| 1388 SendKeyEvent(ui::VKEY_Z, false, true); | 1398 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1389 // the insert edit "c" and set edit "123" are merged to single edit, | 1399 // the insert edit "c" and set edit "123" are merged to single edit, |
| 1390 // so text becomes "ab" after undo. | 1400 // so text becomes "ab" after undo. |
| 1391 EXPECT_STR_EQ("ab", textfield_->text()); | 1401 EXPECT_STR_EQ("ab", textfield_->text()); |
| 1392 SendKeyEvent(ui::VKEY_Z, false, true); | 1402 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1393 EXPECT_STR_EQ("a", textfield_->text()); | 1403 EXPECT_STR_EQ("a", textfield_->text()); |
| 1394 SendKeyEvent(ui::VKEY_Y, false, true); | 1404 SendAlternateRedo(); |
| 1395 EXPECT_STR_EQ("ab", textfield_->text()); | 1405 EXPECT_STR_EQ("ab", textfield_->text()); |
| 1396 SendKeyEvent(ui::VKEY_Y, false, true); | 1406 SendAlternateRedo(); |
| 1397 EXPECT_STR_EQ("123", textfield_->text()); | 1407 EXPECT_STR_EQ("123", textfield_->text()); |
| 1398 SendKeyEvent(ui::VKEY_Y, false, true); | 1408 SendAlternateRedo(); |
| 1399 EXPECT_STR_EQ("1234", textfield_->text()); | 1409 EXPECT_STR_EQ("1234", textfield_->text()); |
| 1400 | 1410 |
| 1401 // Undoing to the same text shouldn't call ContentsChanged. | 1411 // Undoing to the same text shouldn't call ContentsChanged. |
| 1402 SendKeyEvent(ui::VKEY_A, false, true); // select all | 1412 SendKeyEvent(ui::VKEY_A, false, true); // select all |
| 1403 SendKeyEvent(ui::VKEY_A); | 1413 SendKeyEvent(ui::VKEY_A); |
| 1404 EXPECT_STR_EQ("a", textfield_->text()); | 1414 EXPECT_STR_EQ("a", textfield_->text()); |
| 1405 SendKeyEvent(ui::VKEY_B); | 1415 SendKeyEvent(ui::VKEY_B); |
| 1406 SendKeyEvent(ui::VKEY_C); | 1416 SendKeyEvent(ui::VKEY_C); |
| 1407 EXPECT_STR_EQ("abc", textfield_->text()); | 1417 EXPECT_STR_EQ("abc", textfield_->text()); |
| 1408 SendKeyEvent(ui::VKEY_Z, false, true); | 1418 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1409 EXPECT_STR_EQ("1234", textfield_->text()); | 1419 EXPECT_STR_EQ("1234", textfield_->text()); |
| 1410 SendKeyEvent(ui::VKEY_Y, false, true); | 1420 SendAlternateRedo(); |
| 1411 EXPECT_STR_EQ("abc", textfield_->text()); | 1421 EXPECT_STR_EQ("abc", textfield_->text()); |
| 1412 | 1422 |
| 1413 // Delete/Backspace | 1423 // Delete/Backspace |
| 1414 SendKeyEvent(ui::VKEY_BACK); | 1424 SendKeyEvent(ui::VKEY_BACK); |
| 1415 EXPECT_STR_EQ("ab", textfield_->text()); | 1425 EXPECT_STR_EQ("ab", textfield_->text()); |
| 1416 SendKeyEvent(ui::VKEY_HOME); | 1426 bool shift = false; |
| 1427 SendHomeEvent(shift); | |
| 1417 SendKeyEvent(ui::VKEY_DELETE); | 1428 SendKeyEvent(ui::VKEY_DELETE); |
| 1418 EXPECT_STR_EQ("b", textfield_->text()); | 1429 EXPECT_STR_EQ("b", textfield_->text()); |
| 1419 SendKeyEvent(ui::VKEY_A, false, true); | 1430 SendKeyEvent(ui::VKEY_A, false, true); |
| 1420 SendKeyEvent(ui::VKEY_DELETE); | 1431 SendKeyEvent(ui::VKEY_DELETE); |
| 1421 EXPECT_STR_EQ("", textfield_->text()); | 1432 EXPECT_STR_EQ("", textfield_->text()); |
| 1422 SendKeyEvent(ui::VKEY_Z, false, true); | 1433 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1423 EXPECT_STR_EQ("b", textfield_->text()); | 1434 EXPECT_STR_EQ("b", textfield_->text()); |
| 1424 SendKeyEvent(ui::VKEY_Z, false, true); | 1435 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1425 EXPECT_STR_EQ("ab", textfield_->text()); | 1436 EXPECT_STR_EQ("ab", textfield_->text()); |
| 1426 SendKeyEvent(ui::VKEY_Z, false, true); | 1437 SendKeyEvent(ui::VKEY_Z, false, true); |
| 1427 EXPECT_STR_EQ("abc", textfield_->text()); | 1438 EXPECT_STR_EQ("abc", textfield_->text()); |
| 1428 SendKeyEvent(ui::VKEY_Y, false, true); | 1439 SendAlternateRedo(); |
| 1429 EXPECT_STR_EQ("ab", textfield_->text()); | 1440 EXPECT_STR_EQ("ab", textfield_->text()); |
| 1430 SendKeyEvent(ui::VKEY_Y, false, true); | 1441 SendAlternateRedo(); |
| 1431 EXPECT_STR_EQ("b", textfield_->text()); | 1442 EXPECT_STR_EQ("b", textfield_->text()); |
| 1432 SendKeyEvent(ui::VKEY_Y, false, true); | 1443 SendAlternateRedo(); |
| 1433 EXPECT_STR_EQ("", textfield_->text()); | 1444 EXPECT_STR_EQ("", textfield_->text()); |
| 1434 SendKeyEvent(ui::VKEY_Y, false, true); | 1445 SendAlternateRedo(); |
| 1435 EXPECT_STR_EQ("", textfield_->text()); | 1446 EXPECT_STR_EQ("", textfield_->text()); |
| 1436 } | 1447 } |
| 1437 | 1448 |
| 1438 TEST_F(TextfieldTest, CutCopyPaste) { | 1449 TEST_F(TextfieldTest, CutCopyPaste) { |
| 1439 InitTextfield(); | 1450 InitTextfield(); |
| 1440 | 1451 |
| 1441 // Ensure IDS_APP_CUT cuts. | 1452 // Ensure IDS_APP_CUT cuts. |
| 1442 textfield_->SetText(ASCIIToUTF16("123")); | 1453 textfield_->SetText(ASCIIToUTF16("123")); |
| 1443 textfield_->SelectAll(false); | 1454 textfield_->SelectAll(false); |
| 1444 EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_CUT)); | 1455 EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_CUT)); |
| (...skipping 811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2256 | 2267 |
| 2257 textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD); | 2268 textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD); |
| 2258 ui::AXViewState state_protected; | 2269 ui::AXViewState state_protected; |
| 2259 textfield_->GetAccessibleState(&state_protected); | 2270 textfield_->GetAccessibleState(&state_protected); |
| 2260 EXPECT_EQ(ui::AX_ROLE_TEXT_FIELD, state_protected.role); | 2271 EXPECT_EQ(ui::AX_ROLE_TEXT_FIELD, state_protected.role); |
| 2261 EXPECT_EQ(ASCIIToUTF16("********"), state_protected.value); | 2272 EXPECT_EQ(ASCIIToUTF16("********"), state_protected.value); |
| 2262 EXPECT_TRUE(state_protected.HasStateFlag(ui::AX_STATE_PROTECTED)); | 2273 EXPECT_TRUE(state_protected.HasStateFlag(ui::AX_STATE_PROTECTED)); |
| 2263 } | 2274 } |
| 2264 | 2275 |
| 2265 } // namespace views | 2276 } // namespace views |
| OLD | NEW |