| Index: components/autofill/core/browser/phone_field.cc
|
| diff --git a/components/autofill/core/browser/phone_field.cc b/components/autofill/core/browser/phone_field.cc
|
| index d7860497378a55090a40234e907f1c4e39ef0f5a..3c6b351e7d2317c514196b59ec73b4dbf4622a1b 100644
|
| --- a/components/autofill/core/browser/phone_field.cc
|
| +++ b/components/autofill/core/browser/phone_field.cc
|
| @@ -17,10 +17,10 @@ namespace autofill {
|
| namespace {
|
|
|
| // This string includes all area code separators, including NoText.
|
| -base::string16 GetAreaRegex() {
|
| - base::string16 area_code = base::UTF8ToUTF16(kAreaCodeRe);
|
| - area_code.append(base::ASCIIToUTF16("|")); // Regexp separator.
|
| - area_code.append(base::UTF8ToUTF16(kAreaCodeNotextRe));
|
| +std::string GetAreaRegex() {
|
| + std::string area_code = kAreaCodeRe;
|
| + area_code.append("|"); // Regexp separator.
|
| + area_code.append(kAreaCodeNotextRe);
|
| return area_code;
|
| }
|
|
|
| @@ -119,24 +119,23 @@ const PhoneField::Parser PhoneField::kPhoneFieldGrammars[] = {
|
| // static
|
| scoped_ptr<FormField> PhoneField::Parse(AutofillScanner* scanner) {
|
| 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.
|
| AutofillField* parsed_fields[FIELD_MAX];
|
|
|
| for (size_t i = 0; i < arraysize(kPhoneFieldGrammars); ++i) {
|
| memset(parsed_fields, 0, sizeof(parsed_fields));
|
| - scanner->SaveCursor();
|
| + size_t saved_cursor = scanner->SaveCursor();
|
|
|
| // Attempt to parse according to the next grammar.
|
| for (; i < arraysize(kPhoneFieldGrammars) &&
|
| kPhoneFieldGrammars[i].regex != REGEX_SEPARATOR; ++i) {
|
| - if (!ParseFieldSpecifics(
|
| + if (!ParsePhoneField(
|
| scanner,
|
| GetRegExp(kPhoneFieldGrammars[i].regex),
|
| - MATCH_DEFAULT | MATCH_TELEPHONE,
|
| &parsed_fields[kPhoneFieldGrammars[i].phone_part]))
|
| break;
|
| if (kPhoneFieldGrammars[i].max_size &&
|
| @@ -148,8 +147,8 @@ scoped_ptr<FormField> PhoneField::Parse(AutofillScanner* scanner) {
|
| }
|
|
|
| if (i >= arraysize(kPhoneFieldGrammars)) {
|
| - scanner->Rewind();
|
| - return NULL; // Parsing failed.
|
| + scanner->RewindTo(saved_cursor);
|
| + return nullptr; // Parsing failed.
|
| }
|
| if (kPhoneFieldGrammars[i].regex == REGEX_SEPARATOR)
|
| break; // Parsing succeeded.
|
| @@ -160,17 +159,15 @@ scoped_ptr<FormField> PhoneField::Parse(AutofillScanner* scanner) {
|
| } while (i < arraysize(kPhoneFieldGrammars) &&
|
| kPhoneFieldGrammars[i].regex != REGEX_SEPARATOR);
|
|
|
| + scanner->RewindTo(saved_cursor);
|
| if (i + 1 == arraysize(kPhoneFieldGrammars)) {
|
| - scanner->Rewind();
|
| - return NULL; // Tried through all the possibilities - did not match.
|
| + return nullptr; // Tried through all the possibilities - did not match.
|
| }
|
| -
|
| - scanner->Rewind();
|
| }
|
|
|
| if (!parsed_fields[FIELD_PHONE]) {
|
| - scanner->Rewind();
|
| - return NULL;
|
| + scanner->RewindTo(start_cursor);
|
| + return nullptr;
|
| }
|
|
|
| scoped_ptr<PhoneField> phone_field(new PhoneField);
|
| @@ -181,16 +178,19 @@ scoped_ptr<FormField> PhoneField::Parse(AutofillScanner* scanner) {
|
|
|
| // Look for a third text box.
|
| if (!phone_field->parsed_phone_fields_[FIELD_SUFFIX]) {
|
| - if (!ParseField(scanner, base::UTF8ToUTF16(kPhoneSuffixRe),
|
| - &phone_field->parsed_phone_fields_[FIELD_SUFFIX])) {
|
| - ParseField(scanner, base::UTF8ToUTF16(kPhoneSuffixSeparatorRe),
|
| - &phone_field->parsed_phone_fields_[FIELD_SUFFIX]);
|
| + if (!ParsePhoneField(scanner, kPhoneSuffixRe,
|
| + &phone_field->parsed_phone_fields_[FIELD_SUFFIX])) {
|
| + ParsePhoneField(scanner, kPhoneSuffixSeparatorRe,
|
| + &phone_field->parsed_phone_fields_[FIELD_SUFFIX]);
|
| }
|
| }
|
|
|
| // Now look for an extension.
|
| - ParseField(scanner, base::UTF8ToUTF16(kPhoneExtensionRe),
|
| - &phone_field->parsed_phone_fields_[FIELD_EXTENSION]);
|
| + // The extension is not actually used, so this just eats the field so other
|
| + // parsers do not mistaken it for something else.
|
| + ParsePhoneField(scanner,
|
| + kPhoneExtensionRe,
|
| + &phone_field->parsed_phone_fields_[FIELD_EXTENSION]);
|
|
|
| return phone_field.Pass();
|
| }
|
| @@ -200,21 +200,21 @@ bool PhoneField::ClassifyField(ServerFieldTypeMap* map) const {
|
|
|
| DCHECK(parsed_phone_fields_[FIELD_PHONE]); // Phone was correctly parsed.
|
|
|
| - if ((parsed_phone_fields_[FIELD_COUNTRY_CODE] != NULL) ||
|
| - (parsed_phone_fields_[FIELD_AREA_CODE] != NULL) ||
|
| - (parsed_phone_fields_[FIELD_SUFFIX] != NULL)) {
|
| - if (parsed_phone_fields_[FIELD_COUNTRY_CODE] != NULL) {
|
| + if ((parsed_phone_fields_[FIELD_COUNTRY_CODE]) ||
|
| + (parsed_phone_fields_[FIELD_AREA_CODE]) ||
|
| + (parsed_phone_fields_[FIELD_SUFFIX])) {
|
| + if (parsed_phone_fields_[FIELD_COUNTRY_CODE]) {
|
| ok = ok && AddClassification(parsed_phone_fields_[FIELD_COUNTRY_CODE],
|
| PHONE_HOME_COUNTRY_CODE,
|
| map);
|
| }
|
|
|
| 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],
|
| PHONE_HOME_CITY_CODE,
|
| 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
|
| // number include city code.
|
| field_number_type = PHONE_HOME_CITY_AND_NUMBER;
|
| @@ -226,7 +226,7 @@ bool PhoneField::ClassifyField(ServerFieldTypeMap* map) const {
|
| map);
|
| // 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.
|
| - if (parsed_phone_fields_[FIELD_SUFFIX] != NULL) {
|
| + if (parsed_phone_fields_[FIELD_SUFFIX]) {
|
| ok = ok && AddClassification(parsed_phone_fields_[FIELD_SUFFIX],
|
| PHONE_HOME_NUMBER,
|
| map);
|
| @@ -245,31 +245,41 @@ PhoneField::PhoneField() {
|
| }
|
|
|
| // static
|
| -base::string16 PhoneField::GetRegExp(RegexType regex_id) {
|
| +std::string PhoneField::GetRegExp(RegexType regex_id) {
|
| switch (regex_id) {
|
| case REGEX_COUNTRY:
|
| - return base::UTF8ToUTF16(kCountryCodeRe);
|
| + return kCountryCodeRe;
|
| case REGEX_AREA:
|
| return GetAreaRegex();
|
| case REGEX_AREA_NOTEXT:
|
| - return base::UTF8ToUTF16(kAreaCodeNotextRe);
|
| + return kAreaCodeNotextRe;
|
| case REGEX_PHONE:
|
| - return base::UTF8ToUTF16(kPhoneRe);
|
| + return kPhoneRe;
|
| case REGEX_PREFIX_SEPARATOR:
|
| - return base::UTF8ToUTF16(kPhonePrefixSeparatorRe);
|
| + return kPhonePrefixSeparatorRe;
|
| case REGEX_PREFIX:
|
| - return base::UTF8ToUTF16(kPhonePrefixRe);
|
| + return kPhonePrefixRe;
|
| case REGEX_SUFFIX_SEPARATOR:
|
| - return base::UTF8ToUTF16(kPhoneSuffixSeparatorRe);
|
| + return kPhoneSuffixSeparatorRe;
|
| case REGEX_SUFFIX:
|
| - return base::UTF8ToUTF16(kPhoneSuffixRe);
|
| + return kPhoneSuffixRe;
|
| case REGEX_EXTENSION:
|
| - return base::UTF8ToUTF16(kPhoneExtensionRe);
|
| + return kPhoneExtensionRe;
|
| default:
|
| NOTREACHED();
|
| 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
|
|
|