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 08b30bf20f31c43b27a7eef8918d0162cca738d5..e5746e54b196a7dba2f0a8dd637760401382b59d 100644 |
--- a/components/password_manager/core/browser/password_manager_unittest.cc |
+++ b/components/password_manager/core/browser/password_manager_unittest.cc |
@@ -25,6 +25,7 @@ using base::ASCIIToUTF16; |
using testing::_; |
using testing::AnyNumber; |
using testing::Exactly; |
+using testing::Invoke; |
using testing::Return; |
using testing::WithArg; |
@@ -1028,4 +1029,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 |