This source file includes following definitions.
- Parse
- country_
- ClassifyField
- ParseCompany
- ParseAddressLines
- ParseCountry
- ParseZipCode
- ParseCity
- ParseState
#include "components/autofill/core/browser/address_field.h"
#include <stddef.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/core/browser/autofill_field.h"
#include "components/autofill/core/browser/autofill_regex_constants.h"
#include "components/autofill/core/browser/autofill_scanner.h"
#include "components/autofill/core/browser/field_types.h"
#include "ui/base/l10n/l10n_util.h"
using base::UTF8ToUTF16;
namespace autofill {
FormField* AddressField::Parse(AutofillScanner* scanner) {
if (scanner->IsEnd())
return NULL;
scoped_ptr<AddressField> address_field(new AddressField);
const AutofillField* const initial_field = scanner->Cursor();
size_t saved_cursor = scanner->SaveCursor();
base::string16 attention_ignored = UTF8ToUTF16(autofill::kAttentionIgnoredRe);
base::string16 region_ignored = UTF8ToUTF16(autofill::kRegionIgnoredRe);
size_t begin_trailing_non_labeled_fields = 0;
bool has_trailing_non_labeled_fields = false;
while (!scanner->IsEnd()) {
const size_t cursor = scanner->SaveCursor();
if (address_field->ParseAddressLines(scanner) ||
address_field->ParseCity(scanner) ||
address_field->ParseState(scanner) ||
address_field->ParseZipCode(scanner) ||
address_field->ParseCountry(scanner) ||
address_field->ParseCompany(scanner)) {
has_trailing_non_labeled_fields = false;
continue;
} else if (ParseField(scanner, attention_ignored, NULL) ||
ParseField(scanner, region_ignored, NULL)) {
continue;
} else if (scanner->Cursor() != initial_field &&
ParseEmptyLabel(scanner, NULL)) {
if (!has_trailing_non_labeled_fields) {
has_trailing_non_labeled_fields = true;
begin_trailing_non_labeled_fields = cursor;
}
continue;
} else {
break;
}
}
if (address_field->company_ ||
address_field->address1_ ||
address_field->address2_ ||
address_field->street_address_ ||
address_field->city_ ||
address_field->state_ ||
address_field->zip_ ||
address_field->zip4_ ||
address_field->country_) {
if (has_trailing_non_labeled_fields)
scanner->RewindTo(begin_trailing_non_labeled_fields);
return address_field.release();
}
scanner->RewindTo(saved_cursor);
return NULL;
}
AddressField::AddressField()
: company_(NULL),
address1_(NULL),
address2_(NULL),
street_address_(NULL),
city_(NULL),
state_(NULL),
zip_(NULL),
zip4_(NULL),
country_(NULL) {
}
bool AddressField::ClassifyField(ServerFieldTypeMap* map) const {
DCHECK(!(address1_ && street_address_));
DCHECK(!(address2_ && street_address_));
return AddClassification(company_, COMPANY_NAME, map) &&
AddClassification(address1_, ADDRESS_HOME_LINE1, map) &&
AddClassification(address2_, ADDRESS_HOME_LINE2, map) &&
AddClassification(street_address_, ADDRESS_HOME_STREET_ADDRESS, map) &&
AddClassification(city_, ADDRESS_HOME_CITY, map) &&
AddClassification(state_, ADDRESS_HOME_STATE, map) &&
AddClassification(zip_, ADDRESS_HOME_ZIP, map) &&
AddClassification(country_, ADDRESS_HOME_COUNTRY, map);
}
bool AddressField::ParseCompany(AutofillScanner* scanner) {
if (company_ && !company_->IsEmpty())
return false;
return ParseField(scanner, UTF8ToUTF16(autofill::kCompanyRe), &company_);
}
bool AddressField::ParseAddressLines(AutofillScanner* scanner) {
if (address1_ || street_address_)
return false;
base::string16 pattern = UTF8ToUTF16(autofill::kAddressLine1Re);
base::string16 label_pattern = UTF8ToUTF16(autofill::kAddressLine1LabelRe);
if (!ParseFieldSpecifics(scanner, pattern, MATCH_DEFAULT, &address1_) &&
!ParseFieldSpecifics(scanner, label_pattern, MATCH_LABEL | MATCH_TEXT,
&address1_) &&
!ParseFieldSpecifics(scanner, pattern, MATCH_DEFAULT | MATCH_TEXT_AREA,
&street_address_) &&
!ParseFieldSpecifics(scanner, label_pattern,
MATCH_LABEL | MATCH_TEXT_AREA,
&street_address_)) {
return false;
}
pattern = UTF8ToUTF16(autofill::kAddressLine2Re);
label_pattern = UTF8ToUTF16(autofill::kAddressLine2LabelRe);
if (!street_address_ &&
!ParseEmptyLabel(scanner, &address2_) &&
!ParseField(scanner, pattern, &address2_)) {
ParseFieldSpecifics(scanner, label_pattern, MATCH_LABEL | MATCH_TEXT,
&address2_);
}
if (address2_) {
pattern = UTF8ToUTF16(autofill::kAddressLinesExtraRe);
while (ParseField(scanner, pattern, NULL)) {
}
}
return true;
}
bool AddressField::ParseCountry(AutofillScanner* scanner) {
if (country_ && !country_->IsEmpty())
return false;
return ParseFieldSpecifics(scanner,
UTF8ToUTF16(autofill::kCountryRe),
MATCH_DEFAULT | MATCH_SELECT,
&country_);
}
bool AddressField::ParseZipCode(AutofillScanner* scanner) {
if (zip_)
return false;
base::string16 pattern = UTF8ToUTF16(autofill::kZipCodeRe);
if (!ParseField(scanner, pattern, &zip_))
return false;
ParseField(scanner, UTF8ToUTF16(autofill::kZip4Re), &zip4_);
return true;
}
bool AddressField::ParseCity(AutofillScanner* scanner) {
if (city_)
return false;
return ParseFieldSpecifics(scanner,
UTF8ToUTF16(autofill::kCityRe),
MATCH_DEFAULT | MATCH_SELECT,
&city_);
}
bool AddressField::ParseState(AutofillScanner* scanner) {
if (state_)
return false;
return ParseFieldSpecifics(scanner,
UTF8ToUTF16(autofill::kStateRe),
MATCH_DEFAULT | MATCH_SELECT,
&state_);
}
}