| Index: chrome/browser/autofill/address_field.cc
|
| diff --git a/chrome/browser/autofill/address_field.cc b/chrome/browser/autofill/address_field.cc
|
| index 4624fa515ce2e8279e9cb88e09c9506e71942716..2b64ddcdffa5578e0defe20b95ca40f2463c697b 100644
|
| --- a/chrome/browser/autofill/address_field.cc
|
| +++ b/chrome/browser/autofill/address_field.cc
|
| @@ -13,6 +13,8 @@
|
| #include "base/utf_string_conversions.h"
|
| #include "chrome/browser/autofill/autofill_field.h"
|
| #include "chrome/browser/autofill/autofill_scanner.h"
|
| +#include "chrome/browser/autofill/email_field.h"
|
| +#include "chrome/browser/autofill/phone_field.h"
|
| #include "grit/autofill_resources.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
|
|
| @@ -78,6 +80,22 @@ AddressField* AddressField::Parse(AutofillScanner* scanner, bool is_ecml) {
|
|
|
| // Allow address fields to appear in any order.
|
| while (!scanner->IsEnd()) {
|
| + // Every loop, we have to parse email and phone, and if we find it, we
|
| + // break the loop even while continuing address. Because we want to give
|
| + // email and phone more priority than address. We have to rewind |scanner|
|
| + // position after the email and phone parsing.
|
| + size_t cursor_position = scanner->SaveCursor();
|
| + bool is_email = EmailField::Parse(scanner, is_ecml);
|
| + scanner->RewindTo(cursor_position);
|
| + if (is_email)
|
| + break;
|
| +
|
| + cursor_position = scanner->SaveCursor();
|
| + bool is_phone = PhoneField::Parse(scanner, is_ecml);
|
| + scanner->RewindTo(cursor_position);
|
| + if (is_phone)
|
| + break;
|
| +
|
| if (ParseCompany(scanner, is_ecml, address_field.get()) ||
|
| ParseAddressLines(scanner, is_ecml, address_field.get()) ||
|
| ParseCity(scanner, is_ecml, address_field.get()) ||
|
| @@ -85,8 +103,10 @@ AddressField* AddressField::Parse(AutofillScanner* scanner, bool is_ecml) {
|
| ParseZipCode(scanner, is_ecml, address_field.get()) ||
|
| ParseCountry(scanner, is_ecml, address_field.get())) {
|
| continue;
|
| - } else if (ParseText(scanner, attention_ignored) ||
|
| - ParseText(scanner, region_ignored)) {
|
| + } else if (ParseText(scanner, attention_ignored,
|
| + MATCH_NAME | MATCH_LABEL | MATCH_TEXT) ||
|
| + ParseText(scanner, region_ignored,
|
| + MATCH_NAME | MATCH_LABEL | MATCH_TEXT)) {
|
| // We ignore the following:
|
| // * Attention.
|
| // * Province/Region/Other.
|
| @@ -166,7 +186,8 @@ bool AddressField::ParseCompany(AutofillScanner* scanner,
|
| pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_COMPANY_RE);
|
| }
|
|
|
| - return ParseText(scanner, pattern, &address_field->company_);
|
| + return ParseText(scanner, pattern, MATCH_NAME | MATCH_LABEL | MATCH_TEXT,
|
| + &address_field->company_);
|
| }
|
|
|
| // static
|
| @@ -187,15 +208,18 @@ bool AddressField::ParseAddressLines(AutofillScanner* scanner,
|
| string16 pattern;
|
| if (is_ecml) {
|
| pattern = GetEcmlPattern(kEcmlShipToAddress1, kEcmlBillToAddress1, '|');
|
| - if (!ParseText(scanner, pattern, &address_field->address1_))
|
| + if (!ParseText(scanner, pattern, MATCH_NAME | MATCH_LABEL | MATCH_TEXT,
|
| + &address_field->address1_))
|
| return false;
|
| } else {
|
| pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_ADDRESS_LINE_1_RE);
|
| string16 label_pattern =
|
| l10n_util::GetStringUTF16(IDS_AUTOFILL_ADDRESS_LINE_1_LABEL_RE);
|
|
|
| - if (!ParseText(scanner, pattern, &address_field->address1_) &&
|
| - !ParseLabelText(scanner, label_pattern, &address_field->address1_))
|
| + if (!ParseText(scanner, pattern, MATCH_NAME | MATCH_LABEL | MATCH_TEXT,
|
| + &address_field->address1_) &&
|
| + !ParseText(scanner, label_pattern, MATCH_LABEL | MATCH_TEXT,
|
| + &address_field->address1_))
|
| return false;
|
| }
|
|
|
| @@ -205,25 +229,29 @@ bool AddressField::ParseAddressLines(AutofillScanner* scanner,
|
| if (is_ecml) {
|
| pattern = GetEcmlPattern(kEcmlShipToAddress2, kEcmlBillToAddress2, '|');
|
| if (!ParseEmptyText(scanner, &address_field->address2_))
|
| - ParseText(scanner, pattern, &address_field->address2_);
|
| + ParseText(scanner, pattern, MATCH_NAME | MATCH_LABEL | MATCH_TEXT,
|
| + &address_field->address2_);
|
| } else {
|
| pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_ADDRESS_LINE_2_RE);
|
| string16 label_pattern =
|
| l10n_util::GetStringUTF16(IDS_AUTOFILL_ADDRESS_LINE_1_LABEL_RE);
|
| if (!ParseEmptyText(scanner, &address_field->address2_) &&
|
| - !ParseText(scanner, pattern, &address_field->address2_))
|
| - ParseLabelText(scanner, label_pattern, &address_field->address2_);
|
| + !ParseText(scanner, pattern, MATCH_NAME | MATCH_LABEL | MATCH_TEXT,
|
| + &address_field->address2_))
|
| + ParseText(scanner, label_pattern, MATCH_LABEL | MATCH_TEXT,
|
| + &address_field->address2_);
|
| }
|
|
|
| // Try for a third line, which we will promptly discard.
|
| if (address_field->address2_ != NULL) {
|
| if (is_ecml) {
|
| pattern = GetEcmlPattern(kEcmlShipToAddress3, kEcmlBillToAddress3, '|');
|
| - ParseText(scanner, pattern);
|
| + ParseText(scanner, pattern, MATCH_NAME | MATCH_LABEL | MATCH_TEXT);
|
| } else {
|
| pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_ADDRESS_LINE_3_RE);
|
| if (!ParseEmptyText(scanner, NULL))
|
| - ParseText(scanner, pattern, NULL);
|
| + ParseText(scanner, pattern,
|
| + MATCH_NAME | MATCH_LABEL | MATCH_TEXT, NULL);
|
| }
|
| }
|
|
|
| @@ -246,7 +274,9 @@ bool AddressField::ParseCountry(AutofillScanner* scanner,
|
| else
|
| pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_COUNTRY_RE);
|
|
|
| - return ParseText(scanner, pattern, &address_field->country_);
|
| + return ParseText(scanner, pattern,
|
| + MATCH_NAME | MATCH_LABEL | MATCH_TEXT | MATCH_SELECT,
|
| + &address_field->country_);
|
| }
|
|
|
| // static
|
| @@ -285,7 +315,8 @@ bool AddressField::ParseZipCode(AutofillScanner* scanner,
|
| tempType = kGenericAddress;
|
| }
|
|
|
| - if (!ParseText(scanner, pattern, &address_field->zip_))
|
| + if (!ParseText(scanner, pattern, MATCH_NAME | MATCH_LABEL | MATCH_TEXT,
|
| + &address_field->zip_))
|
| return false;
|
|
|
| address_field->type_ = tempType;
|
| @@ -294,6 +325,7 @@ bool AddressField::ParseZipCode(AutofillScanner* scanner,
|
| // the substring "zip".
|
| ParseText(scanner,
|
| l10n_util::GetStringUTF16(IDS_AUTOFILL_ZIP_4_RE),
|
| + MATCH_NAME | MATCH_LABEL | MATCH_TEXT,
|
| &address_field->zip4_);
|
| }
|
|
|
| @@ -315,7 +347,9 @@ bool AddressField::ParseCity(AutofillScanner* scanner,
|
| else
|
| pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_CITY_RE);
|
|
|
| - return ParseText(scanner, pattern, &address_field->city_);
|
| + return ParseText(scanner, pattern,
|
| + MATCH_NAME | MATCH_LABEL | MATCH_TEXT | MATCH_SELECT,
|
| + &address_field->city_);
|
| }
|
|
|
| // static
|
| @@ -331,7 +365,9 @@ bool AddressField::ParseState(AutofillScanner* scanner,
|
| else
|
| pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_STATE_RE);
|
|
|
| - return ParseText(scanner, pattern, &address_field->state_);
|
| + return ParseText(scanner, pattern,
|
| + MATCH_NAME | MATCH_LABEL | MATCH_TEXT | MATCH_SELECT,
|
| + &address_field->state_);
|
| }
|
|
|
| AddressType AddressField::AddressTypeFromText(const string16 &text) {
|
|
|