Index: chrome/browser/password_manager/password_manager_unittest.cc |
diff --git a/chrome/browser/password_manager/password_manager_unittest.cc b/chrome/browser/password_manager/password_manager_unittest.cc |
index f68500c1b4863d6e04a5d0a5e9e1fa4e4797d35b..e345e1fd32603421778ca41c401333345f46c246 100644 |
--- a/chrome/browser/password_manager/password_manager_unittest.cc |
+++ b/chrome/browser/password_manager/password_manager_unittest.cc |
@@ -67,6 +67,8 @@ class TestPasswordManager : public PasswordManager { |
return tpm; |
} |
+ int PendingManagersCount() { return pending_login_managers_.size(); } |
+ |
private: |
DISALLOW_COPY_AND_ASSIGN(TestPasswordManager); |
}; |
@@ -526,3 +528,77 @@ TEST_F(PasswordManagerTest, PasswordFormReappearance) { |
manager()->OnPasswordFormsParsed(observed); |
manager()->OnPasswordFormsRendered(observed); |
} |
+ |
+TEST_F(PasswordManagerTest, RemovePasswordFormSubmitEmptyStore) { |
+ |
+ std::vector<PasswordForm*> result; // Empty password store. |
+ EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); |
+ EXPECT_CALL(*store_.get(), GetLogins(_, _)) |
+ .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); |
+ std::vector<PasswordForm> observed; |
+ PasswordForm form(MakeSimpleForm()); |
+ observed.push_back(form); |
+ manager()->OnPasswordFormsParsed(observed); // The initial load. |
+ manager()->OnPasswordFormsRendered(observed); // The initial layout. |
+ |
+ // And the form submit contract is to call ProvisionallySavePassword. |
+ manager()->ProvisionallySavePassword(form); |
+ |
+ scoped_ptr<PasswordFormManager> form_to_save; |
+ EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) |
+ .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); |
+ |
+ // Now the password manager waits for the navigation to complete. |
+ observed.clear(); |
+ manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
+ manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. |
+ |
+ ASSERT_TRUE(form_to_save.get()); |
+ EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); |
+ |
+ // Simulate saving the form, as if the info bar was accepted. |
+ form_to_save->Save(); |
+ |
+ EXPECT_CALL(*store_.get(), RemoveLoginImpl(_)).Times(Exactly(1)); |
+ EXPECT_CALL(delegate_, DidLastPageLoadEncounterSSLErrors()).Times(Exactly(0)); |
+ |
+ manager()->OnRemovePasswordSuggestion(form); |
+} |
+ |
+TEST_F(PasswordManagerTest, RemovePasswordFormSubmitEmptyStore2) { |
+ |
+ std::vector<PasswordForm*> result; // Empty password store. |
+ EXPECT_CALL(delegate_, FillPasswordForm(_)).Times(Exactly(0)); |
+ EXPECT_CALL(*store_.get(), GetLogins(_, _)) |
+ .WillOnce(DoAll(WithArg<1>(InvokeConsumer(result)), Return(1))); |
+ std::vector<PasswordForm> observed; |
+ PasswordForm form(MakeSimpleForm()); |
+ observed.push_back(form); |
+ ASSERT_TRUE(manager()->PendingManagersCount() == 0); |
+ manager()->OnPasswordFormsParsed(observed); // The initial load. |
+ manager()->OnPasswordFormsRendered(observed); // The initial layout. |
+ ASSERT_TRUE(manager()->PendingManagersCount() == 1); |
+ // And the form submit contract is to call ProvisionallySavePassword. |
+ manager()->ProvisionallySavePassword(form); |
+ |
+ scoped_ptr<PasswordFormManager> form_to_save; |
+ EXPECT_CALL(delegate_, AddSavePasswordInfoBarIfPermitted(_)) |
+ .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save))); |
+ |
+ EXPECT_CALL(*store_.get(), RemoveLoginImpl(_)).Times(Exactly(1)); |
+ EXPECT_CALL(delegate_, DidLastPageLoadEncounterSSLErrors()).Times(Exactly(1)); |
+ manager()->OnRemovePasswordSuggestion(form); |
+ |
+ // Now the password manager waits for the navigation to complete. |
+ observed.clear(); |
+ manager()->OnPasswordFormsParsed(observed); // The post-navigation load. |
+ manager()->OnPasswordFormsRendered(observed); // The post-navigation layout. |
+ ASSERT_TRUE(manager()->PendingManagersCount() == 0); |
+ ASSERT_TRUE(form_to_save.get()); |
+ EXPECT_CALL(*store_.get(), AddLogin(FormMatches(form))); |
+ |
+ // Simulate saving the form, as if the info bar was accepted. |
+ form_to_save->Save(); |
+ |
+ ASSERT_TRUE(manager()->PendingManagersCount() == 0); |
+} |