| Index: chrome/renderer/autofill/password_autofill_agent_browsertest.cc
|
| diff --git a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
|
| index 572db2e7e211fa93b3ef5a5f8752fb6f150d531a..b0ed42553c2c1974c8d97be338bee9e7a3ae6ce5 100644
|
| --- a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
|
| +++ b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
|
| @@ -11,6 +11,7 @@
|
| #include "components/autofill/content/renderer/password_autofill_agent.h"
|
| #include "components/autofill/content/renderer/test_password_autofill_agent.h"
|
| #include "components/autofill/core/common/autofill_constants.h"
|
| +#include "components/autofill/core/common/autofill_switches.h"
|
| #include "components/autofill/core/common/form_data.h"
|
| #include "components/autofill/core/common/form_field_data.h"
|
| #include "content/public/renderer/render_frame.h"
|
| @@ -416,8 +417,7 @@ class PasswordAutofillAgentTest : public ChromeRenderViewTest {
|
| AutofillHostMsg_ShowPasswordSuggestions::Read(message, &args);
|
| EXPECT_EQ(kPasswordFillFormDataId, args.a);
|
| EXPECT_EQ(ASCIIToUTF16(username), args.c);
|
| - int options = args.d;
|
| - EXPECT_EQ(show_all, static_cast<bool>(options & autofill::SHOW_ALL));
|
| + EXPECT_EQ(show_all, static_cast<bool>(args.d & autofill::SHOW_ALL));
|
|
|
| render_thread_->sink().ClearMessages();
|
| }
|
| @@ -1408,6 +1408,89 @@ TEST_F(PasswordAutofillAgentTest, CredentialsOnClick) {
|
| CheckSuggestions(kAliceUsername, true);
|
| }
|
|
|
| +// Tests that there are no autosuggestions from the password manager when the
|
| +// user clicks on the password field and the username field is editable when
|
| +// FillOnAccountSelect is enabled.
|
| +TEST_F(PasswordAutofillAgentTest,
|
| + FillOnAccountSelectOnlyNoCredentialsOnPasswordClick) {
|
| + CommandLine::ForCurrentProcess()->AppendSwitch(
|
| + autofill::switches::kEnableFillOnAccountSelect);
|
| +
|
| + // Simulate the browser sending back the login info.
|
| + SimulateOnFillPasswordForm(fill_data_);
|
| +
|
| + // Clear the text fields to start fresh.
|
| + ClearUsernameAndPasswordFields();
|
| +
|
| + // Call SimulateElementClick() to produce a user gesture on the page so
|
| + // autofill will actually fill.
|
| + SimulateElementClick(kUsernameName);
|
| +
|
| + // Simulate a user clicking on the password element. This should produce no
|
| + // message.
|
| + render_thread_->sink().ClearMessages();
|
| + static_cast<PageClickListener*>(autofill_agent_)
|
| + ->FormControlElementClicked(password_element_, false);
|
| + EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching(
|
| + AutofillHostMsg_ShowPasswordSuggestions::ID));
|
| +}
|
| +
|
| +// Tests the autosuggestions that are given when a password element is clicked,
|
| +// the username element is not editable, and FillOnAccountSelect is enabled.
|
| +// Specifically, tests when the user clicks on the password element after page
|
| +// load, and the corresponding username element is readonly (and thus
|
| +// uneditable), that the credentials for the already-filled username are
|
| +// suggested.
|
| +TEST_F(PasswordAutofillAgentTest,
|
| + FillOnAccountSelectOnlyCredentialsOnPasswordClick) {
|
| + CommandLine::ForCurrentProcess()->AppendSwitch(
|
| + autofill::switches::kEnableFillOnAccountSelect);
|
| +
|
| + // Simulate the browser sending back the login info.
|
| + SimulateOnFillPasswordForm(fill_data_);
|
| +
|
| + // Clear the text fields to start fresh.
|
| + ClearUsernameAndPasswordFields();
|
| +
|
| + // Simulate the page loading with a prefilled username element that is
|
| + // uneditable.
|
| + username_element_.setValue("alicia");
|
| + SetElementReadOnly(username_element_, true);
|
| +
|
| + // Call SimulateElementClick() to produce a user gesture on the page so
|
| + // autofill will actually fill.
|
| + SimulateElementClick(kUsernameName);
|
| +
|
| + // Simulate a user clicking on the password element. This should produce a
|
| + // message with "alicia" suggested as the credential.
|
| + render_thread_->sink().ClearMessages();
|
| + static_cast<PageClickListener*>(autofill_agent_)
|
| + ->FormControlElementClicked(password_element_, false);
|
| + CheckSuggestions("alicia", false);
|
| +}
|
| +
|
| +// Tests that there are no autosuggestions from the password manager when the
|
| +// user clicks on the password field (not the username field).
|
| +TEST_F(PasswordAutofillAgentTest, NoCredentialsOnPasswordClick) {
|
| + // Simulate the browser sending back the login info.
|
| + SimulateOnFillPasswordForm(fill_data_);
|
| +
|
| + // Clear the text fields to start fresh.
|
| + ClearUsernameAndPasswordFields();
|
| +
|
| + // Call SimulateElementClick() to produce a user gesture on the page so
|
| + // autofill will actually fill.
|
| + SimulateElementClick(kUsernameName);
|
| +
|
| + // Simulate a user clicking on the password element. This should produce no
|
| + // message.
|
| + render_thread_->sink().ClearMessages();
|
| + static_cast<PageClickListener*>(autofill_agent_)
|
| + ->FormControlElementClicked(password_element_, false);
|
| + EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching(
|
| + AutofillHostMsg_ShowPasswordSuggestions::ID));
|
| +}
|
| +
|
| #endif // !defined(OS_ANDROID)
|
|
|
| // The user types in a username and a password, but then just before sending
|
| @@ -1545,4 +1628,42 @@ TEST_F(PasswordAutofillAgentTest,
|
| CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
|
| }
|
|
|
| +TEST_F(PasswordAutofillAgentTest, FormFillDataMustHaveUsername) {
|
| + ClearUsernameAndPasswordFields();
|
| +
|
| + PasswordFormFillData no_username_fill_data = fill_data_;
|
| + no_username_fill_data.username_field.name = base::string16();
|
| + SimulateOnFillPasswordForm(no_username_fill_data);
|
| +
|
| + // The username and password should not have been autocompleted.
|
| + CheckTextFieldsState("", false, "", false);
|
| +}
|
| +
|
| +TEST_F(PasswordAutofillAgentTest, FillOnAccountSelectOnly) {
|
| + CommandLine::ForCurrentProcess()->AppendSwitch(
|
| + autofill::switches::kEnableFillOnAccountSelect);
|
| +
|
| + ClearUsernameAndPasswordFields();
|
| +
|
| + // Simulate the browser sending back the login info for an initial page load.
|
| + SimulateOnFillPasswordForm(fill_data_);
|
| +
|
| + CheckTextFieldsState(std::string(), true, std::string(), false);
|
| +}
|
| +
|
| +TEST_F(PasswordAutofillAgentTest, FillOnAccountSelectOnlyReadonlyUsername) {
|
| + CommandLine::ForCurrentProcess()->AppendSwitch(
|
| + autofill::switches::kEnableFillOnAccountSelect);
|
| +
|
| + ClearUsernameAndPasswordFields();
|
| +
|
| + username_element_.setValue("alicia");
|
| + SetElementReadOnly(username_element_, true);
|
| +
|
| + // Simulate the browser sending back the login info for an initial page load.
|
| + SimulateOnFillPasswordForm(fill_data_);
|
| +
|
| + CheckTextFieldsState(std::string("alicia"), false, std::string(), true);
|
| +}
|
| +
|
| } // namespace autofill
|
|
|