| Index: components/autofill/browser/phone_field.cc
|
| diff --git a/components/autofill/browser/phone_field.cc b/components/autofill/browser/phone_field.cc
|
| deleted file mode 100644
|
| index 28eefb4792e47020c42bc54378a1d4442c1a5007..0000000000000000000000000000000000000000
|
| --- a/components/autofill/browser/phone_field.cc
|
| +++ /dev/null
|
| @@ -1,276 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "components/autofill/browser/phone_field.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/strings/string16.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "components/autofill/browser/autofill_field.h"
|
| -#include "components/autofill/browser/autofill_regex_constants.h"
|
| -#include "components/autofill/browser/autofill_scanner.h"
|
| -#include "ui/base/l10n/l10n_util.h"
|
| -
|
| -namespace autofill {
|
| -namespace {
|
| -
|
| -// This string includes all area code separators, including NoText.
|
| -base::string16 GetAreaRegex() {
|
| - base::string16 area_code = UTF8ToUTF16(autofill::kAreaCodeRe);
|
| - area_code.append(ASCIIToUTF16("|")); // Regexp separator.
|
| - area_code.append(UTF8ToUTF16(autofill::kAreaCodeNotextRe));
|
| - return area_code;
|
| -}
|
| -
|
| -} // 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.
|
| -// The following notation is used to describe the patterns:
|
| -// <cc> - country code field.
|
| -// <ac> - area code field.
|
| -// <phone> - phone or prefix.
|
| -// <suffix> - suffix.
|
| -// <ext> - extension.
|
| -// :N means field is limited to N characters, otherwise it is unlimited.
|
| -// (pattern <field>)? means pattern is optional and matched separately.
|
| -const PhoneField::Parser PhoneField::kPhoneFieldGrammars[] = {
|
| - // Country code: <cc> Area Code: <ac> Phone: <phone> (- <suffix>
|
| - // (Ext: <ext>)?)?
|
| - { 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>)?
|
| - { 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>)?
|
| - { 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>)?
|
| - { 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>)?)?
|
| - { REGEX_AREA, FIELD_AREA_CODE, 0 },
|
| - { REGEX_PHONE, FIELD_PHONE, 0 },
|
| - { REGEX_SEPARATOR, FIELD_NONE, 0 },
|
| - // Phone: <ac> <phone>:3 <suffix>:4 (Ext: <ext>)?
|
| - { 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>)?)?
|
| - { 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>)?)?
|
| - { 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>)?
|
| - { 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>)?
|
| - { 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>)?
|
| - { 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>)?
|
| - { 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>)?
|
| - { REGEX_AREA, FIELD_AREA_CODE, 0 },
|
| - { REGEX_PHONE, FIELD_PHONE, 0 },
|
| - { REGEX_SEPARATOR, FIELD_NONE, 0 },
|
| - // Phone: <cc>:3 - <phone>:10 (Ext: <ext>)?
|
| - { REGEX_PHONE, FIELD_COUNTRY_CODE, 3 },
|
| - { REGEX_PHONE, FIELD_PHONE, 10 },
|
| - { REGEX_SEPARATOR, FIELD_NONE, 0 },
|
| - // Phone: <phone> (Ext: <ext>)?
|
| - { REGEX_PHONE, FIELD_PHONE, 0 },
|
| - { REGEX_SEPARATOR, FIELD_NONE, 0 },
|
| -};
|
| -
|
| -// static
|
| -FormField* PhoneField::Parse(AutofillScanner* scanner) {
|
| - 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);
|
| - 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 phone_field.release();
|
| -}
|
| -
|
| -bool PhoneField::ClassifyField(FieldTypeMap* map) const {
|
| - bool ok = true;
|
| -
|
| - 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) {
|
| - ok = ok && AddClassification(parsed_phone_fields_[FIELD_COUNTRY_CODE],
|
| - PHONE_HOME_COUNTRY_CODE,
|
| - map);
|
| - }
|
| -
|
| - AutofillFieldType field_number_type = PHONE_HOME_NUMBER;
|
| - if (parsed_phone_fields_[FIELD_AREA_CODE] != NULL) {
|
| - ok = ok && AddClassification(parsed_phone_fields_[FIELD_AREA_CODE],
|
| - PHONE_HOME_CITY_CODE,
|
| - map);
|
| - } else if (parsed_phone_fields_[FIELD_COUNTRY_CODE] != NULL) {
|
| - // 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;
|
| - }
|
| - // We tag the prefix as PHONE_HOME_NUMBER, then when filling the form
|
| - // we fill only the prefix depending on the size of the input field.
|
| - ok = ok && AddClassification(parsed_phone_fields_[FIELD_PHONE],
|
| - field_number_type,
|
| - 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) {
|
| - ok = ok && AddClassification(parsed_phone_fields_[FIELD_SUFFIX],
|
| - PHONE_HOME_NUMBER,
|
| - map);
|
| - }
|
| - } else {
|
| - ok = AddClassification(parsed_phone_fields_[FIELD_PHONE],
|
| - PHONE_HOME_WHOLE_NUMBER,
|
| - map);
|
| - }
|
| -
|
| - return ok;
|
| -}
|
| -
|
| -PhoneField::PhoneField() {
|
| - memset(parsed_phone_fields_, 0, sizeof(parsed_phone_fields_));
|
| -}
|
| -
|
| -// static
|
| -base::string16 PhoneField::GetRegExp(RegexType regex_id) {
|
| - switch (regex_id) {
|
| - case REGEX_COUNTRY:
|
| - return UTF8ToUTF16(autofill::kCountryCodeRe);
|
| - case REGEX_AREA:
|
| - return GetAreaRegex();
|
| - case REGEX_AREA_NOTEXT:
|
| - return UTF8ToUTF16(autofill::kAreaCodeNotextRe);
|
| - case REGEX_PHONE:
|
| - return UTF8ToUTF16(autofill::kPhoneRe);
|
| - case REGEX_PREFIX_SEPARATOR:
|
| - return UTF8ToUTF16(autofill::kPhonePrefixSeparatorRe);
|
| - case REGEX_PREFIX:
|
| - return UTF8ToUTF16(autofill::kPhonePrefixRe);
|
| - case REGEX_SUFFIX_SEPARATOR:
|
| - return UTF8ToUTF16(autofill::kPhoneSuffixSeparatorRe);
|
| - case REGEX_SUFFIX:
|
| - return UTF8ToUTF16(autofill::kPhoneSuffixRe);
|
| - case REGEX_EXTENSION:
|
| - return UTF8ToUTF16(autofill::kPhoneExtensionRe);
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - return base::string16();
|
| -}
|
| -
|
| -} // namespace autofill
|
|
|