OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/strings/string_util.h" | 5 #include "base/strings/string_util.h" |
6 #include "base/strings/utf_string_conversions.h" | 6 #include "base/strings/utf_string_conversions.h" |
7 #include "chrome/test/base/chrome_render_view_test.h" | 7 #include "chrome/test/base/chrome_render_view_test.h" |
8 #include "components/autofill/content/common/autofill_messages.h" | 8 #include "components/autofill/content/common/autofill_messages.h" |
9 #include "components/autofill/content/renderer/autofill_agent.h" | 9 #include "components/autofill/content/renderer/autofill_agent.h" |
10 #include "components/autofill/content/renderer/form_autofill_util.h" | 10 #include "components/autofill/content/renderer/form_autofill_util.h" |
11 #include "components/autofill/content/renderer/password_autofill_agent.h" | 11 #include "components/autofill/content/renderer/password_autofill_agent.h" |
12 #include "components/autofill/content/renderer/test_password_autofill_agent.h" | 12 #include "components/autofill/content/renderer/test_password_autofill_agent.h" |
13 #include "components/autofill/core/common/autofill_constants.h" | 13 #include "components/autofill/core/common/autofill_constants.h" |
| 14 #include "components/autofill/core/common/autofill_switches.h" |
14 #include "components/autofill/core/common/form_data.h" | 15 #include "components/autofill/core/common/form_data.h" |
15 #include "components/autofill/core/common/form_field_data.h" | 16 #include "components/autofill/core/common/form_field_data.h" |
16 #include "content/public/renderer/render_frame.h" | 17 #include "content/public/renderer/render_frame.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
18 #include "third_party/WebKit/public/platform/WebString.h" | 19 #include "third_party/WebKit/public/platform/WebString.h" |
19 #include "third_party/WebKit/public/platform/WebVector.h" | 20 #include "third_party/WebKit/public/platform/WebVector.h" |
20 #include "third_party/WebKit/public/web/WebDocument.h" | 21 #include "third_party/WebKit/public/web/WebDocument.h" |
21 #include "third_party/WebKit/public/web/WebElement.h" | 22 #include "third_party/WebKit/public/web/WebElement.h" |
22 #include "third_party/WebKit/public/web/WebFormElement.h" | 23 #include "third_party/WebKit/public/web/WebFormElement.h" |
23 #include "third_party/WebKit/public/web/WebInputElement.h" | 24 #include "third_party/WebKit/public/web/WebInputElement.h" |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 void CheckSuggestions(const std::string& username, bool show_all) { | 410 void CheckSuggestions(const std::string& username, bool show_all) { |
410 const IPC::Message* message = | 411 const IPC::Message* message = |
411 render_thread_->sink().GetFirstMessageMatching( | 412 render_thread_->sink().GetFirstMessageMatching( |
412 AutofillHostMsg_ShowPasswordSuggestions::ID); | 413 AutofillHostMsg_ShowPasswordSuggestions::ID); |
413 EXPECT_TRUE(message); | 414 EXPECT_TRUE(message); |
414 Tuple5<int, base::i18n::TextDirection, base::string16, int, gfx::RectF> | 415 Tuple5<int, base::i18n::TextDirection, base::string16, int, gfx::RectF> |
415 args; | 416 args; |
416 AutofillHostMsg_ShowPasswordSuggestions::Read(message, &args); | 417 AutofillHostMsg_ShowPasswordSuggestions::Read(message, &args); |
417 EXPECT_EQ(kPasswordFillFormDataId, args.a); | 418 EXPECT_EQ(kPasswordFillFormDataId, args.a); |
418 EXPECT_EQ(ASCIIToUTF16(username), args.c); | 419 EXPECT_EQ(ASCIIToUTF16(username), args.c); |
419 int options = args.d; | 420 EXPECT_EQ(show_all, static_cast<bool>(args.d & autofill::SHOW_ALL)); |
420 EXPECT_EQ(show_all, static_cast<bool>(options & autofill::SHOW_ALL)); | |
421 | 421 |
422 render_thread_->sink().ClearMessages(); | 422 render_thread_->sink().ClearMessages(); |
423 } | 423 } |
424 | 424 |
425 void ExpectFormSubmittedWithUsernameAndPasswords( | 425 void ExpectFormSubmittedWithUsernameAndPasswords( |
426 const std::string& username_value, | 426 const std::string& username_value, |
427 const std::string& password_value, | 427 const std::string& password_value, |
428 const std::string& new_password_value) { | 428 const std::string& new_password_value) { |
429 const IPC::Message* message = | 429 const IPC::Message* message = |
430 render_thread_->sink().GetFirstMessageMatching( | 430 render_thread_->sink().GetFirstMessageMatching( |
(...skipping 970 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1401 // clicking on the username element. While the typing of the first letter will | 1401 // clicking on the username element. While the typing of the first letter will |
1402 // inline autocomplete, clicking on the element should still produce a full | 1402 // inline autocomplete, clicking on the element should still produce a full |
1403 // suggestion list. | 1403 // suggestion list. |
1404 SimulateUsernameChange("a", true); | 1404 SimulateUsernameChange("a", true); |
1405 render_thread_->sink().ClearMessages(); | 1405 render_thread_->sink().ClearMessages(); |
1406 static_cast<PageClickListener*>(autofill_agent_) | 1406 static_cast<PageClickListener*>(autofill_agent_) |
1407 ->FormControlElementClicked(username_element_, true); | 1407 ->FormControlElementClicked(username_element_, true); |
1408 CheckSuggestions(kAliceUsername, true); | 1408 CheckSuggestions(kAliceUsername, true); |
1409 } | 1409 } |
1410 | 1410 |
| 1411 // Tests that there are no autosuggestions from the password manager when the |
| 1412 // user clicks on the password field and the username field is editable when |
| 1413 // FillOnAccountSelect is enabled. |
| 1414 TEST_F(PasswordAutofillAgentTest, |
| 1415 FillOnAccountSelectOnlyNoCredentialsOnPasswordClick) { |
| 1416 CommandLine::ForCurrentProcess()->AppendSwitch( |
| 1417 autofill::switches::kEnableFillOnAccountSelect); |
| 1418 |
| 1419 // Simulate the browser sending back the login info. |
| 1420 SimulateOnFillPasswordForm(fill_data_); |
| 1421 |
| 1422 // Clear the text fields to start fresh. |
| 1423 ClearUsernameAndPasswordFields(); |
| 1424 |
| 1425 // Call SimulateElementClick() to produce a user gesture on the page so |
| 1426 // autofill will actually fill. |
| 1427 SimulateElementClick(kUsernameName); |
| 1428 |
| 1429 // Simulate a user clicking on the password element. This should produce no |
| 1430 // message. |
| 1431 render_thread_->sink().ClearMessages(); |
| 1432 static_cast<PageClickListener*>(autofill_agent_) |
| 1433 ->FormControlElementClicked(password_element_, false); |
| 1434 EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching( |
| 1435 AutofillHostMsg_ShowPasswordSuggestions::ID)); |
| 1436 } |
| 1437 |
| 1438 // Tests the autosuggestions that are given when a password element is clicked, |
| 1439 // the username element is not editable, and FillOnAccountSelect is enabled. |
| 1440 // Specifically, tests when the user clicks on the password element after page |
| 1441 // load, and the corresponding username element is readonly (and thus |
| 1442 // uneditable), that the credentials for the already-filled username are |
| 1443 // suggested. |
| 1444 TEST_F(PasswordAutofillAgentTest, |
| 1445 FillOnAccountSelectOnlyCredentialsOnPasswordClick) { |
| 1446 CommandLine::ForCurrentProcess()->AppendSwitch( |
| 1447 autofill::switches::kEnableFillOnAccountSelect); |
| 1448 |
| 1449 // Simulate the browser sending back the login info. |
| 1450 SimulateOnFillPasswordForm(fill_data_); |
| 1451 |
| 1452 // Clear the text fields to start fresh. |
| 1453 ClearUsernameAndPasswordFields(); |
| 1454 |
| 1455 // Simulate the page loading with a prefilled username element that is |
| 1456 // uneditable. |
| 1457 username_element_.setValue("alicia"); |
| 1458 SetElementReadOnly(username_element_, true); |
| 1459 |
| 1460 // Call SimulateElementClick() to produce a user gesture on the page so |
| 1461 // autofill will actually fill. |
| 1462 SimulateElementClick(kUsernameName); |
| 1463 |
| 1464 // Simulate a user clicking on the password element. This should produce a |
| 1465 // message with "alicia" suggested as the credential. |
| 1466 render_thread_->sink().ClearMessages(); |
| 1467 static_cast<PageClickListener*>(autofill_agent_) |
| 1468 ->FormControlElementClicked(password_element_, false); |
| 1469 CheckSuggestions("alicia", false); |
| 1470 } |
| 1471 |
| 1472 // Tests that there are no autosuggestions from the password manager when the |
| 1473 // user clicks on the password field (not the username field). |
| 1474 TEST_F(PasswordAutofillAgentTest, NoCredentialsOnPasswordClick) { |
| 1475 // Simulate the browser sending back the login info. |
| 1476 SimulateOnFillPasswordForm(fill_data_); |
| 1477 |
| 1478 // Clear the text fields to start fresh. |
| 1479 ClearUsernameAndPasswordFields(); |
| 1480 |
| 1481 // Call SimulateElementClick() to produce a user gesture on the page so |
| 1482 // autofill will actually fill. |
| 1483 SimulateElementClick(kUsernameName); |
| 1484 |
| 1485 // Simulate a user clicking on the password element. This should produce no |
| 1486 // message. |
| 1487 render_thread_->sink().ClearMessages(); |
| 1488 static_cast<PageClickListener*>(autofill_agent_) |
| 1489 ->FormControlElementClicked(password_element_, false); |
| 1490 EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching( |
| 1491 AutofillHostMsg_ShowPasswordSuggestions::ID)); |
| 1492 } |
| 1493 |
1411 #endif // !defined(OS_ANDROID) | 1494 #endif // !defined(OS_ANDROID) |
1412 | 1495 |
1413 // The user types in a username and a password, but then just before sending | 1496 // The user types in a username and a password, but then just before sending |
1414 // the form off, a script clears them. This test checks that | 1497 // the form off, a script clears them. This test checks that |
1415 // PasswordAutofillAgent can still remember the username and the password | 1498 // PasswordAutofillAgent can still remember the username and the password |
1416 // typed by the user. | 1499 // typed by the user. |
1417 TEST_F(PasswordAutofillAgentTest, | 1500 TEST_F(PasswordAutofillAgentTest, |
1418 RememberLastNonEmptyUsernameAndPasswordOnSubmit_ScriptCleared) { | 1501 RememberLastNonEmptyUsernameAndPasswordOnSubmit_ScriptCleared) { |
1419 SimulateInputChangeForElement( | 1502 SimulateInputChangeForElement( |
1420 "temp", true, GetMainFrame(), username_element_, true); | 1503 "temp", true, GetMainFrame(), username_element_, true); |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1538 GetMainFrame(), | 1621 GetMainFrame(), |
1539 password_element_, | 1622 password_element_, |
1540 /*is_user_input=*/true); | 1623 /*is_user_input=*/true); |
1541 | 1624 |
1542 // Simulate the user typing a stored username. | 1625 // Simulate the user typing a stored username. |
1543 SimulateUsernameChange(kAliceUsername, true); | 1626 SimulateUsernameChange(kAliceUsername, true); |
1544 // The autofileld password should replace the typed one. | 1627 // The autofileld password should replace the typed one. |
1545 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); | 1628 CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
1546 } | 1629 } |
1547 | 1630 |
| 1631 TEST_F(PasswordAutofillAgentTest, FormFillDataMustHaveUsername) { |
| 1632 ClearUsernameAndPasswordFields(); |
| 1633 |
| 1634 PasswordFormFillData no_username_fill_data = fill_data_; |
| 1635 no_username_fill_data.username_field.name = base::string16(); |
| 1636 SimulateOnFillPasswordForm(no_username_fill_data); |
| 1637 |
| 1638 // The username and password should not have been autocompleted. |
| 1639 CheckTextFieldsState("", false, "", false); |
| 1640 } |
| 1641 |
| 1642 TEST_F(PasswordAutofillAgentTest, FillOnAccountSelectOnly) { |
| 1643 CommandLine::ForCurrentProcess()->AppendSwitch( |
| 1644 autofill::switches::kEnableFillOnAccountSelect); |
| 1645 |
| 1646 ClearUsernameAndPasswordFields(); |
| 1647 |
| 1648 // Simulate the browser sending back the login info for an initial page load. |
| 1649 SimulateOnFillPasswordForm(fill_data_); |
| 1650 |
| 1651 CheckTextFieldsState(std::string(), true, std::string(), false); |
| 1652 } |
| 1653 |
| 1654 TEST_F(PasswordAutofillAgentTest, FillOnAccountSelectOnlyReadonlyUsername) { |
| 1655 CommandLine::ForCurrentProcess()->AppendSwitch( |
| 1656 autofill::switches::kEnableFillOnAccountSelect); |
| 1657 |
| 1658 ClearUsernameAndPasswordFields(); |
| 1659 |
| 1660 username_element_.setValue("alicia"); |
| 1661 SetElementReadOnly(username_element_, true); |
| 1662 |
| 1663 // Simulate the browser sending back the login info for an initial page load. |
| 1664 SimulateOnFillPasswordForm(fill_data_); |
| 1665 |
| 1666 CheckTextFieldsState(std::string("alicia"), false, std::string(), true); |
| 1667 } |
| 1668 |
1548 } // namespace autofill | 1669 } // namespace autofill |
OLD | NEW |