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 6699623c9c0ab361825a8592ad9dd28fd909cb4a..0957eab4b9ccde17b3e174b9d261082f2e77d618 100644 |
--- a/components/password_manager/core/browser/password_form_manager_unittest.cc |
+++ b/components/password_manager/core/browser/password_form_manager_unittest.cc |
@@ -6,17 +6,17 @@ |
#include <map> |
#include <memory> |
+#include <set> |
#include <utility> |
#include "base/feature_list.h" |
#include "base/macros.h" |
#include "base/memory/ptr_util.h" |
-#include "base/run_loop.h" |
+#include "base/message_loop/message_loop.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/test/histogram_tester.h" |
#include "base/test/scoped_feature_list.h" |
#include "base/test/user_action_tester.h" |
-#include "build/build_config.h" |
#include "components/autofill/core/browser/autofill_manager.h" |
#include "components/autofill/core/browser/proto/server.pb.h" |
#include "components/autofill/core/browser/test_autofill_client.h" |
@@ -24,12 +24,11 @@ |
#include "components/autofill/core/browser/test_personal_data_manager.h" |
#include "components/autofill/core/common/autofill_pref_names.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/fake_form_fetcher.h" |
#include "components/password_manager/core/browser/password_manager.h" |
#include "components/password_manager/core/browser/password_manager_driver.h" |
#include "components/password_manager/core/browser/password_manager_metrics_util.h" |
#include "components/password_manager/core/browser/password_manager_test_utils.h" |
-#include "components/password_manager/core/browser/password_store.h" |
#include "components/password_manager/core/browser/statistics_table.h" |
#include "components/password_manager/core/browser/stub_credentials_filter.h" |
#include "components/password_manager/core/browser/stub_form_saver.h" |
@@ -50,7 +49,6 @@ using autofill::FieldPropertiesMask; |
using autofill::PasswordForm; |
using base::ASCIIToUTF16; |
using ::testing::_; |
-using ::testing::ElementsAre; |
using ::testing::IsEmpty; |
using ::testing::Mock; |
using ::testing::NiceMock; |
@@ -97,16 +95,6 @@ class MockFormSaver : public StubFormSaver { |
DISALLOW_COPY_AND_ASSIGN(MockFormSaver); |
}; |
-// Invokes the password store consumer with a copy of all forms. |
-ACTION_P4(InvokeConsumer, form1, form2, form3, form4) { |
- std::vector<std::unique_ptr<PasswordForm>> result; |
- result.push_back(base::MakeUnique<PasswordForm>(form1)); |
- result.push_back(base::MakeUnique<PasswordForm>(form2)); |
- result.push_back(base::MakeUnique<PasswordForm>(form3)); |
- result.push_back(base::MakeUnique<PasswordForm>(form4)); |
- arg0->OnGetPasswordStoreResults(std::move(result)); |
-} |
- |
MATCHER_P(CheckUsername, username_value, "Username incorrect") { |
return arg.username_value == username_value; |
} |
@@ -224,10 +212,6 @@ MATCHER_P(CheckFieldPropertiesMasksUpload, |
return true; |
} |
-void ClearVector(std::vector<std::unique_ptr<PasswordForm>>* results) { |
- results->clear(); |
-} |
- |
class MockAutofillDownloadManager : public autofill::AutofillDownloadManager { |
public: |
MockAutofillDownloadManager( |
@@ -303,41 +287,15 @@ class MockPasswordManagerDriver : public StubPasswordManagerDriver { |
NiceMock<MockAutofillManager> mock_autofill_manager_; |
}; |
-class MockStoreResultFilter : public StubCredentialsFilter { |
- public: |
- // This method is called by StubCredentialsFilter::FilterResults. |
- MOCK_CONST_METHOD1(FilterResultsPtr, |
- void(std::vector<std::unique_ptr<PasswordForm>>* results)); |
-}; |
- |
class TestPasswordManagerClient : public StubPasswordManagerClient { |
public: |
- explicit TestPasswordManagerClient(PasswordStore* password_store) |
- : password_store_(password_store), |
- driver_(new NiceMock<MockPasswordManagerDriver>), |
- filter_all_results_(false) { |
+ TestPasswordManagerClient() |
+ : driver_(new NiceMock<MockPasswordManagerDriver>) { |
prefs_.registry()->RegisterBooleanPref(prefs::kPasswordManagerSavingEnabled, |
true); |
} |
- // After this method is called, the filter returned by GetStoreResultFilter() |
- // will filter out all forms. |
- void FilterAllResults() { |
- filter_all_results_ = true; |
- |
- // EXPECT_CALL rather than ON_CALL, because if the test needs the |
- // filtering, then it needs it called. |
- EXPECT_CALL(all_filter_, FilterResultsPtr(_)) |
- .Times(testing::AtLeast(1)) |
- .WillRepeatedly(testing::Invoke(ClearVector)); |
- } |
- |
- const CredentialsFilter* GetStoreResultFilter() const override { |
- return filter_all_results_ ? &all_filter_ : &none_filter_; |
- } |
- |
PrefService* GetPrefs() override { return &prefs_; } |
- PasswordStore* GetPasswordStore() const override { return password_store_; } |
MockPasswordManagerDriver* mock_driver() { return driver_.get(); } |
@@ -351,29 +309,14 @@ class TestPasswordManagerClient : public StubPasswordManagerClient { |
private: |
TestingPrefServiceSimple prefs_; |
- PasswordStore* password_store_; |
std::unique_ptr<MockPasswordManagerDriver> driver_; |
- |
- // Filters to remove all and no results, respectively, in FilterResults. |
- NiceMock<MockStoreResultFilter> all_filter_; |
- NiceMock<MockStoreResultFilter> none_filter_; |
- bool filter_all_results_; |
}; |
} // namespace |
class PasswordFormManagerTest : public testing::Test { |
public: |
- PasswordFormManagerTest() {} |
- |
- // Types of possible outcomes of simulated matching, see |
- // SimulateMatchingPhase. |
- enum ResultOfSimulatedMatching { |
- RESULT_NO_MATCH, |
- RESULT_SAVED_MATCH = 1 << 0, // Include saved_match_ in store results. |
- RESULT_PSL_MATCH = 1 << 1, // Include psl_saved_match_ in store results. |
- }; |
- typedef int ResultOfSimulatedMatchingMask; |
+ PasswordFormManagerTest() { fake_form_fetcher_.Fetch(); } |
void SetUp() override { |
observed_form_.origin = GURL("http://accounts.google.com/a/LoginAuth"); |
@@ -415,42 +358,10 @@ class PasswordFormManagerTest : public testing::Test { |
field.form_control_type = "password"; |
saved_match_.form_data.fields.push_back(field); |
- mock_store_ = new NiceMock<MockPasswordStore>(); |
- ON_CALL(*mock_store_, GetSiteStatsMock(_)) |
- .WillByDefault(Return(std::vector<InteractionsStats*>())); |
- client_.reset(new TestPasswordManagerClient(mock_store_.get())); |
- password_manager_.reset(new PasswordManager(client_.get())); |
- EXPECT_CALL(*mock_store_, |
- GetLogins(PasswordStore::FormDigest(observed_form_), _)); |
+ password_manager_.reset(new PasswordManager(&client_)); |
form_manager_.reset(new PasswordFormManager( |
- password_manager_.get(), client_.get(), client_.get()->driver(), |
- observed_form_, base::MakeUnique<NiceMock<MockFormSaver>>())); |
- Mock::VerifyAndClearExpectations(mock_store_.get()); |
- } |
- |
- void TearDown() override { |
- if (mock_store_.get()) |
- mock_store_->ShutdownOnUIThread(); |
- } |
- |
- MockPasswordStore* mock_store() const { return mock_store_.get(); } |
- |
- void SimulateMatchingPhase(PasswordFormManager* p, |
- ResultOfSimulatedMatchingMask result) { |
- if (result == RESULT_NO_MATCH) { |
- p->OnGetPasswordStoreResults( |
- std::vector<std::unique_ptr<PasswordForm>>()); |
- return; |
- } |
- |
- std::vector<std::unique_ptr<PasswordForm>> result_form; |
- if (result & RESULT_SAVED_MATCH) { |
- result_form.push_back(base::MakeUnique<PasswordForm>(saved_match_)); |
- } |
- if (result & RESULT_PSL_MATCH) { |
- result_form.push_back(base::MakeUnique<PasswordForm>(psl_saved_match_)); |
- } |
- p->OnGetPasswordStoreResults(std::move(result_form)); |
+ password_manager_.get(), &client_, client_.driver(), observed_form_, |
+ base::MakeUnique<NiceMock<MockFormSaver>>(), &fake_form_fetcher_)); |
} |
// Save saved_match() for observed_form() where |observed_form_data|, |
@@ -465,28 +376,29 @@ class PasswordFormManagerTest : public testing::Test { |
form.form_data = observed_form_data; |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager( |
password_manager(), client(), client()->driver(), form, |
- base::MakeUnique<NiceMock<MockFormSaver>>()); |
- std::vector<std::unique_ptr<PasswordForm>> result; |
- result.push_back(CreateSavedMatch(false)); |
- result[0]->generation_upload_status = status; |
- result[0]->times_used = times_used; |
+ base::MakeUnique<NiceMock<MockFormSaver>>(), &fetcher); |
+ PasswordForm match = CreateSavedMatch(false); |
+ match.generation_upload_status = status; |
+ match.times_used = times_used; |
PasswordForm form_to_save(form); |
form_to_save.preferred = true; |
form_to_save.username_element = ASCIIToUTF16("observed-username-field"); |
- form_to_save.username_value = result[0]->username_value; |
- form_to_save.password_value = result[0]->password_value; |
+ form_to_save.username_value = match.username_value; |
+ form_to_save.password_value = match.password_value; |
// When we're voting for an account creation form, we should also vote |
// for its username field. |
base::string16 username_vote = |
(field_type && *field_type == autofill::ACCOUNT_CREATION_PASSWORD) |
- ? result[0]->username_element |
+ ? match.username_element |
: base::string16(); |
- form_manager.OnGetPasswordStoreResults(std::move(result)); |
+ fetcher.SetNonFederated({&match}, 0u); |
std::string expected_login_signature; |
autofill::FormStructure observed_structure(observed_form_data); |
autofill::FormStructure pending_structure(saved_match()->form_data); |
@@ -541,11 +453,12 @@ class PasswordFormManagerTest : public testing::Test { |
field.form_control_type = "password"; |
observed_form()->form_data.fields.push_back(field); |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager( |
password_manager(), client(), client()->driver(), *observed_form(), |
- base::MakeUnique<NiceMock<MockFormSaver>>()); |
- |
- SimulateMatchingPhase(&form_manager, RESULT_SAVED_MATCH); |
+ base::MakeUnique<NiceMock<MockFormSaver>>(), &fetcher); |
+ fetcher.SetNonFederated({saved_match()}, 0u); |
// User submits current and new credentials to the observed form. |
PasswordForm submitted_form(*observed_form()); |
@@ -671,12 +584,13 @@ class PasswordFormManagerTest : public testing::Test { |
saved_match()->password_value + ASCIIToUTF16("1"); |
} |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager( |
password_manager(), client(), client()->driver(), form, |
- base::MakeUnique<NiceMock<MockFormSaver>>()); |
+ base::MakeUnique<NiceMock<MockFormSaver>>(), &fetcher); |
- std::vector<std::unique_ptr<PasswordForm>> result; |
- form_manager.OnGetPasswordStoreResults(std::move(result)); |
+ fetcher.SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
autofill::ServerFieldTypeSet expected_available_field_types; |
expected_available_field_types.insert(autofill::USERNAME); |
@@ -717,19 +631,20 @@ class PasswordFormManagerTest : public testing::Test { |
PasswordForm* observed_form() { return &observed_form_; } |
PasswordForm* saved_match() { return &saved_match_; } |
PasswordForm* psl_saved_match() { return &psl_saved_match_; } |
- std::unique_ptr<PasswordForm> CreateSavedMatch(bool blacklisted) { |
- // Owned by the caller of this method. |
- auto match = base::MakeUnique<PasswordForm>(saved_match_); |
- match->blacklisted_by_user = blacklisted; |
+ PasswordForm CreateSavedMatch(bool blacklisted) { |
+ PasswordForm match = saved_match_; |
+ match.blacklisted_by_user = blacklisted; |
return match; |
} |
- TestPasswordManagerClient* client() { return client_.get(); } |
+ TestPasswordManagerClient* client() { return &client_; } |
PasswordManager* password_manager() { return password_manager_.get(); } |
PasswordFormManager* form_manager() { return form_manager_.get(); } |
+ FakeFormFetcher* fake_form_fetcher() { return &fake_form_fetcher_; } |
+ |
// To spare typing for PasswordFormManager instances which need no driver. |
const base::WeakPtr<PasswordManagerDriver> kNoDriver; |
@@ -740,10 +655,10 @@ class PasswordFormManagerTest : public testing::Test { |
PasswordForm observed_form_; |
PasswordForm saved_match_; |
PasswordForm psl_saved_match_; |
- scoped_refptr<NiceMock<MockPasswordStore>> mock_store_; |
- std::unique_ptr<TestPasswordManagerClient> client_; |
+ TestPasswordManagerClient client_; |
std::unique_ptr<PasswordManager> password_manager_; |
std::unique_ptr<PasswordFormManager> form_manager_; |
+ FakeFormFetcher fake_form_fetcher_; |
}; |
class PasswordFormManagerFillOnAccountSelectTest |
@@ -756,8 +671,9 @@ class PasswordFormManagerFillOnAccountSelectTest |
base::test::ScopedFeatureList scoped_feature_list_; |
}; |
+// Test provisionally saving a new login. |
TEST_F(PasswordFormManagerTest, TestNewLogin) { |
- SimulateMatchingPhase(form_manager(), RESULT_NO_MATCH); |
+ fake_form_fetcher()->SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
// User submits credentials for the observed form. |
PasswordForm credentials = *observed_form(); |
@@ -788,26 +704,25 @@ TEST_F(PasswordFormManagerTest, TestNewLogin) { |
EXPECT_TRUE(form_manager()->pending_credentials().new_password_value.empty()); |
} |
+// Test provisionally saving a new login in presence of other saved logins. |
TEST_F(PasswordFormManagerTest, TestAdditionalLogin) { |
- // 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 |
- // will yield the previously saved login. |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
- // Set up the new login. |
+ fake_form_fetcher()->SetNonFederated({saved_match()}, 0u); |
+ |
base::string16 new_user = ASCIIToUTF16("newuser"); |
base::string16 new_pass = ASCIIToUTF16("newpass"); |
+ ASSERT_NE(new_user, saved_match()->username_value); |
- PasswordForm credentials = *observed_form(); |
- credentials.username_value = new_user; |
- credentials.password_value = new_pass; |
- credentials.preferred = true; |
+ PasswordForm new_login = *observed_form(); |
+ new_login.username_value = new_user; |
+ new_login.password_value = new_pass; |
+ new_login.preferred = true; |
form_manager()->ProvisionallySave( |
- credentials, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
+ new_login, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
- // Again, the PasswordFormManager should know this is still a new login. |
+ // The username value differs from the saved match, so this is a new login. |
EXPECT_TRUE(form_manager()->IsNewLogin()); |
- // And make sure everything squares up again. |
+ |
EXPECT_EQ(observed_form()->origin.spec(), |
form_manager()->pending_credentials().origin.spec()); |
EXPECT_EQ(observed_form()->signon_realm, |
@@ -820,16 +735,18 @@ TEST_F(PasswordFormManagerTest, TestAdditionalLogin) { |
EXPECT_TRUE(form_manager()->pending_credentials().new_password_value.empty()); |
} |
+// Test blacklisting in the presence of saved results. |
TEST_F(PasswordFormManagerTest, TestBlacklist) { |
saved_match()->origin = observed_form()->origin; |
saved_match()->action = observed_form()->action; |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
- // Set up the new login. |
- PasswordForm credentials = *observed_form(); |
- credentials.username_value = ASCIIToUTF16("newuser"); |
- credentials.password_value = ASCIIToUTF16("newpass"); |
+ fake_form_fetcher()->SetNonFederated({saved_match()}, 0u); |
+ |
+ PasswordForm new_login = *observed_form(); |
+ new_login.username_value = ASCIIToUTF16("newuser"); |
+ new_login.password_value = ASCIIToUTF16("newpass"); |
+ // Pretend Chrome detected a form submission with |new_login|. |
form_manager()->ProvisionallySave( |
- credentials, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
+ new_login, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
EXPECT_TRUE(form_manager()->IsNewLogin()); |
EXPECT_EQ(observed_form()->origin.spec(), |
@@ -839,64 +756,72 @@ TEST_F(PasswordFormManagerTest, TestBlacklist) { |
const PasswordForm pending_form = form_manager()->pending_credentials(); |
PasswordForm actual_add_form; |
+ // Now pretend the user wants to never save passwords on this origin. Chrome |
+ // is supposed to only request blacklisting of a single form. |
EXPECT_CALL(MockFormSaver::Get(form_manager()), PermanentlyBlacklist(_)) |
.WillOnce(SaveArgPointee<0>(&actual_add_form)); |
form_manager()->PermanentlyBlacklist(); |
EXPECT_EQ(pending_form, form_manager()->pending_credentials()); |
+ // The PasswordFormManager should have updated its knowledge of blacklisting |
+ // without waiting for PasswordStore updates. |
EXPECT_TRUE(form_manager()->IsBlacklisted()); |
EXPECT_THAT(form_manager()->blacklisted_matches(), |
- ElementsAre(Pointee(actual_add_form))); |
+ UnorderedElementsAre(Pointee(actual_add_form))); |
} |
+// Test that stored blacklisted forms are correctly evaluated for whether they |
+// apply to the observed form. |
TEST_F(PasswordFormManagerTest, TestBlacklistMatching) { |
observed_form()->origin = GURL("http://accounts.google.com/a/LoginAuth"); |
observed_form()->action = GURL("http://accounts.google.com/a/Login"); |
observed_form()->signon_realm = "http://accounts.google.com"; |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), *observed_form(), |
- base::MakeUnique<MockFormSaver>()); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
- // Doesn't match because of PSL. |
+ // Doesn't apply because it is just a PSL match of the observed form. |
PasswordForm blacklisted_psl = *observed_form(); |
blacklisted_psl.signon_realm = "http://m.accounts.google.com"; |
blacklisted_psl.is_public_suffix_match = true; |
blacklisted_psl.blacklisted_by_user = true; |
- // Doesn't match because of different origin. |
+ // Doesn't apply because of different origin. |
PasswordForm blacklisted_not_match = *observed_form(); |
blacklisted_not_match.origin = GURL("http://google.com/a/LoginAuth"); |
blacklisted_not_match.blacklisted_by_user = true; |
- // Doesn't match because of different username element and different page. |
+ // Doesn't apply because of different username element and different page. |
PasswordForm blacklisted_not_match2 = *observed_form(); |
blacklisted_not_match2.origin = GURL("http://accounts.google.com/a/Login123"); |
blacklisted_not_match2.username_element = ASCIIToUTF16("Element"); |
blacklisted_not_match2.blacklisted_by_user = true; |
- // Doesn't match because of different PasswordForm::Scheme. |
+ // Doesn't apply because of different PasswordForm::Scheme. |
PasswordForm blacklisted_not_match3 = *observed_form(); |
blacklisted_not_match3.scheme = PasswordForm::SCHEME_BASIC; |
- // Matches because of same element names, despite different page |
+ // Applies because of same element names, despite different page |
PasswordForm blacklisted_match = *observed_form(); |
blacklisted_match.origin = GURL("http://accounts.google.com/a/LoginAuth1234"); |
blacklisted_match.blacklisted_by_user = true; |
- // Matches because of same page, despite different element names |
+ // Applies because of same page, despite different element names |
PasswordForm blacklisted_match2 = *observed_form(); |
blacklisted_match2.origin = GURL("http://accounts.google.com/a/LoginAuth"); |
blacklisted_match2.username_element = ASCIIToUTF16("Element"); |
blacklisted_match2.blacklisted_by_user = true; |
- std::vector<std::unique_ptr<PasswordForm>> result; |
- result.push_back(base::MakeUnique<PasswordForm>(blacklisted_psl)); |
- result.push_back(base::MakeUnique<PasswordForm>(blacklisted_not_match)); |
- result.push_back(base::MakeUnique<PasswordForm>(blacklisted_not_match2)); |
- result.push_back(base::MakeUnique<PasswordForm>(blacklisted_not_match3)); |
- result.push_back(base::MakeUnique<PasswordForm>(blacklisted_match)); |
- result.push_back(base::MakeUnique<PasswordForm>(blacklisted_match2)); |
- result.push_back(base::MakeUnique<PasswordForm>(*saved_match())); |
- form_manager.OnGetPasswordStoreResults(std::move(result)); |
+ std::vector<const PasswordForm*> matches = {&blacklisted_psl, |
+ &blacklisted_not_match, |
+ &blacklisted_not_match2, |
+ &blacklisted_not_match3, |
+ &blacklisted_match, |
+ &blacklisted_match2, |
+ saved_match()}; |
+ fetcher.SetNonFederated(matches, 0u); |
+ |
EXPECT_TRUE(form_manager.IsBlacklisted()); |
EXPECT_THAT(form_manager.blacklisted_matches(), |
UnorderedElementsAre(Pointee(blacklisted_match), |
@@ -905,9 +830,9 @@ TEST_F(PasswordFormManagerTest, TestBlacklistMatching) { |
EXPECT_EQ(*saved_match(), *form_manager.preferred_match()); |
} |
+// Test that even in the presence of blacklisted matches, the non-blacklisted |
+// ones are still autofilled. |
TEST_F(PasswordFormManagerTest, AutofillBlacklisted) { |
- // Blacklisted best matches credentials should not be autofilled, but the |
- // non-blacklisted should. |
PasswordForm saved_form = *observed_form(); |
saved_form.username_value = ASCIIToUTF16("user"); |
saved_form.password_value = ASCIIToUTF16("pass"); |
@@ -916,15 +841,11 @@ TEST_F(PasswordFormManagerTest, AutofillBlacklisted) { |
blacklisted.blacklisted_by_user = true; |
blacklisted.username_value.clear(); |
- std::vector<std::unique_ptr<PasswordForm>> result; |
- result.push_back(base::MakeUnique<PasswordForm>(saved_form)); |
- result.push_back(base::MakeUnique<PasswordForm>(blacklisted)); |
- |
autofill::PasswordFormFillData fill_data; |
EXPECT_CALL(*client()->mock_driver(), FillPasswordForm(_)) |
.WillOnce(SaveArg<0>(&fill_data)); |
- form_manager()->OnGetPasswordStoreResults(std::move(result)); |
+ fake_form_fetcher()->SetNonFederated({&saved_form, &blacklisted}, 0u); |
EXPECT_EQ(1u, form_manager()->blacklisted_matches().size()); |
EXPECT_TRUE(form_manager()->IsBlacklisted()); |
EXPECT_EQ(1u, form_manager()->best_matches().size()); |
@@ -938,7 +859,7 @@ TEST_F(PasswordFormManagerTest, AutofillBlacklisted) { |
TEST_F(PasswordFormManagerTest, |
OverriddenPSLMatchedCredentialsNotMarkedAsPSLMatched) { |
// The suggestion needs to be PSL-matched. |
- SimulateMatchingPhase(form_manager(), RESULT_PSL_MATCH); |
+ fake_form_fetcher()->SetNonFederated({psl_saved_match()}, 0u); |
// User modifies the suggested password and submits the form. |
PasswordForm credentials(*observed_form()); |
@@ -952,10 +873,12 @@ TEST_F(PasswordFormManagerTest, |
EXPECT_FALSE(form_manager()->IsPendingCredentialsPublicSuffixMatch()); |
} |
+// Test that if a PSL-matched suggestion is saved on a new origin, its metadata |
+// are correctly updated. |
TEST_F(PasswordFormManagerTest, PSLMatchedCredentialsMetadataUpdated) { |
- // The suggestion needs to be PSL-matched. |
- saved_match()->is_public_suffix_match = true; |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
+ PasswordForm psl_suggestion = *saved_match(); |
+ psl_suggestion.is_public_suffix_match = true; |
+ fake_form_fetcher()->SetNonFederated({&psl_suggestion}, 0u); |
PasswordForm submitted_form(*observed_form()); |
submitted_form.preferred = true; |
@@ -987,21 +910,23 @@ TEST_F(PasswordFormManagerTest, PSLMatchedCredentialsMetadataUpdated) { |
EXPECT_EQ(expected_saved_form, actual_saved_form); |
} |
+// Test that when the submitted form contains a "new-password" field, then the |
+// password value is taken from there. |
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"); |
observed_form()->username_marked_by_site = true; |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), *observed_form(), |
- base::MakeUnique<MockFormSaver>()); |
- SimulateMatchingPhase(&form_manager, RESULT_NO_MATCH); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
+ fetcher.SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
// 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.password_value = ASCIIToUTF16("oldpassword"); |
credentials.new_password_value = ASCIIToUTF16("newpassword"); |
credentials.preferred = true; |
form_manager.ProvisionallySave( |
@@ -1029,7 +954,7 @@ TEST_F(PasswordFormManagerTest, TestNewLoginFromNewPasswordElement) { |
} |
TEST_F(PasswordFormManagerTest, TestUpdatePassword) { |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
+ fake_form_fetcher()->SetNonFederated({saved_match()}, 0u); |
// User submits credentials for the observed form using a username previously |
// stored, but a new password. Note that the observed form may have different |
@@ -1074,10 +999,12 @@ TEST_F(PasswordFormManagerTest, TestUpdatePasswordFromNewPasswordElement) { |
// verify in the end that this did not happen. |
saved_match()->submit_element.clear(); |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), *observed_form(), |
- base::MakeUnique<MockFormSaver>()); |
- SimulateMatchingPhase(&form_manager, RESULT_SAVED_MATCH); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
+ fetcher.SetNonFederated({saved_match()}, 0u); |
// User submits current and new credentials to the observed form. |
PasswordForm credentials(*observed_form()); |
@@ -1107,7 +1034,6 @@ TEST_F(PasswordFormManagerTest, TestUpdatePasswordFromNewPasswordElement) { |
.WillOnce(testing::SaveArg<0>(&new_credentials)); |
form_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); |
@@ -1116,50 +1042,35 @@ TEST_F(PasswordFormManagerTest, TestUpdatePasswordFromNewPasswordElement) { |
EXPECT_EQ(saved_match()->submit_element, new_credentials.submit_element); |
} |
+// Test that saved results are not ignored if they differ in paths for action or |
+// origin. |
TEST_F(PasswordFormManagerTest, TestIgnoreResult_Paths) { |
PasswordForm observed(*observed_form()); |
observed.origin = GURL("https://accounts.google.com/a/LoginAuth"); |
observed.action = GURL("https://accounts.google.com/a/Login"); |
observed.signon_realm = "https://accounts.google.com"; |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), observed, |
- base::MakeUnique<MockFormSaver>()); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
PasswordForm saved_form = observed; |
saved_form.origin = GURL("https://accounts.google.com/a/OtherLoginAuth"); |
saved_form.action = GURL("https://accounts.google.com/a/OtherLogin"); |
- std::vector<std::unique_ptr<PasswordForm>> result; |
- result.push_back(base::MakeUnique<PasswordForm>(saved_form)); |
- form_manager.OnGetPasswordStoreResults(std::move(result)); |
+ fetcher.SetNonFederated({&saved_form}, 0u); |
// Different paths for action / origin are okay. |
- EXPECT_FALSE(form_manager.best_matches().empty()); |
-} |
- |
-TEST_F(PasswordFormManagerTest, TestIgnoreResult_IgnoredCredentials) { |
- PasswordForm observed(*observed_form()); |
- observed.origin = GURL("https://accounts.google.com/a/LoginAuth"); |
- observed.action = GURL("https://accounts.google.com/a/Login"); |
- observed.signon_realm = "https://accounts.google.com"; |
- |
- PasswordFormManager form_manager(password_manager(), client(), |
- client()->driver(), observed, |
- base::MakeUnique<MockFormSaver>()); |
- client()->FilterAllResults(); |
- |
- PasswordForm saved_form = observed; |
- std::vector<std::unique_ptr<PasswordForm>> result; |
- result.push_back(base::MakeUnique<PasswordForm>(saved_form)); |
- form_manager.OnGetPasswordStoreResults(std::move(result)); |
- |
- // Results should be ignored if the client requests it. |
- EXPECT_TRUE(form_manager.best_matches().empty()); |
+ EXPECT_EQ(1u, form_manager.best_matches().size()); |
+ EXPECT_EQ(*form_manager.best_matches().begin()->second, saved_form); |
} |
+// Test that saved empty action URL is updated with the submitted action URL. |
TEST_F(PasswordFormManagerTest, TestEmptyAction) { |
saved_match()->action = GURL(); |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
+ fake_form_fetcher()->SetNonFederated({saved_match()}, 0u); |
+ |
// User logs in with the autofilled username / password from saved_match. |
PasswordForm login = *observed_form(); |
login.username_value = saved_match()->username_value; |
@@ -1167,15 +1078,18 @@ TEST_F(PasswordFormManagerTest, TestEmptyAction) { |
form_manager()->ProvisionallySave( |
login, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
EXPECT_FALSE(form_manager()->IsNewLogin()); |
- // We bless our saved PasswordForm entry with the action URL of the |
+ // Chrome updates the saved PasswordForm entry with the action URL of the |
// observed form. |
EXPECT_EQ(observed_form()->action, |
form_manager()->pending_credentials().action); |
} |
TEST_F(PasswordFormManagerTest, TestUpdateAction) { |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
+ saved_match()->action = GURL("http://accounts.google.com/a/ServiceLogin"); |
+ fake_form_fetcher()->SetNonFederated({saved_match()}, 0u); |
+ |
// User logs in with the autofilled username / password from saved_match. |
+ observed_form()->action = GURL("http://accounts.google.com/a/Login"); |
PasswordForm login = *observed_form(); |
login.username_value = saved_match()->username_value; |
login.password_value = saved_match()->password_value; |
@@ -1183,37 +1097,40 @@ TEST_F(PasswordFormManagerTest, TestUpdateAction) { |
form_manager()->ProvisionallySave( |
login, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
EXPECT_FALSE(form_manager()->IsNewLogin()); |
- // The observed action URL is different from the previously saved one, and |
- // is the same as the one that would be submitted on successful login. |
- EXPECT_NE(observed_form()->action, saved_match()->action); |
+ // The observed action URL is different from the previously saved one. Chrome |
+ // should update the store by setting the pending credential's action URL to |
+ // be that of the currently observed form. |
EXPECT_EQ(observed_form()->action, |
form_manager()->pending_credentials().action); |
} |
TEST_F(PasswordFormManagerTest, TestDynamicAction) { |
- SimulateMatchingPhase(form_manager(), RESULT_NO_MATCH); |
+ fake_form_fetcher()->SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
+ |
+ observed_form()->action = GURL("http://accounts.google.com/a/Login"); |
PasswordForm login(*observed_form()); |
// The submitted action URL is different from the one observed on page load. |
- GURL new_action = GURL("http://www.google.com/new_action"); |
- login.action = new_action; |
+ login.action = GURL("http://www.google.com/new_action"); |
form_manager()->ProvisionallySave( |
login, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
EXPECT_TRUE(form_manager()->IsNewLogin()); |
// Check that the provisionally saved action URL is the same as the submitted |
// action URL, not the one observed on page load. |
- EXPECT_EQ(new_action, form_manager()->pending_credentials().action); |
+ EXPECT_EQ(login.action, form_manager()->pending_credentials().action); |
} |
+// Test that if the saved match has other possible usernames stored, and the |
+// user chooses the main one, then the other possible usernames are dropped on |
+// update. |
TEST_F(PasswordFormManagerTest, TestAlternateUsername_NoChange) { |
EXPECT_CALL(*client()->mock_driver(), AllowPasswordGenerationForForm(_)); |
PasswordForm saved_form = *saved_match(); |
- ASSERT_FALSE(saved_form.other_possible_usernames.empty()); |
+ saved_form.other_possible_usernames.push_back( |
+ ASCIIToUTF16("other_possible@gmail.com")); |
- std::vector<std::unique_ptr<PasswordForm>> result; |
- result.push_back(base::MakeUnique<PasswordForm>(saved_form)); |
- form_manager()->OnGetPasswordStoreResults(std::move(result)); |
+ fake_form_fetcher()->SetNonFederated({&saved_form}, 0u); |
// The saved match has the right username already. |
PasswordForm login(*observed_form()); |
@@ -1239,22 +1156,24 @@ TEST_F(PasswordFormManagerTest, TestAlternateUsername_NoChange) { |
EXPECT_TRUE(saved_result.other_possible_usernames.empty()); |
} |
+// Test that if the saved match has other possible usernames stored, and the |
+// user chooses an alternative one, then the other possible usernames are |
+// dropped on update, but the main username is changed to the one chosen by the |
+// user. |
TEST_F(PasswordFormManagerTest, TestAlternateUsername_OtherUsername) { |
- // This time use an alternate username. |
- |
EXPECT_CALL(*client()->mock_driver(), AllowPasswordGenerationForForm(_)); |
+ const base::string16 kOtherUsername = |
+ ASCIIToUTF16("other_possible@gmail.com"); |
PasswordForm saved_form = *saved_match(); |
- ASSERT_FALSE(saved_form.other_possible_usernames.empty()); |
+ saved_form.other_possible_usernames.push_back(kOtherUsername); |
- std::vector<std::unique_ptr<autofill::PasswordForm>> result; |
- result.push_back(base::MakeUnique<PasswordForm>(saved_form)); |
- form_manager()->OnGetPasswordStoreResults(std::move(result)); |
+ fake_form_fetcher()->SetNonFederated({&saved_form}, 0u); |
- // The saved match has the right username already. |
+ // The user chooses an alternative username. |
PasswordForm login(*observed_form()); |
login.preferred = true; |
- login.username_value = saved_match()->other_possible_usernames[0]; |
+ login.username_value = kOtherUsername; |
login.password_value = saved_match()->password_value; |
form_manager()->ProvisionallySave( |
@@ -1272,8 +1191,7 @@ TEST_F(PasswordFormManagerTest, TestAlternateUsername_OtherUsername) { |
// |other_possible_usernames| should also be empty, but username_value should |
// be changed to match |new_username|. |
- EXPECT_EQ(saved_match()->other_possible_usernames[0], |
- saved_result.username_value); |
+ EXPECT_EQ(kOtherUsername, saved_result.username_value); |
EXPECT_TRUE(saved_result.other_possible_usernames.empty()); |
} |
@@ -1281,39 +1199,35 @@ TEST_F(PasswordFormManagerTest, TestSendNotBlacklistedMessage_NoCredentials) { |
// First time sign-up attempt. Password store does not contain matching |
// credentials. AllowPasswordGenerationForForm should be called to send the |
// "not blacklisted" message. |
- EXPECT_CALL(*(client()->mock_driver()), AllowPasswordGenerationForForm(_)) |
- .Times(1); |
- form_manager()->OnGetPasswordStoreResults( |
- std::vector<std::unique_ptr<PasswordForm>>()); |
+ EXPECT_CALL(*(client()->mock_driver()), AllowPasswordGenerationForForm(_)); |
+ fake_form_fetcher()->SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
} |
TEST_F(PasswordFormManagerTest, TestSendNotBlacklistedMessage_Credentials) { |
// Signing up on a previously visited site. Credentials are found in the |
// password store, and are not blacklisted. AllowPasswordGenerationForForm |
// should be called to send the "not blacklisted" message. |
- EXPECT_CALL(*(client()->mock_driver()), AllowPasswordGenerationForForm(_)) |
- .Times(1); |
- std::vector<std::unique_ptr<PasswordForm>> simulated_results; |
- simulated_results.push_back(CreateSavedMatch(false)); |
- form_manager()->OnGetPasswordStoreResults(std::move(simulated_results)); |
+ EXPECT_CALL(*(client()->mock_driver()), AllowPasswordGenerationForForm(_)); |
+ PasswordForm simulated_result = CreateSavedMatch(false); |
+ fake_form_fetcher()->SetNonFederated({&simulated_result}, 0u); |
} |
TEST_F(PasswordFormManagerTest, |
TestSendNotBlacklistedMessage_DroppedCredentials) { |
- // There are cases, such as when a form is explicitly for creating a new |
+ // There are cases, such as when a form is made explicitly for creating a new |
// password, where we may ignore saved credentials. Make sure that we still |
// allow generation in that case. |
PasswordForm signup_form(*observed_form()); |
signup_form.new_password_element = base::ASCIIToUTF16("new_password_field"); |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), signup_form, |
- base::MakeUnique<MockFormSaver>()); |
- EXPECT_CALL(*(client()->mock_driver()), AllowPasswordGenerationForForm(_)) |
- .Times(1); |
- std::vector<std::unique_ptr<PasswordForm>> simulated_results; |
- simulated_results.push_back(CreateSavedMatch(false)); |
- form_manager.OnGetPasswordStoreResults(std::move(simulated_results)); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
+ EXPECT_CALL(*(client()->mock_driver()), AllowPasswordGenerationForForm(_)); |
+ PasswordForm simulated_result = CreateSavedMatch(false); |
+ fetcher.SetNonFederated({&simulated_result}, 0u); |
} |
TEST_F(PasswordFormManagerTest, |
@@ -1322,44 +1236,48 @@ TEST_F(PasswordFormManagerTest, |
// password store, but they are blacklisted. AllowPasswordGenerationForForm |
// is still called. |
EXPECT_CALL(*(client()->mock_driver()), AllowPasswordGenerationForForm(_)); |
- std::vector<std::unique_ptr<PasswordForm>> simulated_results; |
- simulated_results.push_back(CreateSavedMatch(true)); |
- form_manager()->OnGetPasswordStoreResults(std::move(simulated_results)); |
+ PasswordForm simulated_result = CreateSavedMatch(true); |
+ fake_form_fetcher()->SetNonFederated({&simulated_result}, 0u); |
} |
-TEST_F(PasswordFormManagerTest, TestBestCredentialsByEachUsernameAreIncluded) { |
- // Simulate having several matches, with 3 different usernames. Some of the |
- // matches are PSL matches. One match for each username should be chosen. |
- std::vector<std::unique_ptr<PasswordForm>> simulated_results; |
+// Test that exactly one match for each username is chosen as a best match, even |
+// though it is a PSL match. |
+TEST_F(PasswordFormManagerTest, TestBestCredentialsForEachUsernameAreIncluded) { |
// Add a best scoring match. It should be in |best_matches| and chosen as a |
// prefferred match. |
- simulated_results.push_back(base::MakeUnique<PasswordForm>(*saved_match())); |
+ PasswordForm best_scoring = *saved_match(); |
+ |
// Add a match saved on another form, it has lower score. It should not be in |
// |best_matches|. |
- simulated_results.push_back(base::MakeUnique<PasswordForm>(*saved_match())); |
- simulated_results[1]->password_element = ASCIIToUTF16("signup_password"); |
- simulated_results[1]->username_element = ASCIIToUTF16("signup_username"); |
+ PasswordForm other_form = *saved_match(); |
+ other_form.password_element = ASCIIToUTF16("signup_password"); |
+ other_form.username_element = ASCIIToUTF16("signup_username"); |
+ |
// Add a match saved on another form with a different username. It should be |
// in |best_matches|. |
- simulated_results.push_back(base::MakeUnique<PasswordForm>(*saved_match())); |
- auto username1 = simulated_results[0]->username_value + ASCIIToUTF16("1"); |
- simulated_results[2]->username_value = username1; |
- simulated_results[2]->password_element = ASCIIToUTF16("signup_password"); |
- simulated_results[2]->username_element = ASCIIToUTF16("signup_username"); |
+ PasswordForm other_username = other_form; |
+ const base::string16 kUsername1 = |
+ other_username.username_value + ASCIIToUTF16("1"); |
+ other_username.username_value = kUsername1; |
+ |
// Add a PSL match, it should not be in |best_matches|. |
- simulated_results.push_back( |
- base::MakeUnique<PasswordForm>(*psl_saved_match())); |
+ PasswordForm psl_match = *psl_saved_match(); |
+ |
// Add a PSL match with a different username. It should be in |best_matches|. |
- simulated_results.push_back( |
- base::MakeUnique<PasswordForm>(*psl_saved_match())); |
- auto username2 = simulated_results[0]->username_value + ASCIIToUTF16("2"); |
- simulated_results[4]->username_value = username2; |
+ PasswordForm psl_match_other = psl_match; |
+ const base::string16 kUsername2 = |
+ psl_match_other.username_value + ASCIIToUTF16("2"); |
+ psl_match_other.username_value = kUsername2; |
autofill::PasswordFormFillData fill_data; |
EXPECT_CALL(*client()->mock_driver(), FillPasswordForm(_)) |
.WillOnce(SaveArg<0>(&fill_data)); |
- form_manager()->OnGetPasswordStoreResults(std::move(simulated_results)); |
+ fake_form_fetcher()->SetNonFederated( |
+ {&best_scoring, &other_form, &other_username, &psl_match, |
+ &psl_match_other}, |
+ 0u); |
+ |
const std::map<base::string16, const PasswordForm*>& best_matches = |
form_manager()->best_matches(); |
EXPECT_EQ(3u, best_matches.size()); |
@@ -1367,8 +1285,8 @@ TEST_F(PasswordFormManagerTest, TestBestCredentialsByEachUsernameAreIncluded) { |
best_matches.find(saved_match()->username_value)); |
EXPECT_EQ(*saved_match(), |
*best_matches.find(saved_match()->username_value)->second); |
- EXPECT_NE(best_matches.end(), best_matches.find(username1)); |
- EXPECT_NE(best_matches.end(), best_matches.find(username2)); |
+ EXPECT_NE(best_matches.end(), best_matches.find(kUsername1)); |
+ EXPECT_NE(best_matches.end(), best_matches.find(kUsername2)); |
EXPECT_EQ(*saved_match(), *form_manager()->preferred_match()); |
EXPECT_EQ(2u, fill_data.additional_logins.size()); |
@@ -1377,8 +1295,7 @@ TEST_F(PasswordFormManagerTest, TestBestCredentialsByEachUsernameAreIncluded) { |
TEST_F(PasswordFormManagerTest, TestSanitizePossibleUsernames) { |
const base::string16 kUsernameOther = ASCIIToUTF16("other username"); |
- form_manager()->OnGetPasswordStoreResults( |
- std::vector<std::unique_ptr<PasswordForm>>()); |
+ fake_form_fetcher()->SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
PasswordForm credentials(*observed_form()); |
credentials.other_possible_usernames.push_back(ASCIIToUTF16("543-43-1234")); |
@@ -1408,8 +1325,7 @@ TEST_F(PasswordFormManagerTest, TestSanitizePossibleUsernamesDuplicates) { |
const base::string16 kUsernameDuplicate = ASCIIToUTF16("duplicate"); |
const base::string16 kUsernameRandom = ASCIIToUTF16("random"); |
- form_manager()->OnGetPasswordStoreResults( |
- std::vector<std::unique_ptr<PasswordForm>>()); |
+ fake_form_fetcher()->SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
PasswordForm credentials(*observed_form()); |
credentials.other_possible_usernames.push_back(ASCIIToUTF16("511-32-9830")); |
@@ -1436,8 +1352,9 @@ TEST_F(PasswordFormManagerTest, TestSanitizePossibleUsernamesDuplicates) { |
UnorderedElementsAre(kUsernameDuplicate, kUsernameRandom)); |
} |
+// Test that if metadata stored with a form in PasswordStore are incomplete, |
+// they are updated upon the next encounter. |
TEST_F(PasswordFormManagerTest, TestUpdateIncompleteCredentials) { |
- // 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/"; |
@@ -1448,36 +1365,35 @@ TEST_F(PasswordFormManagerTest, TestUpdateIncompleteCredentials) { |
EXPECT_CALL(*(client()->mock_driver()), AllowPasswordGenerationForForm(_)); |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), encountered_form, |
- base::MakeUnique<MockFormSaver>()); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
- // Password store only has these incomplete credentials. |
- std::unique_ptr<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->scheme = PasswordForm::SCHEME_HTML; |
+ PasswordForm incomplete_form; |
+ 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.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); |
+ 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; |
- PasswordForm obsolete_form(*incomplete_form); |
+ PasswordForm obsolete_form(incomplete_form); |
obsolete_form.action = encountered_form.action; |
// Feed the incomplete credentials to the manager. |
- std::vector<std::unique_ptr<PasswordForm>> simulated_results; |
- simulated_results.push_back(std::move(incomplete_form)); |
- form_manager.OnGetPasswordStoreResults(std::move(simulated_results)); |
+ fetcher.SetNonFederated({&incomplete_form}, 0u); |
form_manager.ProvisionallySave( |
complete_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
@@ -1491,32 +1407,32 @@ TEST_F(PasswordFormManagerTest, TestUpdateIncompleteCredentials) { |
form_manager.Save(); |
} |
+// Test that public-suffix-matched credentials score lower than same-origin |
+// ones. |
TEST_F(PasswordFormManagerTest, TestScoringPublicSuffixMatch) { |
EXPECT_CALL(*(client()->mock_driver()), AllowPasswordGenerationForForm(_)); |
- // Simulate having two matches for this form, first comes from different |
- // signon realm, but reports the same origin and action as matched form. |
- // Second candidate has the same signon realm as the form, but has a different |
- // origin and action. Public suffix match is the most important criterion so |
- // the second candidate should be selected. |
- std::vector<std::unique_ptr<PasswordForm>> simulated_results; |
- simulated_results.push_back(CreateSavedMatch(false)); |
- simulated_results.push_back(CreateSavedMatch(false)); |
- simulated_results[0]->is_public_suffix_match = true; |
- simulated_results[1]->origin = |
- GURL("http://accounts.google.com/a/ServiceLoginAuth2"); |
- simulated_results[1]->action = |
- GURL("http://accounts.google.com/a/ServiceLogin2"); |
+ PasswordForm base_match = CreateSavedMatch(false); |
+ base_match.origin = GURL("http://accounts.google.com/a/ServiceLoginAuth"); |
+ base_match.action = GURL("http://accounts.google.com/a/ServiceLogin"); |
+ |
+ PasswordForm psl_match = base_match; |
+ psl_match.is_public_suffix_match = true; |
+ |
+ // Change origin and action URLs to decrease the score. |
+ PasswordForm same_origin_match = base_match; |
+ psl_match.origin = GURL("http://accounts.google.com/a/ServiceLoginAuth2"); |
+ psl_match.action = GURL("http://accounts.google.com/a/ServiceLogin2"); |
autofill::PasswordFormFillData fill_data; |
EXPECT_CALL(*client()->mock_driver(), FillPasswordForm(_)) |
.WillOnce(SaveArg<0>(&fill_data)); |
- form_manager()->OnGetPasswordStoreResults(std::move(simulated_results)); |
+ fake_form_fetcher()->SetNonFederated({&psl_match, &same_origin_match}, 0u); |
EXPECT_TRUE(fill_data.additional_logins.empty()); |
EXPECT_EQ(1u, form_manager()->best_matches().size()); |
- EXPECT_TRUE( |
- !form_manager()->best_matches().begin()->second->is_public_suffix_match); |
+ EXPECT_FALSE( |
+ form_manager()->best_matches().begin()->second->is_public_suffix_match); |
} |
TEST_F(PasswordFormManagerTest, AndroidCredentialsAreAutofilled) { |
@@ -1538,9 +1454,7 @@ TEST_F(PasswordFormManagerTest, AndroidCredentialsAreAutofilled) { |
EXPECT_CALL(*client()->mock_driver(), FillPasswordForm(_)) |
.WillOnce(SaveArg<0>(&fill_data)); |
- std::vector<std::unique_ptr<PasswordForm>> simulated_results; |
- simulated_results.push_back(base::MakeUnique<PasswordForm>(android_login)); |
- form_manager()->OnGetPasswordStoreResults(std::move(simulated_results)); |
+ fake_form_fetcher()->SetNonFederated({&android_login}, 0u); |
EXPECT_TRUE(fill_data.additional_logins.empty()); |
EXPECT_FALSE(fill_data.wait_for_username); |
EXPECT_EQ(1u, form_manager()->best_matches().size()); |
@@ -1560,7 +1474,6 @@ TEST_F(PasswordFormManagerTest, AndroidCredentialsAreAutofilled) { |
EXPECT_CALL(MockFormSaver::Get(form_manager()), Update(_, _, _, nullptr)) |
.WillOnce(testing::SaveArg<0>(&updated_credential)); |
form_manager()->Save(); |
- Mock::VerifyAndClearExpectations(mock_store()); |
EXPECT_EQ(android_login.username_value, updated_credential.username_value); |
EXPECT_EQ(android_login.password_value, updated_credential.password_value); |
@@ -1587,30 +1500,29 @@ TEST_F(PasswordFormManagerTest, AndroidCredentialsAreProtected) { |
// from Android: the first has the same username as the web-based credential, |
// so it should be suppressed, but the second has a different username, so it |
// should be shown. |
- std::vector<std::unique_ptr<PasswordForm>> simulated_results; |
- simulated_results.push_back(CreateSavedMatch(false)); |
- simulated_results[0]->username_value = ASCIIToUTF16(kTestUsername1); |
- simulated_results[0]->password_value = ASCIIToUTF16(kTestWebPassword); |
- simulated_results.push_back(base::MakeUnique<PasswordForm>()); |
- simulated_results[1]->signon_realm = "android://hash@com.google.android"; |
- simulated_results[1]->origin = GURL("android://hash@com.google.android/"); |
- simulated_results[1]->username_value = ASCIIToUTF16(kTestUsername1); |
- simulated_results[1]->password_value = ASCIIToUTF16(kTestAndroidPassword1); |
- simulated_results.push_back( |
- base::MakeUnique<PasswordForm>(*simulated_results[1])); |
- simulated_results[2]->username_value = ASCIIToUTF16(kTestUsername2); |
- simulated_results[2]->password_value = ASCIIToUTF16(kTestAndroidPassword2); |
+ PasswordForm website_login = CreateSavedMatch(false); |
+ website_login.username_value = ASCIIToUTF16(kTestUsername1); |
+ website_login.password_value = ASCIIToUTF16(kTestWebPassword); |
+ |
+ PasswordForm android_same; |
+ android_same.signon_realm = "android://hash@com.google.android"; |
+ android_same.origin = GURL("android://hash@com.google.android/"); |
+ android_same.username_value = ASCIIToUTF16(kTestUsername1); |
+ android_same.password_value = ASCIIToUTF16(kTestAndroidPassword1); |
+ |
+ PasswordForm android_other = android_same; |
+ android_other.username_value = ASCIIToUTF16(kTestUsername2); |
+ android_other.password_value = ASCIIToUTF16(kTestAndroidPassword2); |
std::vector<std::unique_ptr<PasswordForm>> expected_matches; |
- expected_matches.push_back( |
- base::MakeUnique<PasswordForm>(*simulated_results[0])); |
- expected_matches.push_back( |
- base::MakeUnique<PasswordForm>(*simulated_results[2])); |
+ expected_matches.push_back(base::MakeUnique<PasswordForm>(website_login)); |
+ expected_matches.push_back(base::MakeUnique<PasswordForm>(android_other)); |
autofill::PasswordFormFillData fill_data; |
EXPECT_CALL(*client()->mock_driver(), FillPasswordForm(_)) |
.WillOnce(SaveArg<0>(&fill_data)); |
- form_manager()->OnGetPasswordStoreResults(std::move(simulated_results)); |
+ fake_form_fetcher()->SetNonFederated( |
+ {&website_login, &android_same, &android_other}, 0u); |
EXPECT_FALSE(fill_data.wait_for_username); |
EXPECT_EQ(1u, fill_data.additional_logins.size()); |
@@ -1634,9 +1546,9 @@ TEST_F(PasswordFormManagerTest, InvalidActionURLsDoNotMatch) { |
PasswordFormManager::RESULT_ACTION_MATCH); |
// Then when the observed form has an invalid URL: |
PasswordForm valid_action_form(*observed_form()); |
- PasswordFormManager invalid_manager(password_manager(), client(), |
- client()->driver(), invalid_action_form, |
- base::MakeUnique<MockFormSaver>()); |
+ PasswordFormManager invalid_manager( |
+ password_manager(), client(), client()->driver(), invalid_action_form, |
+ base::MakeUnique<MockFormSaver>(), fake_form_fetcher()); |
EXPECT_EQ(0, |
invalid_manager.DoesManage(valid_action_form) & |
PasswordFormManager::RESULT_ACTION_MATCH); |
@@ -1654,7 +1566,7 @@ TEST_F(PasswordFormManagerTest, EmptyActionURLsDoNotMatchNonEmpty) { |
PasswordForm valid_action_form(*observed_form()); |
PasswordFormManager empty_action_manager( |
password_manager(), client(), client()->driver(), empty_action_form, |
- base::MakeUnique<MockFormSaver>()); |
+ base::MakeUnique<MockFormSaver>(), fake_form_fetcher()); |
EXPECT_EQ(0, |
empty_action_manager.DoesManage(valid_action_form) & |
PasswordFormManager::RESULT_ACTION_MATCH); |
@@ -1669,9 +1581,9 @@ TEST_F(PasswordFormManagerTest, NonHTMLFormsDoNotMatchHTMLForms) { |
// The other way round: observing a non-HTML form, don't match a HTML form. |
PasswordForm html_form(*observed_form()); |
- PasswordFormManager non_html_manager(password_manager(), client(), kNoDriver, |
- non_html_form, |
- base::MakeUnique<MockFormSaver>()); |
+ PasswordFormManager non_html_manager( |
+ password_manager(), client(), kNoDriver, non_html_form, |
+ base::MakeUnique<MockFormSaver>(), fake_form_fetcher()); |
EXPECT_EQ(0, non_html_manager.DoesManage(html_form) & |
PasswordFormManager::RESULT_HTML_ATTRIBUTES_MATCH); |
} |
@@ -1706,9 +1618,9 @@ TEST_F(PasswordFormManagerTest, |
PasswordForm secure_observed_form(*observed_form()); |
secure_observed_form.origin = GURL("https://accounts.google.com/a/LoginAuth"); |
- PasswordFormManager secure_manager(password_manager(), client(), |
- client()->driver(), secure_observed_form, |
- base::MakeUnique<MockFormSaver>()); |
+ PasswordFormManager secure_manager( |
+ password_manager(), client(), client()->driver(), secure_observed_form, |
+ base::MakeUnique<MockFormSaver>(), fake_form_fetcher()); |
// Also for HTTPS in the observed form, and HTTP in the compared form, an |
// exact path match is expected. |
EXPECT_EQ(0, secure_manager.DoesManage(form_longer_path) & |
@@ -1761,11 +1673,7 @@ TEST_F(PasswordFormManagerTest, CorrectlyUpdatePasswordsWithSameUsername) { |
third.password_value = ASCIIToUTF16("second"); |
third.preferred = false; |
- std::vector<std::unique_ptr<PasswordForm>> result; |
- result.push_back(base::MakeUnique<PasswordForm>(first)); |
- result.push_back(base::MakeUnique<PasswordForm>(second)); |
- result.push_back(base::MakeUnique<PasswordForm>(third)); |
- form_manager()->OnGetPasswordStoreResults(std::move(result)); |
+ fake_form_fetcher()->SetNonFederated({&first, &second, &third}, 0u); |
// |first| scored slightly higher. |
EXPECT_EQ(ASCIIToUTF16("first"), |
@@ -1805,10 +1713,12 @@ TEST_F(PasswordFormManagerTest, CorrectlyUpdatePasswordsWithSameUsername) { |
TEST_F(PasswordFormManagerTest, UploadFormData_NewPassword) { |
// For newly saved passwords, upload a password vote for autofill::PASSWORD. |
// Don't vote for the username field yet. |
- PasswordFormManager form_manager(password_manager(), client(), |
- client()->driver(), *saved_match(), |
- base::MakeUnique<NiceMock<MockFormSaver>>()); |
- SimulateMatchingPhase(&form_manager, RESULT_NO_MATCH); |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
+ PasswordFormManager form_manager( |
+ password_manager(), client(), client()->driver(), *saved_match(), |
+ base::MakeUnique<NiceMock<MockFormSaver>>(), &fetcher); |
+ fetcher.SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
PasswordForm form_to_save(*saved_match()); |
form_to_save.preferred = true; |
@@ -1824,22 +1734,24 @@ TEST_F(PasswordFormManagerTest, UploadFormData_NewPassword) { |
form_manager.ProvisionallySave( |
form_to_save, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
form_manager.Save(); |
- Mock::VerifyAndClearExpectations(&form_manager); |
+} |
+TEST_F(PasswordFormManagerTest, UploadFormData_NewPassword_Blacklist) { |
// Do not upload a vote if the user is blacklisting the form. |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager blacklist_form_manager( |
password_manager(), client(), client()->driver(), *saved_match(), |
- base::MakeUnique<NiceMock<MockFormSaver>>()); |
- SimulateMatchingPhase(&blacklist_form_manager, RESULT_NO_MATCH); |
+ base::MakeUnique<NiceMock<MockFormSaver>>(), &fetcher); |
+ fetcher.SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
- expected_available_field_types.clear(); |
+ autofill::ServerFieldTypeSet expected_available_field_types; |
expected_available_field_types.insert(autofill::USERNAME); |
expected_available_field_types.insert(autofill::PASSWORD); |
EXPECT_CALL(*client()->mock_driver()->mock_autofill_download_manager(), |
StartUploadRequest(_, _, expected_available_field_types, _, true)) |
.Times(0); |
blacklist_form_manager.PermanentlyBlacklist(); |
- Mock::VerifyAndClearExpectations(&blacklist_form_manager); |
} |
TEST_F(PasswordFormManagerTest, UploadPasswordForm) { |
@@ -1883,8 +1795,7 @@ TEST_F(PasswordFormManagerTest, UploadPasswordForm) { |
TEST_F(PasswordFormManagerTest, CorrectlySavePasswordWithoutUsernameFields) { |
EXPECT_CALL(*client()->mock_driver(), AllowPasswordGenerationForForm(_)); |
- form_manager()->OnGetPasswordStoreResults( |
- std::vector<std::unique_ptr<PasswordForm>>()); |
+ fake_form_fetcher()->SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
PasswordForm login(*observed_form()); |
login.username_element.clear(); |
@@ -1915,43 +1826,40 @@ TEST_F(PasswordFormManagerTest, DriverDeletedBeforeStoreDone) { |
// This test checks implicitly that after step 4 the PFM does not attempt |
// use-after-free of the deleted driver. |
std::string example_url("http://example.com"); |
- std::unique_ptr<PasswordForm> form(new PasswordForm); |
- form->origin = GURL(example_url); |
- form->signon_realm = example_url; |
- form->action = GURL(example_url); |
- form->username_element = ASCIIToUTF16("u"); |
- form->password_element = ASCIIToUTF16("p"); |
- form->submit_element = ASCIIToUTF16("s"); |
- |
+ PasswordForm form; |
+ form.origin = GURL(example_url); |
+ form.signon_realm = example_url; |
+ form.action = GURL(example_url); |
+ form.username_element = ASCIIToUTF16("u"); |
+ form.password_element = ASCIIToUTF16("p"); |
+ form.submit_element = ASCIIToUTF16("s"); |
+ |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
- client()->driver(), *form, |
- base::MakeUnique<MockFormSaver>()); |
+ client()->driver(), form, |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
// Suddenly, the frame and its driver disappear. |
client()->KillDriver(); |
- std::vector<std::unique_ptr<PasswordForm>> simulated_results; |
- simulated_results.push_back(std::move(form)); |
- form_manager.OnGetPasswordStoreResults(std::move(simulated_results)); |
+ fetcher.SetNonFederated({&form}, 0u); |
} |
TEST_F(PasswordFormManagerTest, PreferredMatchIsUpToDate) { |
// Check that preferred_match() is always a member of best_matches(). |
- std::vector<std::unique_ptr<PasswordForm>> simulated_results; |
- std::unique_ptr<PasswordForm> form(new PasswordForm(*observed_form())); |
- form->username_value = ASCIIToUTF16("username"); |
- form->password_value = ASCIIToUTF16("password1"); |
- form->preferred = false; |
+ PasswordForm form = *observed_form(); |
+ form.username_value = ASCIIToUTF16("username"); |
+ form.password_value = ASCIIToUTF16("password1"); |
+ form.preferred = false; |
- std::unique_ptr<PasswordForm> generated_form(new PasswordForm(*form)); |
- generated_form->type = PasswordForm::TYPE_GENERATED; |
- generated_form->password_value = ASCIIToUTF16("password2"); |
- generated_form->preferred = true; |
+ PasswordForm generated_form = form; |
+ generated_form.type = PasswordForm::TYPE_GENERATED; |
+ generated_form.password_value = ASCIIToUTF16("password2"); |
+ generated_form.preferred = true; |
- simulated_results.push_back(std::move(generated_form)); |
- simulated_results.push_back(std::move(form)); |
+ fake_form_fetcher()->SetNonFederated({&form, &generated_form}, 0u); |
- form_manager()->OnGetPasswordStoreResults(std::move(simulated_results)); |
EXPECT_EQ(1u, form_manager()->best_matches().size()); |
EXPECT_EQ(form_manager()->preferred_match(), |
form_manager()->best_matches().begin()->second); |
@@ -2006,17 +1914,19 @@ TEST_F(PasswordFormManagerTest, TestSuggestingPasswordChangeForms) { |
PasswordForm observed_change_password_form = *observed_form(); |
observed_change_password_form.new_password_element = |
base::ASCIIToUTF16("new_pwd"); |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager manager_creds( |
password_manager(), client(), client()->driver(), |
- observed_change_password_form, base::MakeUnique<MockFormSaver>()); |
- std::vector<std::unique_ptr<PasswordForm>> simulated_results; |
- simulated_results.push_back(CreateSavedMatch(false)); |
+ observed_change_password_form, base::MakeUnique<MockFormSaver>(), |
+ &fetcher); |
autofill::PasswordFormFillData fill_data; |
EXPECT_CALL(*client()->mock_driver(), FillPasswordForm(_)) |
.WillOnce(SaveArg<0>(&fill_data)); |
- manager_creds.OnGetPasswordStoreResults(std::move(simulated_results)); |
+ PasswordForm result = CreateSavedMatch(false); |
+ fetcher.SetNonFederated({&result}, 0u); |
EXPECT_EQ(1u, manager_creds.best_matches().size()); |
EXPECT_EQ(0u, fill_data.additional_logins.size()); |
EXPECT_TRUE(fill_data.wait_for_username); |
@@ -2041,11 +1951,14 @@ TEST_F(PasswordFormManagerTest, TestUpdateMethod) { |
// verify in the end that this did not happen. |
saved_match()->submit_element.clear(); |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), *observed_form(), |
- base::MakeUnique<MockFormSaver>()); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
+ |
+ fetcher.SetNonFederated({saved_match()}, 0u); |
- SimulateMatchingPhase(&form_manager, RESULT_SAVED_MATCH); |
// User submits current and new credentials to the observed form. |
PasswordForm credentials(*observed_form()); |
credentials.username_element.clear(); |
@@ -2075,7 +1988,6 @@ TEST_F(PasswordFormManagerTest, TestUpdateMethod) { |
.WillOnce(SaveArg<0>(&new_credentials)); |
form_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); |
@@ -2085,8 +1997,9 @@ TEST_F(PasswordFormManagerTest, TestUpdateMethod) { |
} |
TEST_F(PasswordFormManagerTest, TestUpdateNoUsernameTextfieldPresent) { |
- // Add a new password field to the test form. The PasswordFormManager should |
- // save the password from this field, instead of the current password field. |
+ // Add a new password field to the test form and insert a |username_value| |
+ // unlikely to be a real username. The PasswordFormManager should still save |
+ // the password from this field, instead of the current password field. |
observed_form()->new_password_element = ASCIIToUTF16("NewPasswd"); |
autofill::FormFieldData field; |
field.label = ASCIIToUTF16("NewPasswd"); |
@@ -2103,11 +2016,14 @@ TEST_F(PasswordFormManagerTest, TestUpdateNoUsernameTextfieldPresent) { |
// will verify in the end that this did not happen. |
saved_match()->submit_element.clear(); |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), *observed_form(), |
- base::MakeUnique<MockFormSaver>()); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
+ |
+ fetcher.SetNonFederated({saved_match()}, 0u); |
- SimulateMatchingPhase(&form_manager, RESULT_SAVED_MATCH); |
// User submits current and new credentials to the observed form. |
PasswordForm credentials(*observed_form()); |
// The |username_value| contains a text that's unlikely to be real username. |
@@ -2139,9 +2055,9 @@ TEST_F(PasswordFormManagerTest, TestUpdateNoUsernameTextfieldPresent) { |
.WillOnce(SaveArg<0>(&new_credentials)); |
form_manager.Update(form_manager.pending_credentials()); |
- Mock::VerifyAndClearExpectations(mock_store()); |
- // No meta-information should be updated, only the password. |
+ // No other information than password value should be updated. In particular |
+ // not the username. |
EXPECT_EQ(saved_match()->username_value, new_credentials.username_value); |
EXPECT_EQ(credentials.new_password_value, new_credentials.password_value); |
EXPECT_EQ(saved_match()->username_element, new_credentials.username_element); |
@@ -2149,15 +2065,19 @@ TEST_F(PasswordFormManagerTest, TestUpdateNoUsernameTextfieldPresent) { |
EXPECT_EQ(saved_match()->submit_element, new_credentials.submit_element); |
} |
+// Test that if WipeStoreCopyIfOutdated is called before password store |
+// callback, the UMA is signalled accordingly. |
TEST_F(PasswordFormManagerTest, WipeStoreCopyIfOutdated_BeforeStoreCallback) { |
PasswordForm form(*saved_match()); |
- ASSERT_FALSE(form.password_value.empty()); |
+ form.password_value = ASCIIToUTF16("nonempty-password"); |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), form, |
- base::MakeUnique<MockFormSaver>()); |
- // The creation of |form_manager| caused a GetLogins call. This test does not |
- // provide the callback for that call back to |form_manager| on purpose. |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
+ // The creation of |fetcher| keeps it waiting for store results. This test |
+ // keeps the fetcher waiting on purpose. |
PasswordForm submitted_form(form); |
submitted_form.password_value += ASCIIToUTF16("add stuff, make it different"); |
@@ -2173,19 +2093,16 @@ TEST_F(PasswordFormManagerTest, WipeStoreCopyIfOutdated_BeforeStoreCallback) { |
} |
TEST_F(PasswordFormManagerTest, GenerationStatusChangedWithPassword) { |
- std::unique_ptr<PasswordForm> generated_form( |
- new PasswordForm(*observed_form())); |
- generated_form->type = PasswordForm::TYPE_GENERATED; |
- generated_form->username_value = ASCIIToUTF16("username"); |
- generated_form->password_value = ASCIIToUTF16("password2"); |
- generated_form->preferred = true; |
- |
- PasswordForm submitted_form(*generated_form); |
+ PasswordForm generated_form = *observed_form(); |
+ generated_form.type = PasswordForm::TYPE_GENERATED; |
+ generated_form.username_value = ASCIIToUTF16("username"); |
+ generated_form.password_value = ASCIIToUTF16("password2"); |
+ generated_form.preferred = true; |
+ |
+ PasswordForm submitted_form(generated_form); |
submitted_form.password_value = ASCIIToUTF16("password3"); |
- std::vector<std::unique_ptr<PasswordForm>> simulated_results; |
- simulated_results.push_back(std::move(generated_form)); |
- form_manager()->OnGetPasswordStoreResults(std::move(simulated_results)); |
+ fake_form_fetcher()->SetNonFederated({&generated_form}, 0u); |
form_manager()->ProvisionallySave( |
submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
@@ -2201,18 +2118,15 @@ TEST_F(PasswordFormManagerTest, GenerationStatusChangedWithPassword) { |
TEST_F(PasswordFormManagerTest, GenerationStatusNotUpdatedIfPasswordUnchanged) { |
base::HistogramTester histogram_tester; |
- std::unique_ptr<PasswordForm> generated_form( |
- new PasswordForm(*observed_form())); |
- generated_form->type = PasswordForm::TYPE_GENERATED; |
- generated_form->username_value = ASCIIToUTF16("username"); |
- generated_form->password_value = ASCIIToUTF16("password2"); |
- generated_form->preferred = true; |
+ PasswordForm generated_form = *observed_form(); |
+ generated_form.type = PasswordForm::TYPE_GENERATED; |
+ generated_form.username_value = ASCIIToUTF16("username"); |
+ generated_form.password_value = ASCIIToUTF16("password2"); |
+ generated_form.preferred = true; |
- PasswordForm submitted_form(*generated_form); |
+ PasswordForm submitted_form(generated_form); |
- std::vector<std::unique_ptr<PasswordForm>> simulated_results; |
- simulated_results.push_back(std::move(generated_form)); |
- form_manager()->OnGetPasswordStoreResults(std::move(simulated_results)); |
+ fake_form_fetcher()->SetNonFederated({&generated_form}, 0u); |
form_manager()->ProvisionallySave( |
submitted_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
@@ -2227,105 +2141,56 @@ TEST_F(PasswordFormManagerTest, GenerationStatusNotUpdatedIfPasswordUnchanged) { |
metrics_util::PASSWORD_USED, 1); |
} |
-TEST_F(PasswordFormManagerTest, |
- FetchMatchingLoginsFromPasswordStore_Reentrance) { |
- form_manager()->FetchDataFromPasswordStore(); |
- form_manager()->FetchDataFromPasswordStore(); |
- |
- // First response from the store, should be ignored. |
- std::unique_ptr<PasswordForm> saved_form(new PasswordForm(*saved_match())); |
- saved_form->username_value = ASCIIToUTF16("a@gmail.com"); |
- std::vector<std::unique_ptr<PasswordForm>> results; |
- results.push_back(std::move(saved_form)); |
- // Expect the additional call for GetLogins after the first response arrives. |
- EXPECT_CALL( |
- *mock_store(), |
- GetLogins(PasswordStore::FormDigest(form_manager()->observed_form()), |
- form_manager())); |
- form_manager()->OnGetPasswordStoreResults(std::move(results)); |
- EXPECT_TRUE(form_manager()->best_matches().empty()); |
- |
- // Second response from the store should not be ignored. |
- saved_form.reset(new PasswordForm(*saved_match())); |
- saved_form->username_value = ASCIIToUTF16("b@gmail.com"); |
- results.push_back(std::move(saved_form)); |
- saved_form.reset(new PasswordForm(*saved_match())); |
- saved_form->username_value = ASCIIToUTF16("c@gmail.com"); |
- results.push_back(std::move(saved_form)); |
- form_manager()->OnGetPasswordStoreResults(std::move(results)); |
- EXPECT_EQ(2U, form_manager()->best_matches().size()); |
-} |
- |
+// Test that ProcessFrame is called on receiving matches from the fetcher, |
+// resulting in a FillPasswordForm call. |
TEST_F(PasswordFormManagerTest, ProcessFrame) { |
EXPECT_CALL(*client()->mock_driver(), FillPasswordForm(_)); |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
+ fake_form_fetcher()->SetNonFederated({saved_match()}, 0u); |
} |
+// Test that ProcessFrame can also be called directly, resulting in an |
+// additional FillPasswordForm call. |
TEST_F(PasswordFormManagerTest, ProcessFrame_MoreProcessFrameMoreFill) { |
EXPECT_CALL(*client()->mock_driver(), FillPasswordForm(_)).Times(2); |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
+ fake_form_fetcher()->SetNonFederated({saved_match()}, 0u); |
form_manager()->ProcessFrame(client()->mock_driver()->AsWeakPtr()); |
} |
+// Test that when ProcessFrame is called on a driver added after receiving |
+// matches, such driver is still told to call FillPasswordForm. |
TEST_F(PasswordFormManagerTest, ProcessFrame_TwoDrivers) { |
NiceMock<MockPasswordManagerDriver> second_driver; |
EXPECT_CALL(*client()->mock_driver(), FillPasswordForm(_)); |
EXPECT_CALL(second_driver, FillPasswordForm(_)); |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
+ fake_form_fetcher()->SetNonFederated({saved_match()}, 0u); |
form_manager()->ProcessFrame(second_driver.AsWeakPtr()); |
} |
+// Test that a second driver is added before receiving matches, such driver is |
+// also told to call FillPasswordForm once the matches arrive. |
TEST_F(PasswordFormManagerTest, ProcessFrame_DriverBeforeMatching) { |
- NiceMock<MockPasswordManagerDriver> extra_driver; |
- |
- EXPECT_CALL(extra_driver, FillPasswordForm(_)); |
- |
- // The PasswordStore was asked store for logins when |form_manager()| was |
- // created, but should not respond yet. |
- |
- // Now add the extra driver. |
- form_manager()->ProcessFrame(extra_driver.AsWeakPtr()); |
+ NiceMock<MockPasswordManagerDriver> second_driver; |
+ form_manager()->ProcessFrame(second_driver.AsWeakPtr()); |
- // Password store responds. |
- std::unique_ptr<PasswordForm> match(new PasswordForm(*saved_match())); |
- std::vector<std::unique_ptr<PasswordForm>> result_form; |
- result_form.push_back(std::move(match)); |
- form_manager()->OnGetPasswordStoreResults(std::move(result_form)); |
+ EXPECT_CALL(*client()->mock_driver(), FillPasswordForm(_)); |
+ EXPECT_CALL(second_driver, FillPasswordForm(_)); |
+ fake_form_fetcher()->SetNonFederated({saved_match()}, 0u); |
} |
+// Test that if the fetcher updates the information about stored matches, |
+// autofill is re-triggered. |
TEST_F(PasswordFormManagerTest, ProcessFrame_StoreUpdatesCausesAutofill) { |
EXPECT_CALL(*client()->mock_driver(), FillPasswordForm(_)).Times(2); |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
- form_manager()->FetchDataFromPasswordStore(); |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
+ std::vector<const PasswordForm*> matches = {saved_match()}; |
+ fake_form_fetcher()->SetNonFederated(matches, 0u); |
+ fake_form_fetcher()->Fetch(); |
+ fake_form_fetcher()->SetNonFederated(matches, 0u); |
} |
-TEST_F(PasswordFormManagerTest, UpdateFormManagers_IsCalled) { |
- // Let |password_manager()| create one additional PasswordFormManager. |
- PasswordStoreConsumer* consumer = nullptr; // Will point to the new PFM. |
- EXPECT_CALL(*mock_store(), GetLogins(_, _)).WillOnce(SaveArg<1>(&consumer)); |
- PasswordForm form; |
- std::vector<PasswordForm> observed; |
- observed.push_back(form); |
- password_manager()->OnPasswordFormsParsed(client()->mock_driver(), observed); |
- // Make sure that the additional PFM is in POST_MATCHING phase. |
- ASSERT_TRUE(consumer); |
- consumer->OnGetPasswordStoreResults( |
- std::vector<std::unique_ptr<PasswordForm>>()); |
- |
- // Now prepare |form_manager()| for saving. |
- SimulateMatchingPhase(form_manager(), RESULT_NO_MATCH); |
- PasswordForm saved_form(*observed_form()); |
- saved_form.preferred = true; |
- form_manager()->ProvisionallySave( |
- saved_form, PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); |
- |
- // Firing Save() should cause PasswordManager::UpdateFormManagers to make the |
- // additional PFM to call the password store again. |
- EXPECT_CALL(*mock_store(), GetLogins(_, _)); |
- form_manager()->Save(); |
-} |
+// TODO(crbug.com/639786): Restore the following test: |
+// when PasswordFormManager::Save is called, then PasswordFormManager also |
+// calls PasswordManager::UpdateFormManagers. |
TEST_F(PasswordFormManagerTest, UploadChangePasswordForm_NEW_PASSWORD) { |
ChangePasswordUploadTest(autofill::NEW_PASSWORD); |
@@ -2341,10 +2206,12 @@ TEST_F(PasswordFormManagerTest, UploadChangePasswordForm_NOT_NEW_PASSWORD) { |
} |
TEST_F(PasswordFormManagerTest, TestUpdatePSLMatchedCredentials) { |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), *observed_form(), |
- base::MakeUnique<MockFormSaver>()); |
- SimulateMatchingPhase(&form_manager, RESULT_SAVED_MATCH | RESULT_PSL_MATCH); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
+ fetcher.SetNonFederated({saved_match(), psl_saved_match()}, 0u); |
// User submits a credentials with an old username and a new password. |
PasswordForm credentials(*observed_form()); |
@@ -2369,7 +2236,6 @@ TEST_F(PasswordFormManagerTest, TestUpdatePSLMatchedCredentials) { |
StartUploadRequest(_, false, _, _, true)); |
form_manager.Save(); |
- Mock::VerifyAndClearExpectations(mock_store()); |
// No meta-information should be updated, only the password. |
EXPECT_EQ(credentials.password_value, new_credentials.password_value); |
@@ -2392,11 +2258,13 @@ TEST_F(PasswordFormManagerTest, TestUpdatePSLMatchedCredentials) { |
TEST_F(PasswordFormManagerTest, |
TestNotUpdatePSLMatchedCredentialsWithAnotherUsername) { |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), *observed_form(), |
- base::MakeUnique<MockFormSaver>()); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
psl_saved_match()->username_value += ASCIIToUTF16("1"); |
- SimulateMatchingPhase(&form_manager, RESULT_SAVED_MATCH | RESULT_PSL_MATCH); |
+ fetcher.SetNonFederated({saved_match(), psl_saved_match()}, 0u); |
// User submits a credentials with an old username and a new password. |
PasswordForm credentials(*observed_form()); |
@@ -2420,7 +2288,6 @@ TEST_F(PasswordFormManagerTest, |
StartUploadRequest(_, false, _, _, true)); |
form_manager.Save(); |
- Mock::VerifyAndClearExpectations(mock_store()); |
// No meta-information should be updated, only the password. |
EXPECT_EQ(credentials.password_value, new_credentials.password_value); |
@@ -2432,11 +2299,13 @@ TEST_F(PasswordFormManagerTest, |
TEST_F(PasswordFormManagerTest, |
TestNotUpdatePSLMatchedCredentialsWithAnotherPassword) { |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), *observed_form(), |
- base::MakeUnique<MockFormSaver>()); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
psl_saved_match()->password_value += ASCIIToUTF16("1"); |
- SimulateMatchingPhase(&form_manager, RESULT_SAVED_MATCH | RESULT_PSL_MATCH); |
+ fetcher.SetNonFederated({saved_match(), psl_saved_match()}, 0u); |
// User submits a credentials with an old username and a new password. |
PasswordForm credentials(*observed_form()); |
@@ -2460,7 +2329,6 @@ TEST_F(PasswordFormManagerTest, |
StartUploadRequest(_, false, _, _, true)); |
form_manager.Save(); |
- Mock::VerifyAndClearExpectations(mock_store()); |
// No meta-information should be updated, only the password. |
EXPECT_EQ(credentials.password_value, new_credentials.password_value); |
@@ -2471,10 +2339,12 @@ TEST_F(PasswordFormManagerTest, |
} |
TEST_F(PasswordFormManagerTest, TestNotUpdateWhenOnlyPSLMatched) { |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), *observed_form(), |
- base::MakeUnique<MockFormSaver>()); |
- SimulateMatchingPhase(&form_manager, RESULT_PSL_MATCH); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
+ fetcher.SetNonFederated({psl_saved_match()}, 0u); |
// User submits a credentials with an old username and a new password. |
PasswordForm credentials(*observed_form()); |
@@ -2493,7 +2363,6 @@ TEST_F(PasswordFormManagerTest, TestNotUpdateWhenOnlyPSLMatched) { |
.WillOnce(testing::SaveArg<0>(&new_credentials)); |
form_manager.Save(); |
- Mock::VerifyAndClearExpectations(mock_store()); |
EXPECT_EQ(credentials.password_value, new_credentials.password_value); |
EXPECT_EQ(credentials.username_value, new_credentials.username_value); |
@@ -2502,41 +2371,9 @@ TEST_F(PasswordFormManagerTest, TestNotUpdateWhenOnlyPSLMatched) { |
EXPECT_EQ(credentials.origin, new_credentials.origin); |
} |
-#if !defined(OS_IOS) && !defined(OS_ANDROID) |
-TEST_F(PasswordFormManagerTest, FetchStatistics) { |
- InteractionsStats stats; |
- stats.origin_domain = observed_form()->origin.GetOrigin(); |
- stats.username_value = saved_match()->username_value; |
- stats.dismissal_count = 5; |
- std::vector<InteractionsStats*> db_stats; |
- db_stats.push_back(new InteractionsStats(stats)); |
- EXPECT_CALL(*mock_store(), GetSiteStatsMock(stats.origin_domain)) |
- .WillOnce(Return(db_stats)); |
- form_manager()->FetchDataFromPasswordStore(); |
- base::RunLoop().RunUntilIdle(); |
- |
- EXPECT_THAT(form_manager()->form_fetcher()->GetInteractionsStats(), |
- ElementsAre(Pointee(stats))); |
-} |
-#else |
-TEST_F(PasswordFormManagerTest, DontFetchStatistics) { |
- // Because |form_manager()| is currently waiting for a PasswordStore response, |
- // the response needs to be faked in order to be able to re-request another |
- // one below. |
- form_manager()->OnGetPasswordStoreResults( |
- std::vector<std::unique_ptr<PasswordForm>>()); |
- EXPECT_CALL( |
- *mock_store(), |
- GetLogins(PasswordStore::FormDigest(*observed_form()), form_manager())); |
- EXPECT_CALL(*mock_store(), GetSiteStatsMock(_)).Times(0); |
- form_manager()->FetchDataFromPasswordStore(); |
- base::RunLoop().RunUntilIdle(); |
-} |
-#endif |
- |
TEST_F(PasswordFormManagerTest, |
TestSavingOnChangePasswordFormGenerationNoStoredForms) { |
- SimulateMatchingPhase(form_manager(), RESULT_NO_MATCH); |
+ fake_form_fetcher()->SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
form_manager()->set_has_generated_password(true); |
// User submits change password form and there is no stored credentials. |
@@ -2571,7 +2408,7 @@ TEST_F(PasswordFormManagerTest, |
} |
TEST_F(PasswordFormManagerTest, TestUpdatingOnChangePasswordFormGeneration) { |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
+ fake_form_fetcher()->SetNonFederated({saved_match()}, 0u); |
form_manager()->set_has_generated_password(true); |
// User submits credentials for the change password form, and old password is |
@@ -2607,7 +2444,7 @@ TEST_F(PasswordFormManagerTest, TestUpdatingOnChangePasswordFormGeneration) { |
TEST_F(PasswordFormManagerTest, |
TestSavingOnChangePasswordFormGenerationNoMatchedForms) { |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
+ fake_form_fetcher()->SetNonFederated({saved_match()}, 0u); |
form_manager()->set_has_generated_password(true); |
// User submits credentials for the change password form, and old password is |
@@ -2658,11 +2495,12 @@ TEST_F(PasswordFormManagerTest, |
field.name = ASCIIToUTF16("NewPasswd"); |
observed_form()->form_data.fields.push_back(field); |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), *observed_form(), |
- base::MakeUnique<MockFormSaver>()); |
- |
- SimulateMatchingPhase(&form_manager, RESULT_SAVED_MATCH); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
+ fetcher.SetNonFederated({saved_match()}, 0u); |
// User submits current and new credentials to the observed form. |
PasswordForm submitted_form(*observed_form()); |
@@ -2735,17 +2573,18 @@ TEST_F(PasswordFormManagerTest, FormClassifierVoteUpload) { |
submitted_form.username_value = saved_match()->username_value; |
submitted_form.password_value = saved_match()->password_value; |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager( |
password_manager(), client(), client()->driver(), form, |
- base::MakeUnique<NiceMock<MockFormSaver>>()); |
+ base::MakeUnique<NiceMock<MockFormSaver>>(), &fetcher); |
base::string16 generation_element = form.password_element; |
if (found_generation_element) |
form_manager.SaveGenerationFieldDetectedByClassifier(generation_element); |
else |
form_manager.SaveGenerationFieldDetectedByClassifier(base::string16()); |
- std::vector<std::unique_ptr<PasswordForm>> result; |
- form_manager.OnGetPasswordStoreResults(std::move(result)); |
+ fetcher.SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
autofill::FormStructure form_structure(submitted_form.form_data); |
@@ -2771,11 +2610,12 @@ TEST_F(PasswordFormManagerTest, FieldPropertiesMasksUpload) { |
submitted_form.username_value = saved_match()->username_value; |
submitted_form.password_value = saved_match()->password_value; |
- PasswordFormManager form_manager(password_manager(), client(), |
- client()->driver(), form, |
- base::MakeUnique<NiceMock<MockFormSaver>>()); |
- std::vector<std::unique_ptr<PasswordForm>> result; |
- form_manager.OnGetPasswordStoreResults(std::move(result)); |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
+ PasswordFormManager form_manager( |
+ password_manager(), client(), client()->driver(), form, |
+ base::MakeUnique<NiceMock<MockFormSaver>>(), &fetcher); |
+ fetcher.SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
DCHECK_EQ(3U, form.form_data.fields.size()); |
submitted_form.form_data.fields[1].properties_mask = |
@@ -2805,10 +2645,12 @@ TEST_F(PasswordFormManagerTest, TestSavingAPIFormsWithSamePassword) { |
saved_match()->username_element.clear(); |
saved_match()->type = autofill::PasswordForm::TYPE_API; |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager(password_manager(), client(), |
client()->driver(), *observed_form(), |
- base::MakeUnique<MockFormSaver>()); |
- SimulateMatchingPhase(&form_manager, RESULT_SAVED_MATCH); |
+ base::MakeUnique<MockFormSaver>(), &fetcher); |
+ fetcher.SetNonFederated({saved_match()}, 0u); |
// User submits new credentials with the same password as in already saved |
// one. |
@@ -2828,7 +2670,6 @@ TEST_F(PasswordFormManagerTest, TestSavingAPIFormsWithSamePassword) { |
.WillOnce(SaveArg<0>(&new_credentials)); |
form_manager.Save(); |
- Mock::VerifyAndClearExpectations(mock_store()); |
EXPECT_EQ(saved_match()->username_value + ASCIIToUTF16("1"), |
new_credentials.username_value); |
@@ -2840,7 +2681,7 @@ TEST_F(PasswordFormManagerTest, TestSavingAPIFormsWithSamePassword) { |
TEST_F(PasswordFormManagerTest, SkipZeroClickIntact) { |
saved_match()->skip_zero_click = true; |
psl_saved_match()->skip_zero_click = true; |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH | RESULT_PSL_MATCH); |
+ fake_form_fetcher()->SetNonFederated({saved_match(), psl_saved_match()}, 0u); |
EXPECT_EQ(1u, form_manager()->best_matches().size()); |
// User submits a credentials with an old username and a new password. |
@@ -2866,31 +2707,15 @@ TEST_F(PasswordFormManagerTest, SkipZeroClickIntact) { |
EXPECT_TRUE(credentials_to_update[0].skip_zero_click); |
} |
-TEST_F(PasswordFormManagerTest, FederatedCredentialsFiltered) { |
- PasswordForm federated(*saved_match()); |
- federated.password_value.clear(); |
- federated.federation_origin = |
- url::Origin(GURL("https://accounts.google.com")); |
- |
- std::vector<std::unique_ptr<PasswordForm>> results; |
- results.push_back(base::MakeUnique<PasswordForm>(federated)); |
- results.push_back(base::MakeUnique<PasswordForm>(*saved_match())); |
- form_manager()->OnGetPasswordStoreResults(std::move(results)); |
- |
- EXPECT_EQ(1u, form_manager()->form_fetcher()->GetFederatedMatches().size()); |
- EXPECT_EQ(*form_manager()->form_fetcher()->GetFederatedMatches()[0], |
- federated); |
- EXPECT_EQ(1u, form_manager()->best_matches().size()); |
- EXPECT_EQ(*(form_manager()->best_matches().begin()->second), *saved_match()); |
-} |
- |
TEST_F(PasswordFormManagerTest, ProbablyAccountCreationUpload) { |
PasswordForm form(*observed_form()); |
form.form_data = saved_match()->form_data; |
- PasswordFormManager form_manager(password_manager(), client(), |
- client()->driver(), form, |
- base::MakeUnique<NiceMock<MockFormSaver>>()); |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
+ PasswordFormManager form_manager( |
+ password_manager(), client(), client()->driver(), form, |
+ base::MakeUnique<NiceMock<MockFormSaver>>(), &fetcher); |
PasswordForm form_to_save(form); |
form_to_save.preferred = true; |
@@ -2899,8 +2724,7 @@ TEST_F(PasswordFormManagerTest, ProbablyAccountCreationUpload) { |
form_to_save.password_value = saved_match()->password_value; |
form_to_save.does_look_like_signup_form = true; |
- std::vector<std::unique_ptr<PasswordForm>> result; |
- form_manager.OnGetPasswordStoreResults(std::move(result)); |
+ fetcher.SetNonFederated(std::vector<const PasswordForm*>(), 0u); |
autofill::FormStructure pending_structure(form_to_save.form_data); |
autofill::ServerFieldTypeSet expected_available_field_types; |
@@ -2927,14 +2751,14 @@ TEST_F(PasswordFormManagerTest, ProbablyAccountCreationUpload) { |
TEST_F(PasswordFormManagerFillOnAccountSelectTest, ProcessFrame) { |
EXPECT_CALL(*client()->mock_driver(), |
ShowInitialPasswordAccountSuggestions(_)); |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
+ fake_form_fetcher()->SetNonFederated({saved_match()}, 0u); |
} |
// Check that PasswordFormManager records |
// PasswordManager_LoginFollowingAutofill as part of processing a credential |
// update. |
TEST_F(PasswordFormManagerTest, ReportProcessingUpdate) { |
- SimulateMatchingPhase(form_manager(), RESULT_SAVED_MATCH); |
+ fake_form_fetcher()->SetNonFederated({saved_match()}, 0u); |
PasswordForm pending = *observed_form(); |
pending.username_value = saved_match()->username_value; |
pending.password_value = saved_match()->password_value; |
@@ -2973,11 +2797,13 @@ TEST_F(PasswordFormManagerTest, RemoveResultsWithWrongScheme_ObservingHTML) { |
PasswordForm observed = *observed_form(); |
observed.scheme = kCorrectScheme; |
+ FakeFormFetcher fetcher; |
+ fetcher.Fetch(); |
PasswordFormManager form_manager( |
password_manager(), client(), |
(kCorrectScheme == PasswordForm::SCHEME_HTML ? client()->driver() |
: nullptr), |
- observed, base::MakeUnique<NiceMock<MockFormSaver>>()); |
+ observed, base::MakeUnique<NiceMock<MockFormSaver>>(), &fetcher); |
PasswordForm match = *saved_match(); |
match.scheme = kCorrectScheme; |
@@ -2986,18 +2812,16 @@ TEST_F(PasswordFormManagerTest, RemoveResultsWithWrongScheme_ObservingHTML) { |
non_match.scheme = kWrongScheme; |
// First try putting the correct scheme first in returned matches. |
- std::vector<const PasswordForm*> all_matches = {&match, &non_match}; |
static_cast<FormFetcher::Consumer*>(&form_manager) |
- ->ProcessMatches(all_matches, 0u); |
+ ->ProcessMatches({&match, &non_match}, 0u); |
EXPECT_EQ(1u, form_manager.best_matches().size()); |
EXPECT_EQ(kCorrectScheme, |
form_manager.best_matches().begin()->second->scheme); |
// Now try putting the correct scheme last in returned matches. |
- all_matches = {&non_match, &match}; |
static_cast<FormFetcher::Consumer*>(&form_manager) |
- ->ProcessMatches(all_matches, 0u); |
+ ->ProcessMatches({&non_match, &match}, 0u); |
EXPECT_EQ(1u, form_manager.best_matches().size()); |
EXPECT_EQ(kCorrectScheme, |