Index: chrome/browser/password_manager/password_form_manager_unittest.cc |
diff --git a/chrome/browser/password_manager/password_form_manager_unittest.cc b/chrome/browser/password_manager/password_form_manager_unittest.cc |
index c46a30a141537b50495d555f521bab9e84b495e4..9a011ade83a381672d067dcc9049a764a0dc7c02 100644 |
--- a/chrome/browser/password_manager/password_form_manager_unittest.cc |
+++ b/chrome/browser/password_manager/password_form_manager_unittest.cc |
@@ -15,6 +15,7 @@ |
#include "chrome/browser/profiles/profile_manager.h" |
#include "chrome/test/base/testing_profile.h" |
#include "components/autofill/core/common/password_form.h" |
+#include "components/password_manager/core/browser/mock_password_store.h" |
#include "components/password_manager/core/browser/password_store.h" |
#include "components/password_manager/core/browser/test_password_store.h" |
#include "content/public/test/test_utils.h" |
@@ -25,6 +26,7 @@ using base::ASCIIToUTF16; |
using ::testing::_; |
using ::testing::Eq; |
using ::testing::Mock; |
+using ::testing::Return; |
namespace autofill { |
class AutofillManager; |
@@ -123,6 +125,19 @@ class PasswordFormManagerTest : public testing::Test { |
virtual void TearDown() { |
delete profile_; |
+ if (mock_store_) |
+ mock_store_->Shutdown(); |
+ } |
+ |
+ void InitializeMockStore() { |
+ if (!mock_store_) { |
+ mock_store_ = new MockPasswordStore(); |
+ ASSERT_TRUE(mock_store_); |
+ } |
+ } |
+ |
+ MockPasswordStore* mock_store() const { |
+ return mock_store_.get(); |
} |
PasswordForm* GetPendingCredentials(PasswordFormManager* p) { |
@@ -178,6 +193,7 @@ class PasswordFormManagerTest : public testing::Test { |
PasswordForm observed_form_; |
PasswordForm saved_match_; |
Profile* profile_; |
+ scoped_refptr<MockPasswordStore> mock_store_; |
}; |
TEST_F(PasswordFormManagerTest, TestNewLogin) { |
@@ -660,3 +676,69 @@ TEST_F(PasswordFormManagerTest, TestSanitizePossibleUsernames) { |
expected.push_back(ASCIIToUTF16("random")); |
EXPECT_THAT(credentials.other_possible_usernames, Eq(expected)); |
} |
+ |
+TEST_F(PasswordFormManagerTest, TestUpdateIncompleteCredentials) { |
+ InitializeMockStore(); |
+ |
+ // We've found this form on a website: |
+ PasswordForm encountered_form; |
+ encountered_form.origin = GURL("http://accounts.google.com/LoginAuth"); |
+ encountered_form.signon_realm = "http://accounts.google.com/"; |
+ encountered_form.action = GURL("http://accounts.google.com/Login"); |
+ encountered_form.username_element = ASCIIToUTF16("Email"); |
+ encountered_form.password_element = ASCIIToUTF16("Passwd"); |
+ encountered_form.submit_element = ASCIIToUTF16("signIn"); |
+ |
+ TestPasswordManagerClient client(profile(), mock_store()); |
+ MockPasswordManagerDriver driver; |
+ EXPECT_CALL(driver, IsOffTheRecord()).WillRepeatedly(Return(false)); |
+ EXPECT_CALL(driver, AllowPasswordGenerationForForm(_)); |
+ |
+ TestPasswordManager manager(&client); |
+ PasswordFormManager form_manager(&manager, |
+ &client, |
+ &driver, |
+ encountered_form, |
+ false); |
+ |
+ const PasswordStore::AuthorizationPromptPolicy auth_policy = |
+ PasswordStore::DISALLOW_PROMPT; |
+ EXPECT_CALL(*mock_store(), GetLogins(encountered_form, |
+ auth_policy, |
+ &form_manager)); |
+ form_manager.FetchMatchingLoginsFromPasswordStore(auth_policy); |
+ |
+ // Password store only has these incomplete credentials. |
+ PasswordForm* incomplete_form = new PasswordForm(); |
+ incomplete_form->origin = GURL("http://accounts.google.com/LoginAuth"); |
+ incomplete_form->signon_realm = "http://accounts.google.com/"; |
+ incomplete_form->password_value = ASCIIToUTF16("my_password"); |
+ incomplete_form->username_value = ASCIIToUTF16("my_username"); |
+ incomplete_form->preferred = true; |
+ incomplete_form->ssl_valid = false; |
+ incomplete_form->scheme = PasswordForm::SCHEME_HTML; |
+ |
+ // We expect to see this form eventually sent to the Password store. It |
+ // has password/username values from the store and 'username_element', |
+ // 'password_element', 'submit_element' and 'action' fields copied from |
+ // the encountered form. |
+ PasswordForm complete_form(*incomplete_form); |
+ complete_form.action = encountered_form.action; |
+ complete_form.password_element = encountered_form.password_element; |
+ complete_form.username_element = encountered_form.username_element; |
+ complete_form.submit_element = encountered_form.submit_element; |
+ |
+ // Feed the incomplete credentials to the manager. |
+ std::vector<PasswordForm*> results; |
+ results.push_back(incomplete_form); // Takes ownership. |
+ form_manager.OnRequestDone(results); |
+ |
+ form_manager.ProvisionallySave( |
+ complete_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
+ // By now that form has been used once. |
+ complete_form.times_used = 1; |
+ |
+ // Check that PasswordStore receives an update request with the complete form. |
+ EXPECT_CALL(*mock_store(), UpdateLogin(complete_form)); |
+ form_manager.Save(); |
+} |