Commit b896f2da authored by Christoph Schwering's avatar Christoph Schwering Committed by Commit Bot

Fix bug 999952: blacklist social titles for company names in autofill

Blacklist some social titles from being autofilled for company name:

- English: Mr, Mr., Mrs, Mrs., Ms, Ms., Miss, Mistress, Mister, Miss;
- German: Frau, Herr,
- Mme, Mlle, Mlles, M.
- Academic: Prof, Prof., Dr, Dr.

Bug: 999952
Change-Id: I9cfe9f00263148b7821d8b7069651a7835fb6e87
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1807316Reviewed-by: default avatarDominic Battré <battre@chromium.org>
Commit-Queue: Christoph Schwering <schwering@google.com>
Cr-Commit-Position: refs/heads/master@{#697181}
parent b3c79496
...@@ -250,15 +250,26 @@ void CompanyInfo::SetRawInfo(ServerFieldType type, ...@@ -250,15 +250,26 @@ void CompanyInfo::SetRawInfo(ServerFieldType type,
} }
bool CompanyInfo::IsValidOrVerified(const base::string16& value) const { bool CompanyInfo::IsValidOrVerified(const base::string16& value) const {
if (!base::FeatureList::IsEnabled( if (profile_ && profile_->IsVerified()) {
autofill::features::kAutofillRejectCompanyBirthyear))
return true; return true;
}
if (profile_ && profile_->IsVerified()) // |value| is a birthyear:
return true; if (base::FeatureList::IsEnabled(
autofill::features::kAutofillRejectCompanyBirthyear) &&
// Companies that are of the format of a four digit birth year are not valid. MatchesPattern(value, base::UTF8ToUTF16("^(19|20)\\d{2}$"))) {
return !MatchesPattern(value, base::UTF8ToUTF16("^(19|20)\\d{2}$")); return false;
}
// |value| is a social title:
if (base::FeatureList::IsEnabled(
autofill::features::kAutofillRejectCompanySocialTitle) &&
MatchesPattern(value, base::UTF8ToUTF16(
"^(Ms\\.?|Mrs\\.?|Mr\\.?|Miss|Mistress|Mister|"
"Frau|Herr|"
"Mlle|Mme|M\\.|"
"Dr\\.?|Prof\\.?)$"))) {
return false;
}
return true;
} }
} // namespace autofill } // namespace autofill
...@@ -432,6 +432,33 @@ TEST(CompanyTest, CompanyNameYear) { ...@@ -432,6 +432,33 @@ TEST(CompanyTest, CompanyNameYear) {
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2345")); company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2345"));
EXPECT_EQ(UTF8ToUTF16("2345"), company.GetRawInfo(COMPANY_NAME)); EXPECT_EQ(UTF8ToUTF16("2345"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr"));
EXPECT_EQ(UTF8ToUTF16("Mr"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr."));
EXPECT_EQ(UTF8ToUTF16("Mr."), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs"));
EXPECT_EQ(UTF8ToUTF16("Mrs"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs."));
EXPECT_EQ(UTF8ToUTF16("Mrs."), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs."));
EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs."), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs. Smith"));
EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs. Smith"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau"));
EXPECT_EQ(UTF8ToUTF16("Frau"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau Doktor"));
EXPECT_EQ(UTF8ToUTF16("Frau Doktor"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Herr"));
EXPECT_EQ(UTF8ToUTF16("Herr"), company.GetRawInfo(COMPANY_NAME));
profile.set_origin("Not empty"); profile.set_origin("Not empty");
ASSERT_TRUE(profile.IsVerified()); ASSERT_TRUE(profile.IsVerified());
...@@ -449,6 +476,142 @@ TEST(CompanyTest, CompanyNameYear) { ...@@ -449,6 +476,142 @@ TEST(CompanyTest, CompanyNameYear) {
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2345")); company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2345"));
EXPECT_EQ(UTF8ToUTF16("2345"), company.GetRawInfo(COMPANY_NAME)); EXPECT_EQ(UTF8ToUTF16("2345"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr"));
EXPECT_EQ(UTF8ToUTF16("Mr"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr."));
EXPECT_EQ(UTF8ToUTF16("Mr."), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs"));
EXPECT_EQ(UTF8ToUTF16("Mrs"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs."));
EXPECT_EQ(UTF8ToUTF16("Mrs."), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs."));
EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs."), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs. Smith"));
EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs. Smith"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau"));
EXPECT_EQ(UTF8ToUTF16("Frau"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau Doktor"));
EXPECT_EQ(UTF8ToUTF16("Frau Doktor"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Herr"));
EXPECT_EQ(UTF8ToUTF16("Herr"), company.GetRawInfo(COMPANY_NAME));
}
TEST(CompanyTest, CompanyNameSocialTitle) {
base::test::ScopedFeatureList scoped_features;
scoped_features.InitWithFeatures(
/*enabled_features=*/{features::kAutofillRejectCompanySocialTitle},
/*disabled_features=*/{});
AutofillProfile profile;
CompanyInfo company(&profile);
ASSERT_FALSE(profile.IsVerified());
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Google"));
EXPECT_EQ(UTF8ToUTF16("Google"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("1987"));
EXPECT_EQ(UTF8ToUTF16("1987"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("It was 1987."));
EXPECT_EQ(UTF8ToUTF16("It was 1987."), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("1987 was the year."));
EXPECT_EQ(UTF8ToUTF16("1987 was the year."),
company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Yes, 1987 was the year."));
EXPECT_EQ(UTF8ToUTF16("Yes, 1987 was the year."),
company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2019"));
EXPECT_EQ(UTF8ToUTF16("2019"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("1818"));
EXPECT_EQ(UTF8ToUTF16("1818"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2345"));
EXPECT_EQ(UTF8ToUTF16("2345"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr"));
EXPECT_EQ(UTF8ToUTF16(""), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr."));
EXPECT_EQ(UTF8ToUTF16(""), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs"));
EXPECT_EQ(UTF8ToUTF16(""), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs."));
EXPECT_EQ(UTF8ToUTF16(""), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs."));
EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs."), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs. Smith"));
EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs. Smith"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau"));
EXPECT_EQ(UTF8ToUTF16(""), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau Doktor"));
EXPECT_EQ(UTF8ToUTF16("Frau Doktor"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Herr"));
EXPECT_EQ(UTF8ToUTF16(""), company.GetRawInfo(COMPANY_NAME));
profile.set_origin("Not empty");
ASSERT_TRUE(profile.IsVerified());
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Google"));
EXPECT_EQ(UTF8ToUTF16("Google"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("1987"));
EXPECT_EQ(UTF8ToUTF16("1987"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2019"));
EXPECT_EQ(UTF8ToUTF16("2019"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("1818"));
EXPECT_EQ(UTF8ToUTF16("1818"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2345"));
EXPECT_EQ(UTF8ToUTF16("2345"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr"));
EXPECT_EQ(UTF8ToUTF16("Mr"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr."));
EXPECT_EQ(UTF8ToUTF16("Mr."), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs"));
EXPECT_EQ(UTF8ToUTF16("Mrs"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs."));
EXPECT_EQ(UTF8ToUTF16("Mrs."), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs."));
EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs."), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs. Smith"));
EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs. Smith"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau"));
EXPECT_EQ(UTF8ToUTF16("Frau"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau Doktor"));
EXPECT_EQ(UTF8ToUTF16("Frau Doktor"), company.GetRawInfo(COMPANY_NAME));
company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Herr"));
EXPECT_EQ(UTF8ToUTF16("Herr"), company.GetRawInfo(COMPANY_NAME));
} }
TEST(CompanyTest, CompanyNameYearCopy) { TEST(CompanyTest, CompanyNameYearCopy) {
...@@ -488,4 +651,41 @@ TEST(CompanyTest, CompanyNameYearIsEqual) { ...@@ -488,4 +651,41 @@ TEST(CompanyTest, CompanyNameYearIsEqual) {
EXPECT_EQ(company_old, company_young); EXPECT_EQ(company_old, company_young);
} }
TEST(CompanyTest, CompanyNameSocialTitleCopy) {
base::test::ScopedFeatureList scoped_features;
scoped_features.InitWithFeatures(
/*enabled_features=*/{features::kAutofillRejectCompanySocialTitle},
/*disabled_features=*/{});
AutofillProfile profile;
ASSERT_FALSE(profile.IsVerified());
CompanyInfo company_google(&profile);
CompanyInfo company_year(&profile);
company_google.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Google"));
company_year.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Prof."));
company_google = company_year;
EXPECT_EQ(UTF8ToUTF16(""), company_google.GetRawInfo(COMPANY_NAME));
}
TEST(CompanyTest, CompanyNameSocialTitleIsEqual) {
base::test::ScopedFeatureList scoped_features;
scoped_features.InitWithFeatures(
/*enabled_features=*/{features::kAutofillRejectCompanySocialTitle},
/*disabled_features=*/{});
AutofillProfile profile;
ASSERT_FALSE(profile.IsVerified());
CompanyInfo company_old(&profile);
CompanyInfo company_young(&profile);
company_old.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Dr"));
company_young.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Prof"));
EXPECT_EQ(company_old, company_young);
}
} // namespace autofill } // namespace autofill
...@@ -112,6 +112,11 @@ const base::Feature kAutofillProfileServerValidation{ ...@@ -112,6 +112,11 @@ const base::Feature kAutofillProfileServerValidation{
const base::Feature kAutofillRejectCompanyBirthyear{ const base::Feature kAutofillRejectCompanyBirthyear{
"AutofillRejectCompanyBirthyear", base::FEATURE_DISABLED_BY_DEFAULT}; "AutofillRejectCompanyBirthyear", base::FEATURE_DISABLED_BY_DEFAULT};
// Controls whether autofill rejects using non-verified company names that are
// social titles (e.g., "Mrs.") in some languages.
const base::Feature kAutofillRejectCompanySocialTitle{
"AutofillRejectCompanySocialTitle", base::FEATURE_DISABLED_BY_DEFAULT};
// Controls whether or not a group of fields not enclosed in a form can be // Controls whether or not a group of fields not enclosed in a form can be
// considered a form. If this is enabled, unowned fields will only constitute // considered a form. If this is enabled, unowned fields will only constitute
// a form if there are signals to suggest that this might a checkout page. // a form if there are signals to suggest that this might a checkout page.
......
...@@ -42,6 +42,7 @@ extern const base::Feature kAutofillPreferServerNamePredictions; ...@@ -42,6 +42,7 @@ extern const base::Feature kAutofillPreferServerNamePredictions;
extern const base::Feature kAutofillProfileClientValidation; extern const base::Feature kAutofillProfileClientValidation;
extern const base::Feature kAutofillProfileServerValidation; extern const base::Feature kAutofillProfileServerValidation;
extern const base::Feature kAutofillRejectCompanyBirthyear; extern const base::Feature kAutofillRejectCompanyBirthyear;
extern const base::Feature kAutofillRejectCompanySocialTitle;
extern const base::Feature kAutofillRestrictUnownedFieldsToFormlessCheckout; extern const base::Feature kAutofillRestrictUnownedFieldsToFormlessCheckout;
extern const base::Feature kAutofillRichMetadataQueries; extern const base::Feature kAutofillRichMetadataQueries;
extern const base::Feature kAutofillSaveOnProbablySubmitted; extern const base::Feature kAutofillSaveOnProbablySubmitted;
......
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