| 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 1228d58ebd24f0464d2be42912e5575bdcd391bf..a3399cd47ae732545fd08d488ce8b4c21cd96661 100644
|
| --- a/components/password_manager/core/browser/password_form_manager_unittest.cc
|
| +++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
|
| @@ -1004,4 +1004,71 @@ TEST_F(PasswordFormManagerTest,
|
| PasswordFormManager::RESULT_MANDATORY_ATTRIBUTES_MATCH);
|
| }
|
|
|
| +TEST_F(PasswordFormManagerTest, CorrectlyUpdatePasswordsWithSameUsername) {
|
| + // Need a MessageLoop for callbacks.
|
| + base::MessageLoop message_loop;
|
| + scoped_refptr<TestPasswordStore> password_store = new TestPasswordStore;
|
| + CHECK(password_store->Init(syncer::SyncableService::StartSyncFlare(), ""));
|
| +
|
| + TestPasswordManagerClient client_with_store(password_store.get());
|
| + TestPasswordManager password_manager(&client_with_store);
|
| + EXPECT_CALL(*client_with_store.GetMockDriver(),
|
| + AllowPasswordGenerationForForm(_)).Times(2);
|
| + EXPECT_CALL(*client_with_store.GetMockDriver(), IsOffTheRecord())
|
| + .WillRepeatedly(Return(false));
|
| +
|
| + // Add two credentials with the same username. Both should score the same
|
| + // and be seen as candidates to autofill.
|
| + PasswordForm first(*saved_match());
|
| + first.action = observed_form()->action;
|
| + first.password_value = ASCIIToUTF16("first");
|
| + password_store->AddLogin(first);
|
| +
|
| + PasswordForm second(first);
|
| + second.origin = GURL("http://accounts.google.com/a/AddLogin");
|
| + second.password_value = ASCIIToUTF16("second");
|
| + second.preferred = false;
|
| + password_store->AddLogin(second);
|
| +
|
| + PasswordFormManager storing_manager(&password_manager,
|
| + &client_with_store,
|
| + client_with_store.GetDriver(),
|
| + *observed_form(),
|
| + false);
|
| + storing_manager.FetchMatchingLoginsFromPasswordStore(
|
| + PasswordStore::ALLOW_PROMPT);
|
| + RunAllPendingTasks();
|
| +
|
| + // We always take the last credential with a particular username, regardless
|
| + // of which ones are labeled preferred.
|
| + EXPECT_EQ(ASCIIToUTF16("second"),
|
| + storing_manager.preferred_match()->password_value);
|
| +
|
| + PasswordForm login(*observed_form());
|
| + login.username_value = saved_match()->username_value;
|
| + login.password_value = ASCIIToUTF16("third");
|
| + login.preferred = true;
|
| + storing_manager.ProvisionallySave(
|
| + login, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES);
|
| +
|
| + EXPECT_FALSE(storing_manager.IsNewLogin());
|
| + storing_manager.Save();
|
| + RunAllPendingTasks();
|
| +
|
| + PasswordFormManager retrieving_manager(&password_manager,
|
| + &client_with_store,
|
| + client_with_store.GetDriver(),
|
| + *observed_form(),
|
| + false);
|
| +
|
| + retrieving_manager.FetchMatchingLoginsFromPasswordStore(
|
| + PasswordStore::ALLOW_PROMPT);
|
| + RunAllPendingTasks();
|
| +
|
| + // Make sure that the preferred match is updated appropriately.
|
| + EXPECT_EQ(ASCIIToUTF16("third"),
|
| + retrieving_manager.preferred_match()->password_value);
|
| + password_store->Shutdown();
|
| +}
|
| +
|
| } // namespace password_manager
|
|
|