| Index: components/password_manager/core/browser/password_manager_unittest.cc
|
| diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc
|
| index 2acb161cadd0927f0e6949db62361b0365ff9108..af6be32ed92dbfab7c6bacf4534f84982e8bf0ca 100644
|
| --- a/components/password_manager/core/browser/password_manager_unittest.cc
|
| +++ b/components/password_manager/core/browser/password_manager_unittest.cc
|
| @@ -28,6 +28,7 @@ using base::ASCIIToUTF16;
|
| using testing::_;
|
| using testing::AnyNumber;
|
| using testing::Exactly;
|
| +using testing::Invoke;
|
| using testing::Return;
|
| using testing::WithArg;
|
|
|
| @@ -1088,4 +1089,52 @@ TEST_F(PasswordManagerTest, FormSubmittedChangedWithAutofillResponse) {
|
| form_to_save->Save();
|
| }
|
|
|
| +TEST_F(PasswordManagerTest, SubmitNotFetchedFromStoreForm) {
|
| + // Test that observing a newly submitted form that is fetched after on submit
|
| + // shows the save password bar.
|
| + EXPECT_CALL(driver_, FillPasswordForm(_)).Times(Exactly(0));
|
| + std::vector<PasswordForm> observed;
|
| + PasswordForm form(MakeSimpleForm());
|
| + observed.push_back(form);
|
| +
|
| + PasswordStoreConsumer* form_manager = nullptr;
|
| + // Do not call back from store after GetLogins is called. Instead, save the
|
| + // pointer to the form manager for calling back later. This emulates that
|
| + // PasswordStore does not manage to fetch a form till moment of submission.
|
| + ON_CALL(*store_, GetLogins(_, _, _))
|
| + .WillByDefault(testing::SaveArg<2>(&form_manager));
|
| + // The initial load.
|
| + manager()->OnPasswordFormsParsed(&driver_, observed);
|
| + // The initial layout.
|
| + manager()->OnPasswordFormsRendered(&driver_, observed, true);
|
| + ASSERT_TRUE(form_manager);
|
| +
|
| + // And the form submit contract is to call ProvisionallySavePassword.
|
| + manager()->ProvisionallySavePassword(form);
|
| +
|
| + // Emulate fetching password form from PasswordStore after submission but
|
| + // before post-navigation load.
|
| + form_manager->OnGetPasswordStoreResults(
|
| + ScopedVector<autofill::PasswordForm>());
|
| +
|
| + scoped_ptr<PasswordFormManager> form_to_save;
|
| + EXPECT_CALL(client_,
|
| + PromptUserToSavePasswordPtr(
|
| + _, CredentialSourceType::CREDENTIAL_SOURCE_PASSWORD_MANAGER))
|
| + .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save)));
|
| +
|
| + // Now the password manager waits for the navigation to complete.
|
| + observed.clear();
|
| + // The post-navigation load.
|
| + manager()->OnPasswordFormsParsed(&driver_, observed);
|
| + // The post-navigation layout.
|
| + manager()->OnPasswordFormsRendered(&driver_, observed, true);
|
| +
|
| + ASSERT_TRUE(form_to_save);
|
| + EXPECT_CALL(*store_, AddLogin(FormMatches(form)));
|
| +
|
| + // Simulate saving the form, as if the info bar was accepted.
|
| + form_to_save->Save();
|
| +}
|
| +
|
| } // namespace password_manager
|
|
|