Index: components/password_manager/core/browser/password_form_manager_unittest.cc |
diff --git a/components/password_manager/core/browser/password_form_manager_unittest.cc b/components/password_manager/core/browser/password_form_manager_unittest.cc |
index 5f74fe30d1f780b42ba953df0bf3f25282949072..5d9441f700caee6fa62cfb516013f98eb8564e1b 100644 |
--- a/components/password_manager/core/browser/password_form_manager_unittest.cc |
+++ b/components/password_manager/core/browser/password_form_manager_unittest.cc |
@@ -195,8 +195,8 @@ class PasswordFormManagerTest : public testing::Test { |
TEST_F(PasswordFormManagerTest, TestNewLogin) { |
PasswordFormManager manager(NULL, client(), NULL, *observed_form(), false); |
- |
SimulateMatchingPhase(&manager, false); |
+ |
// User submits credentials for the observed form. |
PasswordForm credentials = *observed_form(); |
credentials.username_value = saved_match()->username_value; |
@@ -220,6 +220,8 @@ TEST_F(PasswordFormManagerTest, TestNewLogin) { |
GetPendingCredentials(&manager)->password_value); |
EXPECT_EQ(saved_match()->username_value, |
GetPendingCredentials(&manager)->username_value); |
+ EXPECT_TRUE(GetPendingCredentials(&manager)->new_password_element.empty()); |
+ EXPECT_TRUE(GetPendingCredentials(&manager)->new_password_value.empty()); |
// Now, suppose the user re-visits the site and wants to save an additional |
// login for the site with a new username. In this case, the matching phase |
@@ -243,6 +245,47 @@ TEST_F(PasswordFormManagerTest, TestNewLogin) { |
EXPECT_TRUE(GetPendingCredentials(&manager)->preferred); |
EXPECT_EQ(new_pass, GetPendingCredentials(&manager)->password_value); |
EXPECT_EQ(new_user, GetPendingCredentials(&manager)->username_value); |
+ EXPECT_TRUE(GetPendingCredentials(&manager)->new_password_element.empty()); |
+ EXPECT_TRUE(GetPendingCredentials(&manager)->new_password_value.empty()); |
+} |
+ |
+TEST_F(PasswordFormManagerTest, TestNewLoginFromNewPasswordElement) { |
+ // Add a new password field to the test form. The PasswordFormManager should |
+ // save the password from this field, instead of the current password field. |
+ observed_form()->new_password_element = ASCIIToUTF16("NewPasswd"); |
+ |
+ PasswordFormManager manager(NULL, client(), NULL, *observed_form(), false); |
+ SimulateMatchingPhase(&manager, false); |
+ |
+ // User enters current and new credentials to the observed form. |
+ PasswordForm credentials(*observed_form()); |
+ credentials.username_value = saved_match()->username_value; |
+ credentials.password_value = saved_match()->password_value; |
+ credentials.new_password_value = ASCIIToUTF16("newpassword"); |
+ credentials.preferred = true; |
+ manager.ProvisionallySave( |
+ credentials, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
+ |
+ // Successful login. The PasswordManager would instruct PasswordFormManager |
+ // to save, which should know this is a new login. |
+ EXPECT_TRUE(manager.IsNewLogin()); |
+ EXPECT_EQ(credentials.origin, GetPendingCredentials(&manager)->origin); |
+ EXPECT_EQ(credentials.signon_realm, |
+ GetPendingCredentials(&manager)->signon_realm); |
+ EXPECT_EQ(credentials.action, GetPendingCredentials(&manager)->action); |
+ EXPECT_TRUE(GetPendingCredentials(&manager)->preferred); |
+ EXPECT_EQ(credentials.username_value, |
+ GetPendingCredentials(&manager)->username_value); |
+ |
+ // By this point, the PasswordFormManager should have promoted the new |
+ // password value to be the current password, and should have wiped the |
+ // password element names: they are likely going to be different on a login |
+ // form, so it is not worth remembering them. |
+ EXPECT_EQ(credentials.new_password_value, |
+ GetPendingCredentials(&manager)->password_value); |
+ EXPECT_TRUE(GetPendingCredentials(&manager)->password_element.empty()); |
+ EXPECT_TRUE(GetPendingCredentials(&manager)->new_password_element.empty()); |
+ EXPECT_TRUE(GetPendingCredentials(&manager)->new_password_value.empty()); |
} |
TEST_F(PasswordFormManagerTest, TestUpdatePassword) { |
@@ -257,7 +300,7 @@ TEST_F(PasswordFormManagerTest, TestUpdatePassword) { |
// origin URL (as it does in this case) than the saved_match, but we want to |
// make sure the updated password is reflected in saved_match, because that is |
// what we autofilled. |
- base::string16 new_pass = ASCIIToUTF16("newpassword"); |
+ base::string16 new_pass = ASCIIToUTF16("test2"); |
PasswordForm credentials = *observed_form(); |
credentials.username_value = saved_match()->username_value; |
credentials.password_value = new_pass; |
@@ -281,6 +324,67 @@ TEST_F(PasswordFormManagerTest, TestUpdatePassword) { |
EXPECT_EQ(new_pass, GetPendingCredentials(&manager)->password_value); |
} |
+TEST_F(PasswordFormManagerTest, TestUpdatePasswordFromNewPasswordElement) { |
+ // Add a new password field to the test form. The PasswordFormManager should |
+ // save the password from this field, instead of the current password field. |
+ observed_form()->new_password_element = ASCIIToUTF16("NewPasswd"); |
+ |
+ // Given that |observed_form| was most likely a change password form, it |
+ // should not serve as a source for updating meta-information stored with the |
+ // old credentials, such as element names, as they are likely going to be |
+ // different between change password and login forms. To test this in depth, |
+ // forcibly wipe |submit_element|, which should normally trigger updating this |
+ // field from |observed_form| in the UpdateLogin() step as a special case. We |
+ // will verify in the end that this did not happen. |
+ saved_match()->submit_element.clear(); |
+ |
+ InitializeMockStore(); |
+ TestPasswordManagerClient client_with_store(mock_store()); |
+ PasswordFormManager manager(NULL, |
+ &client_with_store, |
+ client_with_store.GetDriver(), |
+ *observed_form(), |
+ false); |
+ EXPECT_CALL(*client_with_store.GetMockDriver(), IsOffTheRecord()) |
+ .WillRepeatedly(Return(false)); |
+ SimulateMatchingPhase(&manager, true); |
+ |
+ // User submits current and new credentials to the observed form. |
+ PasswordForm credentials(*observed_form()); |
+ credentials.username_value = saved_match()->username_value; |
+ credentials.password_value = saved_match()->password_value; |
+ credentials.new_password_value = ASCIIToUTF16("test2"); |
+ credentials.preferred = true; |
+ manager.ProvisionallySave( |
+ credentials, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
+ |
+ // Successful login. The PasswordManager would instruct PasswordFormManager |
+ // to save, and since this is an update, it should know not to save as a new |
+ // login. |
+ EXPECT_FALSE(manager.IsNewLogin()); |
+ |
+ // By now, the PasswordFormManager should have promoted the new password value |
+ // already to be the current password, and should no longer maintain any info |
+ // about the new password. |
+ EXPECT_EQ(credentials.new_password_value, |
+ GetPendingCredentials(&manager)->password_value); |
+ EXPECT_TRUE(GetPendingCredentials(&manager)->new_password_element.empty()); |
+ EXPECT_TRUE(GetPendingCredentials(&manager)->new_password_value.empty()); |
+ |
+ // Trigger saving to exercise some special case handling in UpdateLogin(). |
+ PasswordForm new_credentials; |
+ EXPECT_CALL(*mock_store(), UpdateLogin(_)) |
+ .WillOnce(testing::SaveArg<0>(&new_credentials)); |
+ manager.Save(); |
+ Mock::VerifyAndClearExpectations(mock_store()); |
+ |
+ // No meta-information should be updated, only the password. |
+ EXPECT_EQ(credentials.new_password_value, new_credentials.password_value); |
+ EXPECT_EQ(saved_match()->username_element, new_credentials.username_element); |
+ EXPECT_EQ(saved_match()->password_element, new_credentials.password_element); |
+ EXPECT_EQ(saved_match()->submit_element, new_credentials.submit_element); |
+} |
+ |
TEST_F(PasswordFormManagerTest, TestIgnoreResult) { |
PasswordFormManager manager(NULL, client(), NULL, *observed_form(), false); |
@@ -436,30 +540,52 @@ TEST_F(PasswordFormManagerTest, TestValidForms) { |
credentials.username_value = saved_match()->username_value; |
credentials.password_value = saved_match()->password_value; |
+ // An alternate version of the form that also has a new_password_element. |
+ PasswordForm new_credentials(*observed_form()); |
+ new_credentials.new_password_element = ASCIIToUTF16("NewPasswd"); |
+ new_credentials.new_password_value = ASCIIToUTF16("test1new"); |
+ |
// Form with both username_element and password_element. |
PasswordFormManager manager1(NULL, NULL, NULL, credentials, false); |
SimulateMatchingPhase(&manager1, false); |
EXPECT_TRUE(manager1.HasValidPasswordForm()); |
+ // Form with username_element, password_element, and new_password_element. |
+ PasswordFormManager manager2(NULL, NULL, NULL, new_credentials, false); |
+ SimulateMatchingPhase(&manager2, false); |
+ EXPECT_TRUE(manager2.HasValidPasswordForm()); |
+ |
+ // Form with username_element and only new_password_element. |
+ new_credentials.password_element.clear(); |
+ PasswordFormManager manager3(NULL, NULL, NULL, new_credentials, false); |
+ SimulateMatchingPhase(&manager3, false); |
+ EXPECT_TRUE(manager3.HasValidPasswordForm()); |
+ |
// Form without a username_element but with a password_element. |
credentials.username_element.clear(); |
- PasswordFormManager manager2(NULL, NULL, NULL, credentials, false); |
- SimulateMatchingPhase(&manager2, false); |
- EXPECT_FALSE(manager2.HasValidPasswordForm()); |
+ PasswordFormManager manager4(NULL, NULL, NULL, credentials, false); |
+ SimulateMatchingPhase(&manager4, false); |
+ EXPECT_FALSE(manager4.HasValidPasswordForm()); |
+ |
+ // Form without a username_element but with a new_password_element. |
+ new_credentials.username_element.clear(); |
+ PasswordFormManager manager5(NULL, NULL, NULL, new_credentials, false); |
+ SimulateMatchingPhase(&manager5, false); |
+ EXPECT_FALSE(manager5.HasValidPasswordForm()); |
// Form without a password_element but with a username_element. |
credentials.username_element = saved_match()->username_element; |
credentials.password_element.clear(); |
- PasswordFormManager manager3(NULL, NULL, NULL, credentials, false); |
- SimulateMatchingPhase(&manager3, false); |
- EXPECT_FALSE(manager3.HasValidPasswordForm()); |
+ PasswordFormManager manager6(NULL, NULL, NULL, credentials, false); |
+ SimulateMatchingPhase(&manager6, false); |
+ EXPECT_FALSE(manager6.HasValidPasswordForm()); |
// Form with neither a password_element nor a username_element. |
credentials.username_element.clear(); |
credentials.password_element.clear(); |
- PasswordFormManager manager4(NULL, NULL, NULL, credentials, false); |
- SimulateMatchingPhase(&manager4, false); |
- EXPECT_FALSE(manager4.HasValidPasswordForm()); |
+ PasswordFormManager manager7(NULL, NULL, NULL, credentials, false); |
+ SimulateMatchingPhase(&manager7, false); |
+ EXPECT_FALSE(manager7.HasValidPasswordForm()); |
} |
TEST_F(PasswordFormManagerTest, TestValidFormsBasic) { |