| 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 944dfdd2d35d4a8588c112d99c573c6311166d26..6080ff885124868e7bd9562b7b3114739310f56c 100644
|
| --- a/components/password_manager/core/browser/password_form_manager_unittest.cc
|
| +++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
|
| @@ -105,7 +105,8 @@ class TestPasswordManagerClient : public StubPasswordManagerClient {
|
| public:
|
| explicit TestPasswordManagerClient(PasswordStore* password_store)
|
| : password_store_(password_store),
|
| - driver_(new NiceMock<MockPasswordManagerDriver>) {
|
| + driver_(new NiceMock<MockPasswordManagerDriver>),
|
| + is_update_password_ui_enabled_(false) {
|
| prefs_.registry()->RegisterBooleanPref(prefs::kPasswordManagerSavingEnabled,
|
| true);
|
| }
|
| @@ -133,12 +134,20 @@ class TestPasswordManagerClient : public StubPasswordManagerClient {
|
|
|
| void KillDriver() { driver_.reset(); }
|
|
|
| + bool IsUpdatePasswordUIEnabled() const override {
|
| + return is_update_password_ui_enabled_;
|
| + }
|
| + void set_is_update_password_ui_enabled(bool value) {
|
| + is_update_password_ui_enabled_ = value;
|
| + }
|
| +
|
| private:
|
| autofill::PasswordForm form_to_filter_;
|
|
|
| TestingPrefServiceSimple prefs_;
|
| PasswordStore* password_store_;
|
| scoped_ptr<MockPasswordManagerDriver> driver_;
|
| + bool is_update_password_ui_enabled_;
|
| };
|
|
|
| class TestPasswordManager : public PasswordManager {
|
| @@ -1582,6 +1591,63 @@ TEST_F(PasswordFormManagerTest, TestSuggestingPasswordChangeForms) {
|
| EXPECT_TRUE(password_manager.GetLatestWaitForUsername());
|
| }
|
|
|
| +TEST_F(PasswordFormManagerTest, TestUpdateMethod) {
|
| + // 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();
|
| +
|
| + TestPasswordManagerClient client_with_store(mock_store());
|
| + client_with_store.set_is_update_password_ui_enabled(true);
|
| + PasswordFormManager manager(nullptr, &client_with_store,
|
| + client_with_store.driver(), *observed_form(),
|
| + false);
|
| + SimulateMatchingPhase(&manager, RESULT_MATCH_FOUND);
|
| +
|
| + // User submits current and new credentials to the observed form.
|
| + PasswordForm credentials(*observed_form());
|
| + credentials.username_element.clear();
|
| + 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.Update(*saved_match());
|
| + 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, WipeStoreCopyIfOutdated_BeforeStoreCallback) {
|
| PasswordForm form(*saved_match());
|
| ASSERT_FALSE(form.password_value.empty());
|
|
|