Index: chrome/browser/autofill/phone_field.cc |
diff --git a/chrome/browser/autofill/phone_field.cc b/chrome/browser/autofill/phone_field.cc |
index 78459765f4e55baf014b5ca064de5607efc1d433..56210d4b9aa5ea3b169650205b3448a9028f01b8 100644 |
--- a/chrome/browser/autofill/phone_field.cc |
+++ b/chrome/browser/autofill/phone_field.cc |
@@ -26,6 +26,8 @@ string16 GetAreaRegex() { |
} // namespace |
+PhoneField::~PhoneField() {} |
+ |
// Phone field grammars - first matched grammar will be parsed. Grammars are |
// separated by { REGEX_SEPARATOR, FIELD_NONE, 0 }. Suffix and extension are |
// parsed separately unless they are necessary parts of the match. |
@@ -37,100 +39,161 @@ string16 GetAreaRegex() { |
// <ext> - extension. |
// :N means field is limited to N characters, otherwise it is unlimited. |
// (pattern <field>)? means pattern is optional and matched separately. |
-PhoneField::Parser PhoneField::phone_field_grammars_[] = { |
+const PhoneField::Parser PhoneField::kPhoneFieldGrammars[] = { |
// Country code: <cc> Area Code: <ac> Phone: <phone> (- <suffix> |
// (Ext: <ext>)?)? |
- { PhoneField::REGEX_COUNTRY, PhoneField::FIELD_COUNTRY_CODE, 0 }, |
- { PhoneField::REGEX_AREA, PhoneField::FIELD_AREA_CODE, 0 }, |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_PHONE, 0 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_COUNTRY, FIELD_COUNTRY_CODE, 0 }, |
+ { REGEX_AREA, FIELD_AREA_CODE, 0 }, |
+ { REGEX_PHONE, FIELD_PHONE, 0 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// \( <ac> \) <phone>:3 <suffix>:4 (Ext: <ext>)? |
- { PhoneField::REGEX_AREA_NOTEXT, PhoneField::FIELD_AREA_CODE, 3 }, |
- { PhoneField::REGEX_PREFIX_SEPARATOR, PhoneField::FIELD_PHONE, 3 }, |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_SUFFIX, 4 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_AREA_NOTEXT, FIELD_AREA_CODE, 3 }, |
+ { REGEX_PREFIX_SEPARATOR, FIELD_PHONE, 3 }, |
+ { REGEX_PHONE, FIELD_SUFFIX, 4 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// Phone: <cc> <ac>:3 - <phone>:3 - <suffix>:4 (Ext: <ext>)? |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_COUNTRY_CODE, 0 }, |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_AREA_CODE, 3 }, |
- { PhoneField::REGEX_PREFIX_SEPARATOR, PhoneField::FIELD_PHONE, 3 }, |
- { PhoneField::REGEX_SUFFIX_SEPARATOR, PhoneField::FIELD_SUFFIX, 4 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_PHONE, FIELD_COUNTRY_CODE, 0 }, |
+ { REGEX_PHONE, FIELD_AREA_CODE, 3 }, |
+ { REGEX_PREFIX_SEPARATOR, FIELD_PHONE, 3 }, |
+ { REGEX_SUFFIX_SEPARATOR, FIELD_SUFFIX, 4 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// Phone: <cc>:3 <ac>:3 <phone>:3 <suffix>:4 (Ext: <ext>)? |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_COUNTRY_CODE, 3 }, |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_AREA_CODE, 3 }, |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_PHONE, 3 }, |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_SUFFIX, 4 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_PHONE, FIELD_COUNTRY_CODE, 3 }, |
+ { REGEX_PHONE, FIELD_AREA_CODE, 3 }, |
+ { REGEX_PHONE, FIELD_PHONE, 3 }, |
+ { REGEX_PHONE, FIELD_SUFFIX, 4 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// Area Code: <ac> Phone: <phone> (- <suffix> (Ext: <ext>)?)? |
- { PhoneField::REGEX_AREA, PhoneField::FIELD_AREA_CODE, 0 }, |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_PHONE, 0 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_AREA, FIELD_AREA_CODE, 0 }, |
+ { REGEX_PHONE, FIELD_PHONE, 0 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// Phone: <ac> <phone>:3 <suffix>:4 (Ext: <ext>)? |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_AREA_CODE, 0 }, |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_PHONE, 3 }, |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_SUFFIX, 4 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_PHONE, FIELD_AREA_CODE, 0 }, |
+ { REGEX_PHONE, FIELD_PHONE, 3 }, |
+ { REGEX_PHONE, FIELD_SUFFIX, 4 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// Phone: <cc> \( <ac> \) <phone> (- <suffix> (Ext: <ext>)?)? |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_COUNTRY_CODE, 0 }, |
- { PhoneField::REGEX_AREA_NOTEXT, PhoneField::FIELD_AREA_CODE, 0 }, |
- { PhoneField::REGEX_PREFIX_SEPARATOR, PhoneField::FIELD_PHONE, 0 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_PHONE, FIELD_COUNTRY_CODE, 0 }, |
+ { REGEX_AREA_NOTEXT, FIELD_AREA_CODE, 0 }, |
+ { REGEX_PREFIX_SEPARATOR, FIELD_PHONE, 0 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// Phone: \( <ac> \) <phone> (- <suffix> (Ext: <ext>)?)? |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_COUNTRY_CODE, 0 }, |
- { PhoneField::REGEX_AREA_NOTEXT, PhoneField::FIELD_AREA_CODE, 0 }, |
- { PhoneField::REGEX_PREFIX_SEPARATOR, PhoneField::FIELD_PHONE, 0 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_PHONE, FIELD_COUNTRY_CODE, 0 }, |
+ { REGEX_AREA_NOTEXT, FIELD_AREA_CODE, 0 }, |
+ { REGEX_PREFIX_SEPARATOR, FIELD_PHONE, 0 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// Phone: <cc> - <ac> - <phone> - <suffix> (Ext: <ext>)? |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_COUNTRY_CODE, 0 }, |
- { PhoneField::REGEX_PREFIX_SEPARATOR, PhoneField::FIELD_AREA_CODE, 0 }, |
- { PhoneField::REGEX_PREFIX_SEPARATOR, PhoneField::FIELD_PHONE, 0 }, |
- { PhoneField::REGEX_SUFFIX_SEPARATOR, PhoneField::FIELD_SUFFIX, 0 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_PHONE, FIELD_COUNTRY_CODE, 0 }, |
+ { REGEX_PREFIX_SEPARATOR, FIELD_AREA_CODE, 0 }, |
+ { REGEX_PREFIX_SEPARATOR, FIELD_PHONE, 0 }, |
+ { REGEX_SUFFIX_SEPARATOR, FIELD_SUFFIX, 0 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// Phone: <ac> Prefix: <phone> Suffix: <suffix> (Ext: <ext>)? |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_AREA_CODE, 0 }, |
- { PhoneField::REGEX_PREFIX, PhoneField::FIELD_PHONE, 0 }, |
- { PhoneField::REGEX_SUFFIX, PhoneField::FIELD_SUFFIX, 0 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_PHONE, FIELD_AREA_CODE, 0 }, |
+ { REGEX_PREFIX, FIELD_PHONE, 0 }, |
+ { REGEX_SUFFIX, FIELD_SUFFIX, 0 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// Phone: <ac> - <phone>:3 - <suffix>:4 (Ext: <ext>)? |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_AREA_CODE, 0 }, |
- { PhoneField::REGEX_PREFIX_SEPARATOR, PhoneField::FIELD_PHONE, 3 }, |
- { PhoneField::REGEX_SUFFIX_SEPARATOR, PhoneField::FIELD_SUFFIX, 4 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_PHONE, FIELD_AREA_CODE, 0 }, |
+ { REGEX_PREFIX_SEPARATOR, FIELD_PHONE, 3 }, |
+ { REGEX_SUFFIX_SEPARATOR, FIELD_SUFFIX, 4 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// Phone: <cc> - <ac> - <phone> (Ext: <ext>)? |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_COUNTRY_CODE, 0 }, |
- { PhoneField::REGEX_PREFIX_SEPARATOR, PhoneField::FIELD_AREA_CODE, 0 }, |
- { PhoneField::REGEX_SUFFIX_SEPARATOR, PhoneField::FIELD_PHONE, 0 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_PHONE, FIELD_COUNTRY_CODE, 0 }, |
+ { REGEX_PREFIX_SEPARATOR, FIELD_AREA_CODE, 0 }, |
+ { REGEX_SUFFIX_SEPARATOR, FIELD_PHONE, 0 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// Phone: <ac> - <phone> (Ext: <ext>)? |
- { PhoneField::REGEX_AREA, PhoneField::FIELD_AREA_CODE, 0 }, |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_PHONE, 0 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_AREA, FIELD_AREA_CODE, 0 }, |
+ { REGEX_PHONE, FIELD_PHONE, 0 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// Phone: <cc>:3 - <phone>:10 (Ext: <ext>)? |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_COUNTRY_CODE, 3 }, |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_PHONE, 10 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_PHONE, FIELD_COUNTRY_CODE, 3 }, |
+ { REGEX_PHONE, FIELD_PHONE, 10 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
// Phone: <phone> (Ext: <ext>)? |
- { PhoneField::REGEX_PHONE, PhoneField::FIELD_PHONE, 0 }, |
- { PhoneField::REGEX_SEPARATOR, FIELD_NONE, 0 }, |
+ { REGEX_PHONE, FIELD_PHONE, 0 }, |
+ { REGEX_SEPARATOR, FIELD_NONE, 0 }, |
}; |
-PhoneField::~PhoneField() {} |
- |
// static |
FormField* PhoneField::Parse(AutofillScanner* scanner, |
bool parse_new_field_types) { |
if (scanner->IsEnd()) |
return NULL; |
+ scanner->SaveCursor(); |
+ |
+ // The form owns the following variables, so they should not be deleted. |
+ const AutofillField* parsed_fields[FIELD_MAX]; |
+ |
+ for (size_t i = 0; i < arraysize(kPhoneFieldGrammars); ++i) { |
+ memset(parsed_fields, 0, sizeof(parsed_fields)); |
+ scanner->SaveCursor(); |
+ |
+ // Attempt to parse according to the next grammar. |
+ for (; i < arraysize(kPhoneFieldGrammars) && |
+ kPhoneFieldGrammars[i].regex != REGEX_SEPARATOR; ++i) { |
+ if (!ParseFieldSpecifics( |
+ scanner, |
+ GetRegExp(kPhoneFieldGrammars[i].regex), |
+ MATCH_DEFAULT | MATCH_TELEPHONE, |
+ &parsed_fields[kPhoneFieldGrammars[i].phone_part])) |
+ break; |
+ if (kPhoneFieldGrammars[i].max_size && |
+ (!parsed_fields[kPhoneFieldGrammars[i].phone_part]->max_length || |
+ kPhoneFieldGrammars[i].max_size < |
+ parsed_fields[kPhoneFieldGrammars[i].phone_part]->max_length)) { |
+ break; |
+ } |
+ } |
+ |
+ if (i >= arraysize(kPhoneFieldGrammars)) { |
+ scanner->Rewind(); |
+ return NULL; // Parsing failed. |
+ } |
+ if (kPhoneFieldGrammars[i].regex == REGEX_SEPARATOR) |
+ break; // Parsing succeeded. |
+ |
+ // Proceed to the next grammar. |
+ do { |
+ ++i; |
+ } while (i < arraysize(kPhoneFieldGrammars) && |
+ kPhoneFieldGrammars[i].regex != REGEX_SEPARATOR); |
+ |
+ if (i + 1 == arraysize(kPhoneFieldGrammars)) { |
+ scanner->Rewind(); |
+ return NULL; // Tried through all the possibilities - did not match. |
+ } |
+ |
+ scanner->Rewind(); |
+ } |
+ |
+ if (!parsed_fields[FIELD_PHONE]) { |
+ scanner->Rewind(); |
+ return NULL; |
+ } |
+ |
scoped_ptr<PhoneField> phone_field(new PhoneField); |
- if (ParseInternal(phone_field.get(), scanner)) |
- return phone_field.release(); |
+ for (int i = 0; i < FIELD_MAX; ++i) |
+ phone_field->parsed_phone_fields_[i] = parsed_fields[i]; |
- return NULL; |
-} |
+ // Look for optional fields. |
-PhoneField::PhoneField() { |
- memset(parsed_phone_fields_, 0, sizeof(parsed_phone_fields_)); |
+ // Look for a third text box. |
+ if (!phone_field->parsed_phone_fields_[FIELD_SUFFIX]) { |
+ if (!ParseField(scanner, UTF8ToUTF16(autofill::kPhoneSuffixRe), |
+ &phone_field->parsed_phone_fields_[FIELD_SUFFIX])) { |
+ ParseField(scanner, UTF8ToUTF16(autofill::kPhoneSuffixSeparatorRe), |
+ &phone_field->parsed_phone_fields_[FIELD_SUFFIX]); |
+ } |
+ } |
+ |
+ // Now look for an extension. |
+ ParseField(scanner, UTF8ToUTF16(autofill::kPhoneExtensionRe), |
+ &phone_field->parsed_phone_fields_[FIELD_EXTENSION]); |
Ilya Sherman
2013/01/15 22:17:33
Lines 125-194 were just copy/pasted, with the only
|
+ |
+ return phone_field.release(); |
} |
bool PhoneField::ClassifyField(FieldTypeMap* map) const { |
@@ -178,7 +241,12 @@ bool PhoneField::ClassifyField(FieldTypeMap* map) const { |
return ok; |
} |
-string16 PhoneField::GetRegExp(RegexType regex_id) const { |
+PhoneField::PhoneField() { |
+ memset(parsed_phone_fields_, 0, sizeof(parsed_phone_fields_)); |
+} |
+ |
+// static |
+string16 PhoneField::GetRegExp(RegexType regex_id) { |
switch (regex_id) { |
case REGEX_COUNTRY: |
return UTF8ToUTF16(autofill::kCountryCodeRe); |
@@ -204,80 +272,3 @@ string16 PhoneField::GetRegExp(RegexType regex_id) const { |
} |
return string16(); |
} |
- |
-// static |
-bool PhoneField::ParseInternal(PhoneField *phone_field, |
- AutofillScanner* scanner) { |
- DCHECK(phone_field); |
- scanner->SaveCursor(); |
- |
- // The form owns the following variables, so they should not be deleted. |
- const AutofillField* parsed_fields[FIELD_MAX]; |
- |
- for (size_t i = 0; i < arraysize(phone_field_grammars_); ++i) { |
- memset(parsed_fields, 0, sizeof(parsed_fields)); |
- scanner->SaveCursor(); |
- |
- // Attempt to parse according to the next grammar. |
- for (; i < arraysize(phone_field_grammars_) && |
- phone_field_grammars_[i].regex != REGEX_SEPARATOR; ++i) { |
- if (!ParseFieldSpecifics( |
- scanner, |
- phone_field->GetRegExp(phone_field_grammars_[i].regex), |
- MATCH_DEFAULT | MATCH_TELEPHONE, |
- &parsed_fields[phone_field_grammars_[i].phone_part])) |
- break; |
- if (phone_field_grammars_[i].max_size && |
- (!parsed_fields[phone_field_grammars_[i].phone_part]->max_length || |
- phone_field_grammars_[i].max_size < |
- parsed_fields[phone_field_grammars_[i].phone_part]->max_length)) { |
- break; |
- } |
- } |
- |
- if (i >= arraysize(phone_field_grammars_)) { |
- scanner->Rewind(); |
- return false; // Parsing failed. |
- } |
- if (phone_field_grammars_[i].regex == REGEX_SEPARATOR) |
- break; // Parsing succeeded. |
- |
- // Proceed to the next grammar. |
- do { |
- ++i; |
- } while (i < arraysize(phone_field_grammars_) && |
- phone_field_grammars_[i].regex != REGEX_SEPARATOR); |
- |
- if (i + 1 == arraysize(phone_field_grammars_)) { |
- scanner->Rewind(); |
- return false; // Tried through all the possibilities - did not match. |
- } |
- |
- scanner->Rewind(); |
- } |
- |
- if (!parsed_fields[FIELD_PHONE]) { |
- scanner->Rewind(); |
- return false; |
- } |
- |
- for (int i = 0; i < FIELD_MAX; ++i) |
- phone_field->parsed_phone_fields_[i] = parsed_fields[i]; |
- |
- // Look for optional fields. |
- |
- // Look for a third text box. |
- if (!phone_field->parsed_phone_fields_[FIELD_SUFFIX]) { |
- if (!ParseField(scanner, UTF8ToUTF16(autofill::kPhoneSuffixRe), |
- &phone_field->parsed_phone_fields_[FIELD_SUFFIX])) { |
- ParseField(scanner, UTF8ToUTF16(autofill::kPhoneSuffixSeparatorRe), |
- &phone_field->parsed_phone_fields_[FIELD_SUFFIX]); |
- } |
- } |
- |
- // Now look for an extension. |
- ParseField(scanner, UTF8ToUTF16(autofill::kPhoneExtensionRe), |
- &phone_field->parsed_phone_fields_[FIELD_EXTENSION]); |
- |
- return true; |
-} |