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 efd3f73723d3708f8694e2caad81434f27fb16e7..3477f4d04a7efa6d6e1af9f7b05f9933c0544ed8 100644 |
--- a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc |
+++ b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc |
@@ -426,13 +426,18 @@ class PasswordAutofillAgentTest : public ChromeRenderViewTest { |
const WebInputElement& password_element, |
const std::string& password, |
bool password_autofilled, |
- bool checkSuggestedValue) { |
- EXPECT_EQ(username, username_element.Value().Utf8()); |
+ bool check_suggested_username, |
+ bool check_suggested_password) { |
+ EXPECT_EQ(username, check_suggested_username |
+ ? username_element.SuggestedValue().Utf8() |
+ : username_element.Value().Utf8()) |
+ << "check_suggested_username == " << check_suggested_username; |
EXPECT_EQ(username_autofilled, username_element.IsAutofilled()); |
- EXPECT_EQ(password, checkSuggestedValue |
+ |
+ EXPECT_EQ(password, check_suggested_password |
? password_element.SuggestedValue().Utf8() |
: password_element.Value().Utf8()) |
- << "checkSuggestedValue == " << checkSuggestedValue; |
+ << "check_suggested_password == " << check_suggested_password; |
EXPECT_EQ(password_autofilled, password_element.IsAutofilled()); |
} |
@@ -442,13 +447,9 @@ class PasswordAutofillAgentTest : public ChromeRenderViewTest { |
bool username_autofilled, |
const std::string& password, |
bool password_autofilled) { |
- CheckTextFieldsStateForElements(username_element_, |
- username, |
- username_autofilled, |
- password_element_, |
- password, |
- password_autofilled, |
- true); |
+ CheckTextFieldsStateForElements(username_element_, username, |
+ username_autofilled, password_element_, |
+ password, password_autofilled, false, true); |
} |
// Checks the DOM-accessible value of the username element and the |
@@ -457,13 +458,19 @@ class PasswordAutofillAgentTest : public ChromeRenderViewTest { |
bool username_autofilled, |
const std::string& password, |
bool password_autofilled) { |
- CheckTextFieldsStateForElements(username_element_, |
- username, |
- username_autofilled, |
- password_element_, |
- password, |
- password_autofilled, |
- false); |
+ CheckTextFieldsStateForElements( |
+ username_element_, username, username_autofilled, password_element_, |
+ password, password_autofilled, false, false); |
+ } |
+ |
+ // Checks the suggested values of the |username| and |password| elements. |
+ void CheckTextFieldsSuggestedState(const std::string& username, |
+ bool username_autofilled, |
+ const std::string& password, |
+ bool password_autofilled) { |
+ CheckTextFieldsStateForElements(username_element_, username, |
+ username_autofilled, password_element_, |
+ password, password_autofilled, true, true); |
} |
void CheckUsernameSelection(int start, int end) { |
@@ -1139,8 +1146,57 @@ TEST_F(PasswordAutofillAgentTest, FillSuggestion) { |
CheckUsernameSelection(username_length, username_length); |
} |
-// Tests that |FillSuggestion| properly fills the password if username is |
-// read-only. |
+// Tests that |FillSuggestion| properly fills username/password when interacting |
+// with the password field. |
+TEST_F(PasswordAutofillAgentTest, FillSuggestionFromPasswordField) { |
+ // Simulate the browser sending the login info, but set |wait_for_username| to |
+ // prevent the form from being immediately filled. |
+ fill_data_.wait_for_username = true; |
+ SimulateOnFillPasswordForm(fill_data_); |
+ // Neither field should have been autocompleted. |
+ CheckTextFieldsDOMState(std::string(), false, std::string(), false); |
+ |
+ // Both fields are autocompletable and should be filled. |
+ EXPECT_TRUE(password_autofill_agent_->FillSuggestion( |
+ password_element_, ASCIIToUTF16(kAliceUsername), |
+ ASCIIToUTF16(kAlicePassword))); |
+ CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
+ |
+ // Try Filling with a different password. Only password should be changed. |
pkalinnikov
2017/05/24 10:43:31
selfnit: ... Both fields should be changed.
pkalinnikov
2017/05/24 13:54:36
Done.
|
+ EXPECT_TRUE(password_autofill_agent_->FillSuggestion( |
+ password_element_, ASCIIToUTF16(kBobUsername), |
+ ASCIIToUTF16(kCarolPassword))); |
+ CheckTextFieldsDOMState(kBobUsername, true, kCarolPassword, true); |
+} |
+ |
+// Tests that |FillSuggestion| doesn't change non-empty non-autofilled username |
+// when interacting with the password field. |
+TEST_F(PasswordAutofillAgentTest, |
+ FillSuggestionFromPasswordFieldWithUsernameManuallyFilled) { |
+ username_element_.SetValue(WebString::FromUTF8("user1")); |
+ |
+ // Simulate the browser sending the login info, but set |wait_for_username| to |
+ // prevent the form from being immediately filled. |
+ fill_data_.wait_for_username = true; |
+ SimulateOnFillPasswordForm(fill_data_); |
+ // Neither field should have been autocompleted. |
+ CheckTextFieldsDOMState("user1", false, std::string(), false); |
+ |
+ // Only password field should be autocompleted. |
+ EXPECT_TRUE(password_autofill_agent_->FillSuggestion( |
+ password_element_, ASCIIToUTF16(kAliceUsername), |
+ ASCIIToUTF16(kAlicePassword))); |
+ CheckTextFieldsDOMState("user1", false, kAlicePassword, true); |
+ |
+ // Try Filling with a different password. Only password should be changed. |
+ EXPECT_TRUE(password_autofill_agent_->FillSuggestion( |
+ password_element_, ASCIIToUTF16(kBobUsername), |
+ ASCIIToUTF16(kCarolPassword))); |
+ CheckTextFieldsDOMState("user1", false, kCarolPassword, true); |
+} |
+ |
+// Tests that |FillSuggestion| properly fills the password if the username field |
+// is read-only. |
TEST_F(PasswordAutofillAgentTest, FillSuggestionIfUsernameReadOnly) { |
// Simulate the browser sending the login info. |
SetElementReadOnly(username_element_, true); |
@@ -1177,20 +1233,14 @@ TEST_F(PasswordAutofillAgentTest, PreviewSuggestion) { |
SetElementReadOnly(password_element_, true); |
EXPECT_FALSE(password_autofill_agent_->PreviewSuggestion( |
username_element_, kAliceUsername, kAlicePassword)); |
- EXPECT_EQ(std::string(), username_element_.SuggestedValue().Utf8()); |
- EXPECT_FALSE(username_element_.IsAutofilled()); |
- EXPECT_EQ(std::string(), password_element_.SuggestedValue().Utf8()); |
- EXPECT_FALSE(password_element_.IsAutofilled()); |
+ CheckTextFieldsSuggestedState(std::string(), false, std::string(), false); |
SetElementReadOnly(password_element_, false); |
// After selecting the suggestion, both fields should be previewed |
// with suggested values. |
EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( |
username_element_, kAliceUsername, kAlicePassword)); |
- EXPECT_EQ(kAliceUsername, username_element_.SuggestedValue().Utf8()); |
- EXPECT_TRUE(username_element_.IsAutofilled()); |
- EXPECT_EQ(kAlicePassword, password_element_.SuggestedValue().Utf8()); |
- EXPECT_TRUE(password_element_.IsAutofilled()); |
+ CheckTextFieldsSuggestedState(kAliceUsername, true, kAlicePassword, true); |
int username_length = strlen(kAliceUsername); |
CheckUsernameSelection(0, username_length); |
@@ -1198,14 +1248,58 @@ TEST_F(PasswordAutofillAgentTest, PreviewSuggestion) { |
// sent to the renderer. |
EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( |
username_element_, kBobUsername, kCarolPassword)); |
- EXPECT_EQ(kBobUsername, username_element_.SuggestedValue().Utf8()); |
- EXPECT_TRUE(username_element_.IsAutofilled()); |
- EXPECT_EQ(kCarolPassword, password_element_.SuggestedValue().Utf8()); |
- EXPECT_TRUE(password_element_.IsAutofilled()); |
+ CheckTextFieldsSuggestedState(kBobUsername, true, kCarolPassword, true); |
username_length = strlen(kBobUsername); |
CheckUsernameSelection(0, username_length); |
} |
+// Tests that |PreviewSuggestion| doesn't change non-empty non-autofilled |
+// username when previewing autofills on interacting with the password field. |
+TEST_F(PasswordAutofillAgentTest, |
+ PreviewSuggestionFromPasswordFieldWithUsernameManuallyFilled) { |
pkalinnikov
2017/05/24 10:43:31
selfnit: Move this test below PreviewSuggestionFro
pkalinnikov
2017/05/24 13:54:36
Done.
|
+ username_element_.SetValue(WebString::FromUTF8("user1")); |
+ |
+ // Simulate the browser sending the login info, but set |wait_for_username| to |
+ // prevent the form from being immediately filled. |
+ fill_data_.wait_for_username = true; |
+ SimulateOnFillPasswordForm(fill_data_); |
+ // Neither field should have been autocompleted. |
+ CheckTextFieldsDOMState("user1", false, std::string(), false); |
+ |
+ // Only password field should be autocompleted. |
+ EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( |
+ password_element_, kAliceUsername, kAlicePassword)); |
+ CheckTextFieldsSuggestedState(std::string(), false, kAlicePassword, true); |
+ CheckTextFieldsDOMState("user1", false, std::string(), true); |
+ |
+ // Try previewing with a different password. Only password should be changed. |
+ EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( |
+ password_element_, kBobUsername, kCarolPassword)); |
+ CheckTextFieldsSuggestedState(std::string(), false, kCarolPassword, true); |
+ CheckTextFieldsDOMState("user1", false, std::string(), true); |
+} |
+ |
+// Tests that |PreviewSuggestion| properly previews username/password when |
+// interacting with the password field. |
+TEST_F(PasswordAutofillAgentTest, PreviewSuggestionFromPasswordField) { |
+ // Simulate the browser sending the login info, but set |wait_for_username| to |
+ // prevent the form from being immediately filled. |
+ fill_data_.wait_for_username = true; |
+ SimulateOnFillPasswordForm(fill_data_); |
+ // Neither field should have been autocompleted. |
+ CheckTextFieldsDOMState(std::string(), false, std::string(), false); |
+ |
+ // Only password field should be autocompleted. |
pkalinnikov
2017/05/24 10:43:31
selfnit: // Both fields should be filled with sugg
pkalinnikov
2017/05/24 13:54:36
Done.
|
+ EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( |
+ password_element_, kAliceUsername, kAlicePassword)); |
+ CheckTextFieldsSuggestedState(kAliceUsername, true, kAlicePassword, true); |
+ |
+ // Try previewing with a different password. Only password should be changed. |
pkalinnikov
2017/05/24 10:43:31
selfnit: ... Both fields should be changed.
pkalinnikov
2017/05/24 13:54:36
Done.
|
+ EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( |
+ password_element_, kBobUsername, kCarolPassword)); |
+ CheckTextFieldsSuggestedState(kBobUsername, true, kCarolPassword, true); |
+} |
+ |
// Tests that |PreviewSuggestion| properly previews the password if username is |
// read-only. |
TEST_F(PasswordAutofillAgentTest, PreviewSuggestionIfUsernameReadOnly) { |
@@ -1219,21 +1313,14 @@ TEST_F(PasswordAutofillAgentTest, PreviewSuggestionIfUsernameReadOnly) { |
// Username field is not autocompletable, it should not be affected. |
EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( |
password_element_, kAliceUsername, kAlicePassword)); |
- EXPECT_EQ(std::string(), username_element_.SuggestedValue().Utf8()); |
- EXPECT_FALSE(username_element_.IsAutofilled()); |
- |
// Password field must be autofilled. |
- EXPECT_EQ(kAlicePassword, password_element_.SuggestedValue().Utf8()); |
- EXPECT_TRUE(password_element_.IsAutofilled()); |
+ CheckTextFieldsSuggestedState(std::string(), false, kAlicePassword, true); |
// Try previewing with a password different from the one that was initially |
// sent to the renderer. |
EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( |
password_element_, kBobUsername, kCarolPassword)); |
- EXPECT_EQ(std::string(), username_element_.SuggestedValue().Utf8()); |
- EXPECT_FALSE(username_element_.IsAutofilled()); |
- EXPECT_EQ(kCarolPassword, password_element_.SuggestedValue().Utf8()); |
- EXPECT_TRUE(password_element_.IsAutofilled()); |
+ CheckTextFieldsSuggestedState(std::string(), false, kCarolPassword, true); |
} |
// Tests that |PreviewSuggestion| properly sets the username selection range. |
@@ -1251,10 +1338,7 @@ TEST_F(PasswordAutofillAgentTest, PreviewSuggestionSelectionRange) { |
EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( |
username_element_, kAliceUsername, kAlicePassword)); |
- EXPECT_EQ(kAliceUsername, username_element_.SuggestedValue().Utf8()); |
- EXPECT_TRUE(username_element_.IsAutofilled()); |
- EXPECT_EQ(kAlicePassword, password_element_.SuggestedValue().Utf8()); |
- EXPECT_TRUE(password_element_.IsAutofilled()); |
+ CheckTextFieldsSuggestedState(kAliceUsername, true, kAlicePassword, true); |
int username_length = strlen(kAliceUsername); |
CheckUsernameSelection(3, username_length); |
} |
@@ -1278,12 +1362,9 @@ TEST_F(PasswordAutofillAgentTest, ClearPreviewWithPasswordAutofilled) { |
EXPECT_TRUE( |
password_autofill_agent_->DidClearAutofillSelection(username_element_)); |
- EXPECT_TRUE(username_element_.Value().IsEmpty()); |
EXPECT_TRUE(username_element_.SuggestedValue().IsEmpty()); |
- EXPECT_FALSE(username_element_.IsAutofilled()); |
- EXPECT_EQ(ASCIIToUTF16("sec"), password_element_.Value().Utf16()); |
EXPECT_TRUE(password_element_.SuggestedValue().IsEmpty()); |
- EXPECT_TRUE(password_element_.IsAutofilled()); |
+ CheckTextFieldsDOMState(std::string(), false, "sec", true); |
CheckUsernameSelection(0, 0); |
} |
@@ -1307,12 +1388,9 @@ TEST_F(PasswordAutofillAgentTest, ClearPreviewWithUsernameAutofilled) { |
EXPECT_TRUE( |
password_autofill_agent_->DidClearAutofillSelection(username_element_)); |
- EXPECT_EQ(ASCIIToUTF16("ali"), username_element_.Value().Utf16()); |
EXPECT_TRUE(username_element_.SuggestedValue().IsEmpty()); |
- EXPECT_TRUE(username_element_.IsAutofilled()); |
- EXPECT_TRUE(password_element_.Value().IsEmpty()); |
EXPECT_TRUE(password_element_.SuggestedValue().IsEmpty()); |
- EXPECT_FALSE(password_element_.IsAutofilled()); |
+ CheckTextFieldsDOMState("ali", true, std::string(), false); |
CheckUsernameSelection(3, 3); |
} |
@@ -1339,12 +1417,37 @@ TEST_F(PasswordAutofillAgentTest, |
EXPECT_TRUE( |
password_autofill_agent_->DidClearAutofillSelection(username_element_)); |
- EXPECT_EQ(ASCIIToUTF16("ali"), username_element_.Value().Utf16()); |
EXPECT_TRUE(username_element_.SuggestedValue().IsEmpty()); |
- EXPECT_TRUE(username_element_.IsAutofilled()); |
- EXPECT_EQ(ASCIIToUTF16("sec"), password_element_.Value().Utf16()); |
EXPECT_TRUE(password_element_.SuggestedValue().IsEmpty()); |
- EXPECT_TRUE(password_element_.IsAutofilled()); |
+ CheckTextFieldsDOMState("ali", true, "sec", true); |
+ CheckUsernameSelection(3, 3); |
+} |
+ |
+// Tests that, when interacting with the password field, |ClearPreview| properly |
+// clears previewed username and password with both being previously autofilled. |
+TEST_F(PasswordAutofillAgentTest, |
+ ClearPreviewFromPasswordWithAutofilledUsernameAndPassword) { |
+ username_element_.SetValue(WebString::FromUTF8("ali")); |
+ username_element_.SetSelectionRange(3, 3); |
+ username_element_.SetAutofilled(true); |
+ password_element_.SetValue(WebString::FromUTF8("sec")); |
+ password_element_.SetAutofilled(true); |
+ |
+ // Simulate the browser sending the login info, but set |wait_for_username| to |
+ // prevent the form from being immediately filled. |
+ fill_data_.wait_for_username = true; |
+ SimulateOnFillPasswordForm(fill_data_); |
+ |
+ CheckTextFieldsDOMState("ali", true, "sec", true); |
+ |
+ EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion( |
+ username_element_, kAliceUsername, kAlicePassword)); |
+ EXPECT_TRUE( |
+ password_autofill_agent_->DidClearAutofillSelection(password_element_)); |
+ |
+ EXPECT_TRUE(username_element_.SuggestedValue().IsEmpty()); |
+ EXPECT_TRUE(password_element_.SuggestedValue().IsEmpty()); |
+ CheckTextFieldsDOMState("ali", true, "sec", true); |
CheckUsernameSelection(3, 3); |
} |
@@ -1365,12 +1468,9 @@ TEST_F(PasswordAutofillAgentTest, |
EXPECT_TRUE( |
password_autofill_agent_->DidClearAutofillSelection(username_element_)); |
- EXPECT_TRUE(username_element_.Value().IsEmpty()); |
EXPECT_TRUE(username_element_.SuggestedValue().IsEmpty()); |
- EXPECT_FALSE(username_element_.IsAutofilled()); |
- EXPECT_TRUE(password_element_.Value().IsEmpty()); |
EXPECT_TRUE(password_element_.SuggestedValue().IsEmpty()); |
- EXPECT_FALSE(password_element_.IsAutofilled()); |
+ CheckTextFieldsDOMState(std::string(), false, std::string(), false); |
CheckUsernameSelection(0, 0); |
} |
@@ -2156,8 +2256,8 @@ TEST_F(PasswordAutofillAgentTest, FillSuggestionPasswordChangeForms) { |
CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
} |
-// Tests that a password change form is properly filled with the password when |
-// the user click on the password field. |
+// Tests that a password change form is properly filled with the |
+// username/password when the user clicks on the password field. |
TEST_F(PasswordAutofillAgentTest, |
FillSuggestionPasswordChangeFormsOnlyPassword) { |
LoadHTML(kPasswordChangeFormHTML); |
@@ -2175,7 +2275,7 @@ TEST_F(PasswordAutofillAgentTest, |
EXPECT_TRUE(password_autofill_agent_->FillSuggestion( |
password_element_, ASCIIToUTF16(kAliceUsername), |
ASCIIToUTF16(kAlicePassword))); |
- CheckTextFieldsDOMState("", false, kAlicePassword, true); |
+ CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); |
} |
// Tests that one user click on a username field is sufficient to bring up a |