Commit 70c9d025 authored by thestig's avatar thestig Committed by Commit bot

Autofill: Apply the same field match mask to all phone field subtypes.

- Modify unit tests to test relevant field types.
- Cleanup code.
- Update heuristics test expectations.

Review URL: https://codereview.chromium.org/1010743007

Cr-Commit-Position: refs/heads/master@{#322312}
parent 13648c69
...@@ -24,7 +24,7 @@ ADDRESS_HOME_ZIP | zipCode | ZIP* | | typeOfAddress_1-default ...@@ -24,7 +24,7 @@ ADDRESS_HOME_ZIP | zipCode | ZIP* | | typeOfAddress_1-default
UNKNOWN_TYPE | | Phone number | Χ | typeOfAddress_1-default UNKNOWN_TYPE | | Phone number | Χ | typeOfAddress_1-default
PHONE_HOME_WHOLE_NUMBER | phone1 | Phone number | | typeOfAddress_1-default PHONE_HOME_WHOLE_NUMBER | phone1 | Phone number | | typeOfAddress_1-default
UNKNOWN_TYPE | | Ext | Χ | typeOfAddress_1-default UNKNOWN_TYPE | | Ext | Χ | typeOfAddress_1-default
PHONE_HOME_WHOLE_NUMBER | phone2 | Ext | | typeOfAddress_1-default UNKNOWN_TYPE | phone2 | Ext | | typeOfAddress_1-default
UNKNOWN_TYPE | phone1Type | Cell phone | C | typeOfAddress_1-default UNKNOWN_TYPE | phone1Type | Cell phone | C | typeOfAddress_1-default
UNKNOWN_TYPE | | Email address* | Χ | typeOfAddress_1-default UNKNOWN_TYPE | | Email address* | Χ | typeOfAddress_1-default
EMAIL_ADDRESS | email1 | Email address* | | typeOfAddress_1-default EMAIL_ADDRESS | email1 | Email address* | | typeOfAddress_1-default
......
...@@ -17,10 +17,10 @@ namespace autofill { ...@@ -17,10 +17,10 @@ namespace autofill {
namespace { namespace {
// This string includes all area code separators, including NoText. // This string includes all area code separators, including NoText.
base::string16 GetAreaRegex() { std::string GetAreaRegex() {
base::string16 area_code = base::UTF8ToUTF16(kAreaCodeRe); std::string area_code = kAreaCodeRe;
area_code.append(base::ASCIIToUTF16("|")); // Regexp separator. area_code.append("|"); // Regexp separator.
area_code.append(base::UTF8ToUTF16(kAreaCodeNotextRe)); area_code.append(kAreaCodeNotextRe);
return area_code; return area_code;
} }
...@@ -119,24 +119,23 @@ const PhoneField::Parser PhoneField::kPhoneFieldGrammars[] = { ...@@ -119,24 +119,23 @@ const PhoneField::Parser PhoneField::kPhoneFieldGrammars[] = {
// static // static
scoped_ptr<FormField> PhoneField::Parse(AutofillScanner* scanner) { scoped_ptr<FormField> PhoneField::Parse(AutofillScanner* scanner) {
if (scanner->IsEnd()) if (scanner->IsEnd())
return NULL; return nullptr;
scanner->SaveCursor(); size_t start_cursor = scanner->SaveCursor();
// The form owns the following variables, so they should not be deleted. // The form owns the following variables, so they should not be deleted.
AutofillField* parsed_fields[FIELD_MAX]; AutofillField* parsed_fields[FIELD_MAX];
for (size_t i = 0; i < arraysize(kPhoneFieldGrammars); ++i) { for (size_t i = 0; i < arraysize(kPhoneFieldGrammars); ++i) {
memset(parsed_fields, 0, sizeof(parsed_fields)); memset(parsed_fields, 0, sizeof(parsed_fields));
scanner->SaveCursor(); size_t saved_cursor = scanner->SaveCursor();
// Attempt to parse according to the next grammar. // Attempt to parse according to the next grammar.
for (; i < arraysize(kPhoneFieldGrammars) && for (; i < arraysize(kPhoneFieldGrammars) &&
kPhoneFieldGrammars[i].regex != REGEX_SEPARATOR; ++i) { kPhoneFieldGrammars[i].regex != REGEX_SEPARATOR; ++i) {
if (!ParseFieldSpecifics( if (!ParsePhoneField(
scanner, scanner,
GetRegExp(kPhoneFieldGrammars[i].regex), GetRegExp(kPhoneFieldGrammars[i].regex),
MATCH_DEFAULT | MATCH_TELEPHONE,
&parsed_fields[kPhoneFieldGrammars[i].phone_part])) &parsed_fields[kPhoneFieldGrammars[i].phone_part]))
break; break;
if (kPhoneFieldGrammars[i].max_size && if (kPhoneFieldGrammars[i].max_size &&
...@@ -148,8 +147,8 @@ scoped_ptr<FormField> PhoneField::Parse(AutofillScanner* scanner) { ...@@ -148,8 +147,8 @@ scoped_ptr<FormField> PhoneField::Parse(AutofillScanner* scanner) {
} }
if (i >= arraysize(kPhoneFieldGrammars)) { if (i >= arraysize(kPhoneFieldGrammars)) {
scanner->Rewind(); scanner->RewindTo(saved_cursor);
return NULL; // Parsing failed. return nullptr; // Parsing failed.
} }
if (kPhoneFieldGrammars[i].regex == REGEX_SEPARATOR) if (kPhoneFieldGrammars[i].regex == REGEX_SEPARATOR)
break; // Parsing succeeded. break; // Parsing succeeded.
...@@ -160,17 +159,15 @@ scoped_ptr<FormField> PhoneField::Parse(AutofillScanner* scanner) { ...@@ -160,17 +159,15 @@ scoped_ptr<FormField> PhoneField::Parse(AutofillScanner* scanner) {
} while (i < arraysize(kPhoneFieldGrammars) && } while (i < arraysize(kPhoneFieldGrammars) &&
kPhoneFieldGrammars[i].regex != REGEX_SEPARATOR); kPhoneFieldGrammars[i].regex != REGEX_SEPARATOR);
scanner->RewindTo(saved_cursor);
if (i + 1 == arraysize(kPhoneFieldGrammars)) { if (i + 1 == arraysize(kPhoneFieldGrammars)) {
scanner->Rewind(); return nullptr; // Tried through all the possibilities - did not match.
return NULL; // Tried through all the possibilities - did not match.
} }
scanner->Rewind();
} }
if (!parsed_fields[FIELD_PHONE]) { if (!parsed_fields[FIELD_PHONE]) {
scanner->Rewind(); scanner->RewindTo(start_cursor);
return NULL; return nullptr;
} }
scoped_ptr<PhoneField> phone_field(new PhoneField); scoped_ptr<PhoneField> phone_field(new PhoneField);
...@@ -181,16 +178,19 @@ scoped_ptr<FormField> PhoneField::Parse(AutofillScanner* scanner) { ...@@ -181,16 +178,19 @@ scoped_ptr<FormField> PhoneField::Parse(AutofillScanner* scanner) {
// Look for a third text box. // Look for a third text box.
if (!phone_field->parsed_phone_fields_[FIELD_SUFFIX]) { if (!phone_field->parsed_phone_fields_[FIELD_SUFFIX]) {
if (!ParseField(scanner, base::UTF8ToUTF16(kPhoneSuffixRe), if (!ParsePhoneField(scanner, kPhoneSuffixRe,
&phone_field->parsed_phone_fields_[FIELD_SUFFIX])) { &phone_field->parsed_phone_fields_[FIELD_SUFFIX])) {
ParseField(scanner, base::UTF8ToUTF16(kPhoneSuffixSeparatorRe), ParsePhoneField(scanner, kPhoneSuffixSeparatorRe,
&phone_field->parsed_phone_fields_[FIELD_SUFFIX]); &phone_field->parsed_phone_fields_[FIELD_SUFFIX]);
} }
} }
// Now look for an extension. // Now look for an extension.
ParseField(scanner, base::UTF8ToUTF16(kPhoneExtensionRe), // The extension is not actually used, so this just eats the field so other
&phone_field->parsed_phone_fields_[FIELD_EXTENSION]); // parsers do not mistaken it for something else.
ParsePhoneField(scanner,
kPhoneExtensionRe,
&phone_field->parsed_phone_fields_[FIELD_EXTENSION]);
return phone_field.Pass(); return phone_field.Pass();
} }
...@@ -200,21 +200,21 @@ bool PhoneField::ClassifyField(ServerFieldTypeMap* map) const { ...@@ -200,21 +200,21 @@ bool PhoneField::ClassifyField(ServerFieldTypeMap* map) const {
DCHECK(parsed_phone_fields_[FIELD_PHONE]); // Phone was correctly parsed. DCHECK(parsed_phone_fields_[FIELD_PHONE]); // Phone was correctly parsed.
if ((parsed_phone_fields_[FIELD_COUNTRY_CODE] != NULL) || if ((parsed_phone_fields_[FIELD_COUNTRY_CODE]) ||
(parsed_phone_fields_[FIELD_AREA_CODE] != NULL) || (parsed_phone_fields_[FIELD_AREA_CODE]) ||
(parsed_phone_fields_[FIELD_SUFFIX] != NULL)) { (parsed_phone_fields_[FIELD_SUFFIX])) {
if (parsed_phone_fields_[FIELD_COUNTRY_CODE] != NULL) { if (parsed_phone_fields_[FIELD_COUNTRY_CODE]) {
ok = ok && AddClassification(parsed_phone_fields_[FIELD_COUNTRY_CODE], ok = ok && AddClassification(parsed_phone_fields_[FIELD_COUNTRY_CODE],
PHONE_HOME_COUNTRY_CODE, PHONE_HOME_COUNTRY_CODE,
map); map);
} }
ServerFieldType field_number_type = PHONE_HOME_NUMBER; ServerFieldType field_number_type = PHONE_HOME_NUMBER;
if (parsed_phone_fields_[FIELD_AREA_CODE] != NULL) { if (parsed_phone_fields_[FIELD_AREA_CODE]) {
ok = ok && AddClassification(parsed_phone_fields_[FIELD_AREA_CODE], ok = ok && AddClassification(parsed_phone_fields_[FIELD_AREA_CODE],
PHONE_HOME_CITY_CODE, PHONE_HOME_CITY_CODE,
map); map);
} else if (parsed_phone_fields_[FIELD_COUNTRY_CODE] != NULL) { } else if (parsed_phone_fields_[FIELD_COUNTRY_CODE]) {
// Only if we can find country code without city code, it means the phone // Only if we can find country code without city code, it means the phone
// number include city code. // number include city code.
field_number_type = PHONE_HOME_CITY_AND_NUMBER; field_number_type = PHONE_HOME_CITY_AND_NUMBER;
...@@ -226,7 +226,7 @@ bool PhoneField::ClassifyField(ServerFieldTypeMap* map) const { ...@@ -226,7 +226,7 @@ bool PhoneField::ClassifyField(ServerFieldTypeMap* map) const {
map); map);
// We tag the suffix as PHONE_HOME_NUMBER, then when filling the form // We tag the suffix as PHONE_HOME_NUMBER, then when filling the form
// we fill only the suffix depending on the size of the input field. // we fill only the suffix depending on the size of the input field.
if (parsed_phone_fields_[FIELD_SUFFIX] != NULL) { if (parsed_phone_fields_[FIELD_SUFFIX]) {
ok = ok && AddClassification(parsed_phone_fields_[FIELD_SUFFIX], ok = ok && AddClassification(parsed_phone_fields_[FIELD_SUFFIX],
PHONE_HOME_NUMBER, PHONE_HOME_NUMBER,
map); map);
...@@ -245,31 +245,41 @@ PhoneField::PhoneField() { ...@@ -245,31 +245,41 @@ PhoneField::PhoneField() {
} }
// static // static
base::string16 PhoneField::GetRegExp(RegexType regex_id) { std::string PhoneField::GetRegExp(RegexType regex_id) {
switch (regex_id) { switch (regex_id) {
case REGEX_COUNTRY: case REGEX_COUNTRY:
return base::UTF8ToUTF16(kCountryCodeRe); return kCountryCodeRe;
case REGEX_AREA: case REGEX_AREA:
return GetAreaRegex(); return GetAreaRegex();
case REGEX_AREA_NOTEXT: case REGEX_AREA_NOTEXT:
return base::UTF8ToUTF16(kAreaCodeNotextRe); return kAreaCodeNotextRe;
case REGEX_PHONE: case REGEX_PHONE:
return base::UTF8ToUTF16(kPhoneRe); return kPhoneRe;
case REGEX_PREFIX_SEPARATOR: case REGEX_PREFIX_SEPARATOR:
return base::UTF8ToUTF16(kPhonePrefixSeparatorRe); return kPhonePrefixSeparatorRe;
case REGEX_PREFIX: case REGEX_PREFIX:
return base::UTF8ToUTF16(kPhonePrefixRe); return kPhonePrefixRe;
case REGEX_SUFFIX_SEPARATOR: case REGEX_SUFFIX_SEPARATOR:
return base::UTF8ToUTF16(kPhoneSuffixSeparatorRe); return kPhoneSuffixSeparatorRe;
case REGEX_SUFFIX: case REGEX_SUFFIX:
return base::UTF8ToUTF16(kPhoneSuffixRe); return kPhoneSuffixRe;
case REGEX_EXTENSION: case REGEX_EXTENSION:
return base::UTF8ToUTF16(kPhoneExtensionRe); return kPhoneExtensionRe;
default: default:
NOTREACHED(); NOTREACHED();
break; break;
} }
return base::string16(); return std::string();
}
// static
bool PhoneField::ParsePhoneField(AutofillScanner* scanner,
const std::string& regex,
AutofillField** field) {
return ParseFieldSpecifics(scanner,
base::UTF8ToUTF16(regex),
MATCH_DEFAULT | MATCH_TELEPHONE,
field);
} }
} // namespace autofill } // namespace autofill
...@@ -79,8 +79,13 @@ class PhoneField : public FormField { ...@@ -79,8 +79,13 @@ class PhoneField : public FormField {
PhoneField(); PhoneField();
// Returns the regular expression string correspoding to |regex_id| // Returns the regular expression string corresponding to |regex_id|
static base::string16 GetRegExp(RegexType regex_id); static std::string GetRegExp(RegexType regex_id);
// Convenient wrapper for ParseFieldSpecifics().
static bool ParsePhoneField(AutofillScanner* scanner,
const std::string& regex,
AutofillField** field);
// FIELD_PHONE is always present; holds suffix if prefix is present. // FIELD_PHONE is always present; holds suffix if prefix is present.
// The rest could be NULL. // The rest could be NULL.
......
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