| Index: components/password_manager/core/browser/login_database_unittest.cc
|
| diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc
|
| index 39ac20c43ab4781a8b5c09fb13f26f5cb44f94ee..13f216c023fa508a1a8ae7c8974fe1fda78ba486 100644
|
| --- a/components/password_manager/core/browser/login_database_unittest.cc
|
| +++ b/components/password_manager/core/browser/login_database_unittest.cc
|
| @@ -7,6 +7,7 @@
|
| #include "base/basictypes.h"
|
| #include "base/file_util.h"
|
| #include "base/files/scoped_temp_dir.h"
|
| +#include "base/memory/scoped_vector.h"
|
| #include "base/path_service.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| @@ -704,6 +705,55 @@ TEST_F(LoginDatabaseTest, UpdateIncompleteCredentials) {
|
| ClearResults(&result);
|
| }
|
|
|
| +TEST_F(LoginDatabaseTest, UpdateOverlappingCredentials) {
|
| + // Save an incomplete form. Note that it only has a few fields set, ex. it's
|
| + // missing 'action', 'username_element' and 'password_element'. Such forms
|
| + // are sometimes inserted during import from other browsers (which may not
|
| + // store this info).
|
| + PasswordForm incomplete_form;
|
| + incomplete_form.origin = GURL("http://accounts.google.com/LoginAuth");
|
| + incomplete_form.signon_realm = "http://accounts.google.com/";
|
| + incomplete_form.username_value = ASCIIToUTF16("my_username");
|
| + incomplete_form.password_value = ASCIIToUTF16("my_password");
|
| + incomplete_form.ssl_valid = false;
|
| + incomplete_form.preferred = true;
|
| + incomplete_form.blacklisted_by_user = false;
|
| + incomplete_form.scheme = PasswordForm::SCHEME_HTML;
|
| + EXPECT_TRUE(db_.AddLogin(incomplete_form));
|
| +
|
| + // Save a complete version of the previous form. Both forms could exist if
|
| + // the user created the complete version before importing the incomplete
|
| + // version from a different browser.
|
| + PasswordForm complete_form = incomplete_form;
|
| + complete_form.action = GURL("http://accounts.google.com/Login");
|
| + complete_form.username_element = ASCIIToUTF16("username_element");
|
| + complete_form.password_element = ASCIIToUTF16("password_element");
|
| + complete_form.submit_element = ASCIIToUTF16("submit");
|
| + EXPECT_TRUE(db_.AddLogin(complete_form));
|
| +
|
| + // Make sure both passwords exist.
|
| + ScopedVector<autofill::PasswordForm> result;
|
| + EXPECT_TRUE(db_.GetAutofillableLogins(&result.get()));
|
| + ASSERT_EQ(2U, result.size());
|
| + result.clear();
|
| +
|
| + // Simulate the user changing their password.
|
| + complete_form.password_value = ASCIIToUTF16("new_password");
|
| + EXPECT_TRUE(db_.UpdateLogin(complete_form, NULL));
|
| +
|
| + // Only one updated form should exist now.
|
| + EXPECT_TRUE(db_.GetAutofillableLogins(&result.get()));
|
| + ASSERT_EQ(1U, result.size());
|
| +
|
| + PasswordForm expected_form(complete_form);
|
| +#if defined(OS_MACOSX) && !defined(OS_IOS)
|
| + // On Mac, passwords are not stored in login database, instead they're in
|
| + // the keychain.
|
| + expected_form.password_value.clear();
|
| +#endif // OS_MACOSX && !OS_IOS
|
| + EXPECT_EQ(expected_form, *result[0]);
|
| +}
|
| +
|
| #if defined(OS_POSIX)
|
| // Only the current user has permission to read the database.
|
| //
|
|
|