Commit 7f96e76a authored by Jan Wilken Dörrie's avatar Jan Wilken Dörrie Committed by Chromium LUCI CQ

[Passwords] Fix PasswordForm::IsPossibleChangePasswordForm()

Prior to this change PasswordForm's IsPossibleChangePasswordForm()
simply checked whether the new_password_field member was not the empty
string. This relied on setting it to a non-empty name during form
parsing if a new password field was found. However, it thus was unable
to disinguish missing new password fields from existing ones without a
name.

This change fixes this issue by checking that
new_password_field_renderer_id is set instead.

Fixed: 1164971
Change-Id: Icb0c6ab8d7841b7ecc3f7c09088be659b240f7e2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2622432Reviewed-by: default avatarMaria Kazinova <kazinova@google.com>
Commit-Queue: Jan Wilken Dörrie <jdoerrie@chromium.org>
Cr-Commit-Position: refs/heads/master@{#842473}
parent df4de8d1
...@@ -173,11 +173,12 @@ PasswordForm& PasswordForm::operator=(const PasswordForm& form) = default; ...@@ -173,11 +173,12 @@ PasswordForm& PasswordForm::operator=(const PasswordForm& form) = default;
PasswordForm& PasswordForm::operator=(PasswordForm&& form) = default; PasswordForm& PasswordForm::operator=(PasswordForm&& form) = default;
bool PasswordForm::IsPossibleChangePasswordForm() const { bool PasswordForm::IsPossibleChangePasswordForm() const {
return !new_password_element.empty(); return !new_password_element_renderer_id.is_null();
} }
bool PasswordForm::IsPossibleChangePasswordFormWithoutUsername() const { bool PasswordForm::IsPossibleChangePasswordFormWithoutUsername() const {
return IsPossibleChangePasswordForm() && username_element.empty(); return IsPossibleChangePasswordForm() &&
username_element_renderer_id.is_null();
} }
bool PasswordForm::HasUsernameElement() const { bool PasswordForm::HasUsernameElement() const {
......
...@@ -3768,6 +3768,47 @@ TEST_P(PasswordManagerTest, SubmissionDetectedOnClearedForm) { ...@@ -3768,6 +3768,47 @@ TEST_P(PasswordManagerTest, SubmissionDetectedOnClearedForm) {
manager()->OnPasswordFormCleared(&driver_, form_data); manager()->OnPasswordFormCleared(&driver_, form_data);
} }
// Similar test as above with fields that have empty names.
TEST_P(PasswordManagerTest, SubmissionDetectedOnClearedNamelessForm) {
constexpr base::char16 kEmptyName[] = STRING16_LITERAL("");
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(features::kDetectFormSubmissionOnFormClear);
EXPECT_CALL(client_, IsSavingAndFillingEnabled).WillRepeatedly(Return(true));
PasswordForm saved_match(MakeSavedForm());
EXPECT_CALL(*store_, GetLogins)
.WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), saved_match)));
FormData form_data;
form_data.unique_renderer_id = FormRendererId(0);
form_data.url = GURL("http://www.google.com/a/LoginAuth");
FormFieldData old_password_field;
old_password_field.form_control_type = "password";
old_password_field.unique_renderer_id = FieldRendererId(1);
old_password_field.name = kEmptyName;
old_password_field.value = ASCIIToUTF16("oldpass");
form_data.fields.push_back(old_password_field);
FormFieldData new_password_field;
new_password_field.form_control_type = "password";
new_password_field.unique_renderer_id = FieldRendererId(2);
new_password_field.name = kEmptyName;
new_password_field.autocomplete_attribute = "new-password";
form_data.fields.push_back(new_password_field);
manager()->OnPasswordFormsParsed(&driver_, {form_data});
form_data.fields[0].value = ASCIIToUTF16("oldpass");
form_data.fields[1].value = ASCIIToUTF16("newpass");
manager()->OnInformAboutUserInput(&driver_, form_data);
std::unique_ptr<PasswordFormManagerForUI> form_manager_to_save;
EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr)
.WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager_to_save)));
manager()->OnPasswordFormCleared(&driver_, form_data);
}
TEST_P(PasswordManagerTest, SubmissionDetectedOnClearedFormlessFields) { TEST_P(PasswordManagerTest, SubmissionDetectedOnClearedFormlessFields) {
base::test::ScopedFeatureList feature_list; base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(features::kDetectFormSubmissionOnFormClear); feature_list.InitAndEnableFeature(features::kDetectFormSubmissionOnFormClear);
...@@ -3830,6 +3871,63 @@ TEST_P(PasswordManagerTest, SubmissionDetectedOnClearedFormlessFields) { ...@@ -3830,6 +3871,63 @@ TEST_P(PasswordManagerTest, SubmissionDetectedOnClearedFormlessFields) {
manager()->OnPasswordFormCleared(&driver_, form_data); manager()->OnPasswordFormCleared(&driver_, form_data);
} }
} }
// Similar test as above with fields that have empty names.
TEST_P(PasswordManagerTest, SubmissionDetectedOnClearedNameAndFormlessFields) {
constexpr base::char16 kEmptyName[] = STRING16_LITERAL("");
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(features::kDetectFormSubmissionOnFormClear);
EXPECT_CALL(client_, IsSavingAndFillingEnabled).WillRepeatedly(Return(true));
PasswordForm saved_match(MakeSavedForm());
EXPECT_CALL(*store_, GetLogins)
.WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), saved_match)));
for (bool new_password_field_was_cleared : {true, false}) {
SCOPED_TRACE(testing::Message("#new password field was cleared = ")
<< new_password_field_was_cleared);
// Create FormData for a form with 1 password field and process it.
FormData form_data;
form_data.is_form_tag = false;
form_data.unique_renderer_id = FormRendererId(0);
form_data.url = GURL("http://www.google.com/a/LoginAuth");
FormFieldData old_password_field;
old_password_field.form_control_type = "password";
old_password_field.unique_renderer_id = FieldRendererId(1);
old_password_field.name = kEmptyName;
old_password_field.value = ASCIIToUTF16("oldpass");
form_data.fields.push_back(old_password_field);
FormFieldData new_password_field;
new_password_field.form_control_type = "password";
new_password_field.unique_renderer_id = FieldRendererId(2);
new_password_field.name = kEmptyName;
new_password_field.autocomplete_attribute = "new-password";
form_data.fields.push_back(new_password_field);
manager()->OnPasswordFormsParsed(&driver_, {form_data});
form_data.fields[0].value = ASCIIToUTF16("oldpass");
form_data.fields[1].value = ASCIIToUTF16("newpass");
manager()->OnInformAboutUserInput(&driver_, form_data);
form_data.fields[0].value.clear();
if (new_password_field_was_cleared)
form_data.fields[1].value.clear();
std::unique_ptr<PasswordFormManagerForUI> form_manager_to_save;
if (new_password_field_was_cleared) {
EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr)
.WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager_to_save)));
} else {
EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr).Times(0);
}
manager()->OnPasswordFormCleared(&driver_, form_data);
}
}
#endif // !defined(OS_IOS) #endif // !defined(OS_IOS)
TEST_P(PasswordManagerTest, IsFormManagerPendingPasswordUpdate) { TEST_P(PasswordManagerTest, IsFormManagerPendingPasswordUpdate) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment