Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(187)

Unified Diff: components/password_manager/core/browser/password_manager_unittest.cc

Issue 1237543002: [Password Generation] Save passwords even if heuristics determine submit failed (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698