Chromium Code Reviews| 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..71a7533048471311b3c8f65fd3cdabe948fde095 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,177 @@ TEST_F(PasswordManagerTest, SubmitNotFetchedFromStoreForm) { |
| form_to_save->Save(); |
| } |
| +TEST_F(PasswordManagerTest, PasswordGenerationForceSaving) { |
| + std::vector<PasswordForm> observed; |
| + PasswordForm form(MakeSimpleForm()); |
| + observed.push_back(form); |
| + // The initial load. |
|
vabr (Chromium)
2015/07/13 14:57:00
optional nit: I'm not convinced that the comment h
Garrett Casto
2015/07/13 17:20:13
Done.
|
| + manager()->OnPasswordFormsParsed(&driver_, observed); |
| + // The initial layout. |
| + manager()->OnPasswordFormsRendered(&driver_, observed, true); |
| + |
| + manager()->SetHasGeneratedPasswordForForm(&driver_, form, true); |
| + |
| + // The user should not be presented with an infobar as they have already given |
|
vabr (Chromium)
2015/07/13 14:57:00
nit: Alternative phrasing:
"be presented with an i
Garrett Casto
2015/07/13 17:20:13
True, done.
|
| + // 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); |
| + // The initial load. |
| + manager()->OnPasswordFormsParsed(&driver_, observed); |
| + // The initial layout. |
| + 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 |
| + // occured. |
|
vabr (Chromium)
2015/07/13 14:57:00
typo: occurred
Garrett Casto
2015/07/13 17:20:13
Done.
|
| + 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. |
| +} |
| + |
| +TEST_F(PasswordManagerTest, |
| + PasswordGenerationNoLongerGeneratedPasswordNotForceSaved_FailedSubmit) { |
|
vabr (Chromium)
2015/07/13 14:57:00
In this test and the next one, it is not clear, wh
Garrett Casto
2015/07/13 17:20:13
I only mention failed submit here. I can expound u
|
| + std::vector<PasswordForm> observed; |
| + PasswordForm form(MakeSimpleForm()); |
| + observed.push_back(form); |
| + // The initial load. |
| + manager()->OnPasswordFormsParsed(&driver_, observed); |
| + // The initial layout. |
| + 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. |
|
vabr (Chromium)
2015/07/13 14:57:00
Here we give a second reason (after not provisiona
Garrett Casto
2015/07/13 17:20:13
They are testing two different things. The two tes
|
| + manager()->OnPasswordFormsRendered(&driver_, observed, |
| + true); // The post-navigation layout. |
| +} |
| + |
| +TEST_F(PasswordManagerTest, |
| + PasswordGenerationNoLongerGeneratedPasswordNotForceSaved) { |
| + std::vector<PasswordForm> observed; |
| + PasswordForm form(MakeSimpleForm()); |
| + observed.push_back(form); |
| + // The initial load. |
| + manager()->OnPasswordFormsParsed(&driver_, observed); |
| + // The initial layout. |
| + 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); |
| + // The initial load. |
| + manager()->OnPasswordFormsParsed(&driver_, observed); |
| + // The initial layout. |
| + manager()->OnPasswordFormsRendered(&driver_, observed, true); |
| + |
| + manager()->SetHasGeneratedPasswordForForm(&driver_, form, true); |
| + |
| + // Simulate user changing the password and username, without every completely |
|
vabr (Chromium)
2015/07/13 14:57:00
typo: every -> ever
Garrett Casto
2015/07/13 17:20:13
Done.
|
| + // 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 |