| 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 98a4af3b059d9c0c45ac48a0bb834cdc1b28f775..0fa95f680994fcea944ea8a946901a2d5ef722a9 100644
|
| --- a/components/password_manager/core/browser/password_manager_unittest.cc
|
| +++ b/components/password_manager/core/browser/password_manager_unittest.cc
|
| @@ -233,7 +233,9 @@ MATCHER_P(FormMatches, form, "") {
|
| return form.signon_realm == arg.signon_realm && form.origin == arg.origin &&
|
| form.action == arg.action &&
|
| form.username_element == arg.username_element &&
|
| + form.username_value == arg.username_value &&
|
| form.password_element == arg.password_element &&
|
| + form.password_value == arg.password_value &&
|
| form.new_password_element == arg.new_password_element &&
|
| form.submit_element == arg.submit_element;
|
| }
|
| @@ -1028,4 +1030,172 @@ TEST_F(PasswordManagerTest, SubmitNotFetchedFromStoreForm) {
|
| form_to_save->Save();
|
| }
|
|
|
| +TEST_F(PasswordManagerTest, PasswordGenerationForceSaving) {
|
| + std::vector<PasswordForm> observed;
|
| + PasswordForm form(MakeSimpleForm());
|
| + observed.push_back(form);
|
| + manager()->OnPasswordFormsParsed(&driver_, observed);
|
| + manager()->OnPasswordFormsRendered(&driver_, observed, true);
|
| +
|
| + manager()->SetHasGeneratedPasswordForForm(&driver_, form, true);
|
| +
|
| + // The user should not need to confirm saving as they have already given
|
| + // consent by using the generated password. The form should be saved once
|
| + // navigation occurs. The client will be informed that automatic saving has
|
| + // occured.
|
| + EXPECT_CALL(client_,
|
| + PromptUserToSavePasswordPtr(
|
| + _, CredentialSourceType::CREDENTIAL_SOURCE_PASSWORD_MANAGER))
|
| + .Times(Exactly(0));
|
| + EXPECT_CALL(*store_, AddLogin(FormMatches(form)));
|
| + scoped_ptr<PasswordFormManager> saved_form_manager;
|
| + EXPECT_CALL(client_, AutomaticPasswordSavePtr(_))
|
| + .Times(Exactly(1))
|
| + .WillOnce(WithArg<0>(SaveToScopedPtr(&saved_form_manager)));
|
| +
|
| + // Simulate submission failing, with the same form being visible after
|
| + // navigation.
|
| + manager()->ProvisionallySavePassword(form);
|
| + manager()->OnPasswordFormsParsed(&driver_,
|
| + observed); // The post-navigation load.
|
| + manager()->OnPasswordFormsRendered(&driver_, observed,
|
| + true); // The post-navigation layout.
|
| +}
|
| +
|
| +TEST_F(PasswordManagerTest, PasswordGenerationPasswordEdited) {
|
| + std::vector<PasswordForm> observed;
|
| + PasswordForm form(MakeSimpleForm());
|
| + observed.push_back(form);
|
| + manager()->OnPasswordFormsParsed(&driver_, observed);
|
| + manager()->OnPasswordFormsRendered(&driver_, observed, true);
|
| +
|
| + manager()->SetHasGeneratedPasswordForForm(&driver_, form, true);
|
| +
|
| + // Simulate user editing and submitting a different password. Verify that
|
| + // the edited password is the one that is saved.
|
| + form.password_value = ASCIIToUTF16("different_password");
|
| + manager()->ProvisionallySavePassword(form);
|
| +
|
| + // The user should not be presented with an infobar as they have already given
|
| + // consent by using the generated password. The form should be saved once
|
| + // navigation occurs. The client will be informed that automatic saving has
|
| + // occurred.
|
| + EXPECT_CALL(client_,
|
| + PromptUserToSavePasswordPtr(
|
| + _, CredentialSourceType::CREDENTIAL_SOURCE_PASSWORD_MANAGER))
|
| + .Times(Exactly(0));
|
| + EXPECT_CALL(*store_, AddLogin(FormMatches(form)));
|
| + scoped_ptr<PasswordFormManager> saved_form_manager;
|
| + EXPECT_CALL(client_, AutomaticPasswordSavePtr(_))
|
| + .Times(Exactly(1))
|
| + .WillOnce(WithArg<0>(SaveToScopedPtr(&saved_form_manager)));
|
| +
|
| + // Simulate submission failing, with the same form being visible after
|
| + // navigation.
|
| + manager()->OnPasswordFormsParsed(&driver_,
|
| + observed); // The post-navigation load.
|
| + manager()->OnPasswordFormsRendered(&driver_, observed,
|
| + true); // The post-navigation layout.
|
| +}
|
| +
|
| +// Generated password are saved even if it looks like the submit failed (the
|
| +// form reappeared). Verify that passwords which are no longer marked as
|
| +// generated will not be automatically saved.
|
| +TEST_F(PasswordManagerTest,
|
| + PasswordGenerationNoLongerGeneratedPasswordNotForceSaved_FailedSubmit) {
|
| + std::vector<PasswordForm> observed;
|
| + PasswordForm form(MakeSimpleForm());
|
| + observed.push_back(form);
|
| + manager()->OnPasswordFormsParsed(&driver_, observed);
|
| + manager()->OnPasswordFormsRendered(&driver_, observed, true);
|
| +
|
| + manager()->SetHasGeneratedPasswordForForm(&driver_, form, true);
|
| +
|
| + // Simulate user removing generated password and adding a new one.
|
| + form.new_password_value = ASCIIToUTF16("different_password");
|
| + manager()->SetHasGeneratedPasswordForForm(&driver_, form, false);
|
| +
|
| + // No infobar or prompt is shown if submission fails.
|
| + EXPECT_CALL(client_,
|
| + PromptUserToSavePasswordPtr(
|
| + _, CredentialSourceType::CREDENTIAL_SOURCE_PASSWORD_MANAGER))
|
| + .Times(Exactly(0));
|
| + EXPECT_CALL(client_, AutomaticPasswordSavePtr(_)).Times(Exactly(0));
|
| +
|
| + // Simulate submission failing, with the same form being visible after
|
| + // navigation.
|
| + manager()->OnPasswordFormsParsed(&driver_,
|
| + observed); // The post-navigation load.
|
| + manager()->OnPasswordFormsRendered(&driver_, observed,
|
| + true); // The post-navigation layout.
|
| +}
|
| +
|
| +// Verify that passwords which are no longer generated trigger the confirmation
|
| +// dialog when submitted.
|
| +TEST_F(PasswordManagerTest,
|
| + PasswordGenerationNoLongerGeneratedPasswordNotForceSaved) {
|
| + std::vector<PasswordForm> observed;
|
| + PasswordForm form(MakeSimpleForm());
|
| + observed.push_back(form);
|
| + manager()->OnPasswordFormsParsed(&driver_, observed);
|
| + manager()->OnPasswordFormsRendered(&driver_, observed, true);
|
| +
|
| + manager()->SetHasGeneratedPasswordForForm(&driver_, form, true);
|
| +
|
| + // Simulate user removing generated password and adding a new one.
|
| + form.password_value = ASCIIToUTF16("different_password");
|
| + manager()->SetHasGeneratedPasswordForForm(&driver_, form, false);
|
| +
|
| + manager()->ProvisionallySavePassword(form);
|
| +
|
| + // Verify that a normal prompt is shown instead of the force saving UI.
|
| + scoped_ptr<PasswordFormManager> form_to_save;
|
| + EXPECT_CALL(client_,
|
| + PromptUserToSavePasswordPtr(
|
| + _, CredentialSourceType::CREDENTIAL_SOURCE_PASSWORD_MANAGER))
|
| + .WillOnce(WithArg<0>(SaveToScopedPtr(&form_to_save)));
|
| + EXPECT_CALL(client_, AutomaticPasswordSavePtr(_)).Times(Exactly(0));
|
| +
|
| + // Simulate submission failing, with the same form being visible after
|
| + // navigation.
|
| + observed.clear();
|
| + manager()->OnPasswordFormsParsed(&driver_,
|
| + observed); // The post-navigation load.
|
| + manager()->OnPasswordFormsRendered(&driver_, observed,
|
| + true); // The post-navigation layout.
|
| +}
|
| +
|
| +TEST_F(PasswordManagerTest, PasswordGenerationUsernameChanged) {
|
| + std::vector<PasswordForm> observed;
|
| + PasswordForm form(MakeSimpleForm());
|
| + form.username_value = ASCIIToUTF16("");
|
| + observed.push_back(form);
|
| + manager()->OnPasswordFormsParsed(&driver_, observed);
|
| + manager()->OnPasswordFormsRendered(&driver_, observed, true);
|
| +
|
| + manager()->SetHasGeneratedPasswordForForm(&driver_, form, true);
|
| +
|
| + // Simulate user changing the password and username, without ever completely
|
| + // deleting the password.
|
| + form.password_value = ASCIIToUTF16("different_password");
|
| + form.username_value = ASCIIToUTF16("new_username");
|
| + manager()->ProvisionallySavePassword(form);
|
| +
|
| + EXPECT_CALL(client_,
|
| + PromptUserToSavePasswordPtr(
|
| + _, CredentialSourceType::CREDENTIAL_SOURCE_PASSWORD_MANAGER))
|
| + .Times(Exactly(0));
|
| + EXPECT_CALL(*store_, AddLogin(FormMatches(form)));
|
| + scoped_ptr<PasswordFormManager> saved_form_manager;
|
| + EXPECT_CALL(client_, AutomaticPasswordSavePtr(_))
|
| + .Times(Exactly(1))
|
| + .WillOnce(WithArg<0>(SaveToScopedPtr(&saved_form_manager)));
|
| +
|
| + observed.clear();
|
| + manager()->OnPasswordFormsParsed(&driver_,
|
| + observed); // The post-navigation load.
|
| + manager()->OnPasswordFormsRendered(&driver_, observed,
|
| + true); // The post-navigation layout.
|
| +}
|
| +
|
| } // namespace password_manager
|
|
|