Chromium Code Reviews| 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..6d6034f4872d80769bad977ac25d507c0417489c 100644 |
| --- a/chrome/browser/autofill/address_field.cc |
| +++ b/chrome/browser/autofill/address_field.cc |
| @@ -11,57 +11,13 @@ |
| #include "base/string16.h" |
| #include "base/string_util.h" |
| #include "base/utf_string_conversions.h" |
| +#include "chrome/browser/autofill/autofill_ecml.h" |
| #include "chrome/browser/autofill/autofill_field.h" |
| #include "chrome/browser/autofill/autofill_scanner.h" |
| #include "grit/autofill_resources.h" |
| #include "ui/base/l10n/l10n_util.h" |
| -bool AddressField::GetFieldInfo(FieldTypeMap* field_type_map) const { |
| - AutofillFieldType address_company; |
| - AutofillFieldType address_line1; |
| - AutofillFieldType address_line2; |
| - AutofillFieldType address_city; |
| - AutofillFieldType address_state; |
| - AutofillFieldType address_zip; |
| - AutofillFieldType address_country; |
| - |
| - switch (type_) { |
| - case kShippingAddress: |
| - // Fall through. Autofill does not support shipping addresses. |
| - case kGenericAddress: |
| - address_company = COMPANY_NAME; |
| - address_line1 = ADDRESS_HOME_LINE1; |
| - address_line2 = ADDRESS_HOME_LINE2; |
| - address_city = ADDRESS_HOME_CITY; |
| - address_state = ADDRESS_HOME_STATE; |
| - address_zip = ADDRESS_HOME_ZIP; |
| - address_country = ADDRESS_HOME_COUNTRY; |
| - break; |
| - |
| - case kBillingAddress: |
| - address_company = COMPANY_NAME; |
| - address_line1 = ADDRESS_BILLING_LINE1; |
| - address_line2 = ADDRESS_BILLING_LINE2; |
| - address_city = ADDRESS_BILLING_CITY; |
| - address_state = ADDRESS_BILLING_STATE; |
| - address_zip = ADDRESS_BILLING_ZIP; |
| - address_country = ADDRESS_BILLING_COUNTRY; |
| - break; |
| - |
| - default: |
| - NOTREACHED(); |
| - return false; |
| - } |
| - |
| - bool ok = Add(field_type_map, company_, address_company); |
| - ok = ok && Add(field_type_map, address1_, address_line1); |
| - ok = ok && Add(field_type_map, address2_, address_line2); |
| - ok = ok && Add(field_type_map, city_, address_city); |
| - ok = ok && Add(field_type_map, state_, address_state); |
| - ok = ok && Add(field_type_map, zip_, address_zip); |
| - ok = ok && Add(field_type_map, country_, address_country); |
| - return ok; |
| -} |
| +using autofill::GetEcmlPattern; |
| AddressField* AddressField::Parse(AutofillScanner* scanner, bool is_ecml) { |
| if (scanner->IsEnd()) |
| @@ -85,13 +41,14 @@ 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 (ParseField(scanner, attention_ignored, NULL) || |
| + ParseField(scanner, region_ignored, NULL)) { |
| // We ignore the following: |
| // * Attention. |
| // * Province/Region/Other. |
| continue; |
| - } else if (scanner->Cursor() != initial_field && ParseEmpty(scanner)) { |
| + } else if (scanner->Cursor() != initial_field && |
| + ParseEmptyLabel(scanner, NULL)) { |
| // Ignore non-labeled fields within an address; the page |
| // MapQuest Driving Directions North America.html contains such a field. |
| // We only ignore such fields after we've parsed at least one other field; |
| @@ -151,6 +108,53 @@ AddressField::AddressField() |
| type_(kGenericAddress) { |
| } |
| +bool AddressField::ClassifyField(FieldTypeMap* map) const { |
| + AutofillFieldType address_company; |
| + AutofillFieldType address_line1; |
| + AutofillFieldType address_line2; |
| + AutofillFieldType address_city; |
| + AutofillFieldType address_state; |
| + AutofillFieldType address_zip; |
| + AutofillFieldType address_country; |
| + |
| + switch (type_) { |
| + case kShippingAddress: |
| + // Fall through. Autofill does not support shipping addresses. |
| + case kGenericAddress: |
| + address_company = COMPANY_NAME; |
| + address_line1 = ADDRESS_HOME_LINE1; |
| + address_line2 = ADDRESS_HOME_LINE2; |
| + address_city = ADDRESS_HOME_CITY; |
| + address_state = ADDRESS_HOME_STATE; |
| + address_zip = ADDRESS_HOME_ZIP; |
| + address_country = ADDRESS_HOME_COUNTRY; |
| + break; |
| + |
| + case kBillingAddress: |
| + address_company = COMPANY_NAME; |
| + address_line1 = ADDRESS_BILLING_LINE1; |
| + address_line2 = ADDRESS_BILLING_LINE2; |
| + address_city = ADDRESS_BILLING_CITY; |
| + address_state = ADDRESS_BILLING_STATE; |
| + address_zip = ADDRESS_BILLING_ZIP; |
| + address_country = ADDRESS_BILLING_COUNTRY; |
| + break; |
| + |
| + default: |
| + NOTREACHED(); |
| + return false; |
| + } |
| + |
| + bool ok = AddClassification(company_, address_company, map); |
| + ok = ok && AddClassification(address1_, address_line1, map); |
| + ok = ok && AddClassification(address2_, address_line2, map); |
| + ok = ok && AddClassification(city_, address_city, map); |
| + ok = ok && AddClassification(state_, address_state, map); |
| + ok = ok && AddClassification(zip_, address_zip, map); |
| + ok = ok && AddClassification(country_, address_country, map); |
| + return ok; |
| +} |
| + |
| // static |
| bool AddressField::ParseCompany(AutofillScanner* scanner, |
| bool is_ecml, |
| @@ -166,7 +170,7 @@ bool AddressField::ParseCompany(AutofillScanner* scanner, |
| pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_COMPANY_RE); |
| } |
| - return ParseText(scanner, pattern, &address_field->company_); |
| + return ParseField(scanner, pattern, &address_field->company_); |
| } |
| // static |
| @@ -187,16 +191,18 @@ bool AddressField::ParseAddressLines(AutofillScanner* scanner, |
| string16 pattern; |
| if (is_ecml) { |
| pattern = GetEcmlPattern(kEcmlShipToAddress1, kEcmlBillToAddress1, '|'); |
| - if (!ParseText(scanner, pattern, &address_field->address1_)) |
| + if (!ParseField(scanner, pattern, &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 (!ParseField(scanner, pattern, &address_field->address1_) && |
| + !ParseFieldSpecifics(scanner, label_pattern, MATCH_LABEL, |
| + &address_field->address1_)) { |
| return false; |
| + } |
| } |
| // Optionally parse more address lines, which may have empty labels. |
| @@ -204,26 +210,28 @@ bool AddressField::ParseAddressLines(AutofillScanner* scanner, |
| // Some pages even have 4 address lines (e.g. uk/ShoesDirect2.html)! |
| if (is_ecml) { |
| pattern = GetEcmlPattern(kEcmlShipToAddress2, kEcmlBillToAddress2, '|'); |
| - if (!ParseEmptyText(scanner, &address_field->address2_)) |
| - ParseText(scanner, pattern, &address_field->address2_); |
| + if (!ParseEmptyLabel(scanner, &address_field->address2_)) |
| + ParseField(scanner, pattern, &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_); |
| + if (!ParseEmptyLabel(scanner, &address_field->address2_) && |
| + !ParseField(scanner, pattern, &address_field->address2_)) { |
| + ParseFieldSpecifics(scanner, label_pattern, MATCH_LABEL, |
| + &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); |
| + ParseField(scanner, pattern, NULL); |
| } else { |
| pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_ADDRESS_LINE_3_RE); |
| - if (!ParseEmptyText(scanner, NULL)) |
| - ParseText(scanner, pattern, NULL); |
| + if (!ParseEmptyLabel(scanner, NULL)) |
| + ParseField(scanner, pattern, NULL); |
| } |
| } |
| @@ -246,7 +254,7 @@ bool AddressField::ParseCountry(AutofillScanner* scanner, |
| else |
| pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_COUNTRY_RE); |
| - return ParseText(scanner, pattern, &address_field->country_); |
| + return ParseField(scanner, pattern, &address_field->country_); |
| } |
| // static |
| @@ -273,9 +281,8 @@ bool AddressField::ParseZipCode(AutofillScanner* scanner, |
| AddressType tempType; |
| string16 name = scanner->Cursor()->name; |
| - // Note: comparisons using the ecml compliant name as a prefix must be used in |
| - // order to accommodate Google Checkout. See FormFieldSet::GetEcmlPattern for |
| - // more detail. |
| + // Note: comparisons using the ECML compliant name as a prefix must be used in |
| + // order to accommodate Google Checkout. See |GetEcmlPattern| for more detail. |
| string16 bill_to_postal_code_field(ASCIIToUTF16(kEcmlBillToPostalCode)); |
| if (StartsWith(name, bill_to_postal_code_field, false)) { |
| tempType = kBillingAddress; |
| @@ -285,14 +292,14 @@ bool AddressField::ParseZipCode(AutofillScanner* scanner, |
| tempType = kGenericAddress; |
| } |
| - if (!ParseText(scanner, pattern, &address_field->zip_)) |
| + if (!ParseField(scanner, pattern, &address_field->zip_)) |
| return false; |
| address_field->type_ = tempType; |
| if (!is_ecml) { |
| // Look for a zip+4, whose field name will also often contain |
| // the substring "zip". |
| - ParseText(scanner, |
| + ParseField(scanner, |
| l10n_util::GetStringUTF16(IDS_AUTOFILL_ZIP_4_RE), |
| &address_field->zip4_); |
|
Ilya Sherman
2011/05/19 05:44:16
nit: indentation (probably other places with Parse
dhollowa
2011/05/19 17:53:08
Done.
|
| } |
| @@ -315,7 +322,7 @@ bool AddressField::ParseCity(AutofillScanner* scanner, |
| else |
| pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_CITY_RE); |
| - return ParseText(scanner, pattern, &address_field->city_); |
| + return ParseField(scanner, pattern, &address_field->city_); |
| } |
| // static |
| @@ -331,7 +338,7 @@ bool AddressField::ParseState(AutofillScanner* scanner, |
| else |
| pattern = l10n_util::GetStringUTF16(IDS_AUTOFILL_STATE_RE); |
| - return ParseText(scanner, pattern, &address_field->state_); |
| + return ParseField(scanner, pattern, &address_field->state_); |
| } |
| AddressType AddressField::AddressTypeFromText(const string16 &text) { |