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 043333361b1390708cfa9dbc8b229315ac0b1528..44f5e9d2d19a116ad23feac8d84cd58078f1f7ba 100644 |
--- a/components/password_manager/core/browser/password_manager_unittest.cc |
+++ b/components/password_manager/core/browser/password_manager_unittest.cc |
@@ -1266,6 +1266,74 @@ TEST_F(PasswordManagerTest, PasswordGenerationUsernameChanged) { |
EXPECT_EQ(form.new_password_value, form_to_save.password_value); |
} |
+TEST_F(PasswordManagerTest, PasswordGenerationPresavePassword) { |
+ std::vector<PasswordForm> observed; |
+ PasswordForm form(MakeFormWithOnlyNewPasswordField()); |
+ observed.push_back(form); |
+ EXPECT_CALL(client_, IsSavingAndFillingEnabledForCurrentPage()) |
+ .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(*store_, GetLogins(_, _)) |
+ .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms())); |
+ manager()->OnPasswordFormsParsed(&driver_, observed); |
+ manager()->OnPasswordFormsRendered(&driver_, observed, true); |
+ |
+ // The user accepts a generated password. |
+ form.password_value = base::ASCIIToUTF16("password"); |
+ EXPECT_CALL(*store_, AddLogin(form)).WillOnce(Return()); |
+ manager()->OnPresaveGeneratedPassword(form); |
+ manager()->SetHasGeneratedPasswordForForm(&driver_, form, true); |
+ |
+ // The user updates the generated password. |
+ PasswordForm updated_form(form); |
+ updated_form.password_value = base::ASCIIToUTF16("password_12345"); |
+ EXPECT_CALL(*store_, UpdateLoginWithPrimaryKey(updated_form, form)) |
+ .WillOnce(Return()); |
+ manager()->OnPresaveGeneratedPassword(updated_form); |
+ |
+ // The user removes the generated password. |
+ EXPECT_CALL(*store_, RemoveLogin(updated_form)).WillOnce(Return()); |
+ manager()->SetHasGeneratedPasswordForForm(&driver_, updated_form, false); |
+} |
+ |
+TEST_F(PasswordManagerTest, PasswordGenerationPresavePasswordAndLogin) { |
+ EXPECT_CALL(client_, IsSavingAndFillingEnabledForCurrentPage()) |
+ .WillRepeatedly(Return(true)); |
+ const bool kFalseTrue[] = {false, true}; |
+ for (bool foundMatchedLoginsInStore : kFalseTrue) { |
+ SCOPED_TRACE(testing::Message("foundMatchedLoginsInStore = ") |
+ << foundMatchedLoginsInStore); |
+ std::vector<PasswordForm> observed; |
+ PasswordForm form(MakeFormWithOnlyNewPasswordField()); |
+ observed.push_back(form); |
+ if (foundMatchedLoginsInStore) { |
+ EXPECT_CALL(*store_, GetLogins(_, _)) |
+ .WillRepeatedly(WithArg<1>(InvokeConsumer(form))); |
+ EXPECT_CALL(driver_, FillPasswordForm(_)).Times(2); |
+ EXPECT_CALL(client_, NotifySuccessfulLoginWithExistingPassword(_)) |
+ .Times(1); |
+ } else { |
+ EXPECT_CALL(*store_, GetLogins(_, _)) |
+ .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms())); |
+ } |
+ EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_, _)).Times(0); |
+ EXPECT_CALL(client_, AutomaticPasswordSaveIndicator()).Times(1); |
+ manager()->OnPasswordFormsParsed(&driver_, observed); |
+ manager()->OnPasswordFormsRendered(&driver_, observed, true); |
+ |
+ // The user accepts generated password and makes successful login. |
+ EXPECT_CALL(*store_, AddLogin(form)).WillOnce(Return()); |
+ manager()->OnPresaveGeneratedPassword(form); |
+ manager()->SetHasGeneratedPasswordForForm(&driver_, form, true); |
+ ::testing::Mock::VerifyAndClearExpectations(store_.get()); |
+ |
+ EXPECT_CALL(*store_, UpdateLoginWithPrimaryKey(_, form)).WillOnce(Return()); |
+ OnPasswordFormSubmitted(form); |
+ observed.clear(); |
+ manager()->OnPasswordFormsParsed(&driver_, observed); |
+ manager()->OnPasswordFormsRendered(&driver_, observed, true); |
+ } |
+} |
+ |
TEST_F(PasswordManagerTest, |
PasswordGenerationNoCorrespondingPasswordFormManager) { |
// Verifies that if there is no corresponding password form manager for the |