| Index: components/autofill/core/browser/form_structure.cc
|
| diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
|
| index d502a0dee7660ec040f354d163048e01cdc0bb9c..fd907dc00922f3a7a82e5eee8ebe0a8b6be0d65e 100644
|
| --- a/components/autofill/core/browser/form_structure.cc
|
| +++ b/components/autofill/core/browser/form_structure.cc
|
| @@ -57,8 +57,8 @@ const char kXMLElementFieldAssignments[] = "fieldassignments";
|
| const char kXMLElementField[] = "field";
|
| const char kXMLElementFields[] = "fields";
|
| const char kXMLElementForm[] = "form";
|
| -const char kBillingSection[] = "billing";
|
| -const char kShippingSection[] = "shipping";
|
| +const char kBillingMode[] = "billing";
|
| +const char kShippingMode[] = "shipping";
|
|
|
| // Stip away >= 5 consecutive digits.
|
| const char kIgnorePatternInFieldName[] = "\\d{5,}+";
|
| @@ -165,130 +165,132 @@ bool IsContactTypeHint(const std::string& token) {
|
| // Returns |true| iff the |token| is a type hint appropriate for a field of the
|
| // given |field_type|, as specified in the implementation section of
|
| // http://is.gd/whatwg_autocomplete
|
| -// TODO(isherman): This should use HTML field types, not native ones.
|
| bool ContactTypeHintMatchesFieldType(const std::string& token,
|
| - ServerFieldType field_type) {
|
| + HtmlFieldType field_type) {
|
| // The "home" and "work" type hints are only appropriate for email and phone
|
| // number field types.
|
| if (token == "home" || token == "work") {
|
| - return field_type == EMAIL_ADDRESS ||
|
| - (field_type >= PHONE_HOME_NUMBER &&
|
| - field_type <= PHONE_HOME_WHOLE_NUMBER);
|
| + return field_type == HTML_TYPE_EMAIL ||
|
| + (field_type >= HTML_TYPE_TEL &&
|
| + field_type <= HTML_TYPE_TEL_LOCAL_SUFFIX);
|
| }
|
|
|
| // The "mobile" type hint is only appropriate for phone number field types.
|
| // Note that "fax" and "pager" are intentionally ignored, as Chrome does not
|
| // support filling either type of information.
|
| if (token == "mobile") {
|
| - return field_type >= PHONE_HOME_NUMBER &&
|
| - field_type <= PHONE_HOME_WHOLE_NUMBER;
|
| + return field_type >= HTML_TYPE_TEL &&
|
| + field_type <= HTML_TYPE_TEL_LOCAL_SUFFIX;
|
| }
|
|
|
| return false;
|
| }
|
|
|
| // Returns the Chrome Autofill-supported field type corresponding to the given
|
| -// |autocomplete_type|, if there is one, in the context of the given |field|.
|
| -// Chrome Autofill supports a subset of the field types listed at
|
| +// |autocomplete_attribute_value|, if there is one, in the context of the given
|
| +// |field|. Chrome Autofill supports a subset of the field types listed at
|
| // http://is.gd/whatwg_autocomplete
|
| -// TODO(isherman): This should use HTML field types, not native ones.
|
| -ServerFieldType FieldTypeFromAutocompleteType(
|
| - const std::string& autocomplete_type,
|
| +HtmlFieldType FieldTypeFromAutocompleteAttributeValue(
|
| + const std::string& autocomplete_attribute_value,
|
| const AutofillField& field) {
|
| - if (autocomplete_type == "name")
|
| - return NAME_FULL;
|
| + if (autocomplete_attribute_value == "name")
|
| + return HTML_TYPE_NAME;
|
|
|
| - if (autocomplete_type == "given-name")
|
| - return NAME_FIRST;
|
| + if (autocomplete_attribute_value == "given-name")
|
| + return HTML_TYPE_GIVEN_NAME;
|
|
|
| - if (autocomplete_type == "additional-name") {
|
| + if (autocomplete_attribute_value == "additional-name") {
|
| if (field.max_length == 1)
|
| - return NAME_MIDDLE_INITIAL;
|
| + return HTML_TYPE_ADDITIONAL_NAME_INITIAL;
|
| else
|
| - return NAME_MIDDLE;
|
| + return HTML_TYPE_ADDITIONAL_NAME;
|
| }
|
|
|
| - if (autocomplete_type == "family-name")
|
| - return NAME_LAST;
|
| + if (autocomplete_attribute_value == "family-name")
|
| + return HTML_TYPE_FAMILY_NAME;
|
|
|
| - if (autocomplete_type == "honorific-suffix")
|
| - return NAME_SUFFIX;
|
| + if (autocomplete_attribute_value == "organization")
|
| + return HTML_TYPE_ORGANIZATION;
|
|
|
| - if (autocomplete_type == "organization")
|
| - return COMPANY_NAME;
|
| + if (autocomplete_attribute_value == "address-line1")
|
| + return HTML_TYPE_ADDRESS_LINE1;
|
|
|
| - if (autocomplete_type == "address-line1")
|
| - return ADDRESS_HOME_LINE1;
|
| + if (autocomplete_attribute_value == "address-line2")
|
| + return HTML_TYPE_ADDRESS_LINE2;
|
|
|
| - if (autocomplete_type == "address-line2")
|
| - return ADDRESS_HOME_LINE2;
|
| + if (autocomplete_attribute_value == "locality")
|
| + return HTML_TYPE_LOCALITY;
|
|
|
| - if (autocomplete_type == "locality")
|
| - return ADDRESS_HOME_CITY;
|
| + if (autocomplete_attribute_value == "region")
|
| + return HTML_TYPE_REGION;
|
|
|
| - if (autocomplete_type == "region")
|
| - return ADDRESS_HOME_STATE;
|
| + if (autocomplete_attribute_value == "country")
|
| + return HTML_TYPE_COUNTRY_CODE;
|
|
|
| - if (autocomplete_type == "country")
|
| - return ADDRESS_HOME_COUNTRY;
|
| + if (autocomplete_attribute_value == "country-name")
|
| + return HTML_TYPE_COUNTRY_NAME;
|
|
|
| - if (autocomplete_type == "postal-code")
|
| - return ADDRESS_HOME_ZIP;
|
| + if (autocomplete_attribute_value == "postal-code")
|
| + return HTML_TYPE_POSTAL_CODE;
|
|
|
| - if (autocomplete_type == "cc-name")
|
| - return CREDIT_CARD_NAME;
|
| + if (autocomplete_attribute_value == "cc-name")
|
| + return HTML_TYPE_CREDIT_CARD_NAME;
|
|
|
| - if (autocomplete_type == "cc-number")
|
| - return CREDIT_CARD_NUMBER;
|
| + if (autocomplete_attribute_value == "cc-number")
|
| + return HTML_TYPE_CREDIT_CARD_NUMBER;
|
|
|
| - if (autocomplete_type == "cc-exp") {
|
| + if (autocomplete_attribute_value == "cc-exp") {
|
| if (field.max_length == 5)
|
| - return CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR;
|
| + return HTML_TYPE_CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR;
|
| + else if (field.max_length == 7)
|
| + return HTML_TYPE_CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR;
|
| else
|
| - return CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR;
|
| + return HTML_TYPE_CREDIT_CARD_EXP;
|
| }
|
|
|
| - if (autocomplete_type == "cc-exp-month")
|
| - return CREDIT_CARD_EXP_MONTH;
|
| + if (autocomplete_attribute_value == "cc-exp-month")
|
| + return HTML_TYPE_CREDIT_CARD_EXP_MONTH;
|
|
|
| - if (autocomplete_type == "cc-exp-year") {
|
| + if (autocomplete_attribute_value == "cc-exp-year") {
|
| if (field.max_length == 2)
|
| - return CREDIT_CARD_EXP_2_DIGIT_YEAR;
|
| + return HTML_TYPE_CREDIT_CARD_EXP_2_DIGIT_YEAR;
|
| + else if (field.max_length == 4)
|
| + return HTML_TYPE_CREDIT_CARD_EXP_4_DIGIT_YEAR;
|
| else
|
| - return CREDIT_CARD_EXP_4_DIGIT_YEAR;
|
| + return HTML_TYPE_CREDIT_CARD_EXP_YEAR;
|
| }
|
|
|
| - if (autocomplete_type == "cc-csc")
|
| - return CREDIT_CARD_VERIFICATION_CODE;
|
| + if (autocomplete_attribute_value == "cc-csc")
|
| + return HTML_TYPE_CREDIT_CARD_VERIFICATION_CODE;
|
|
|
| - if (autocomplete_type == "cc-type")
|
| - return CREDIT_CARD_TYPE;
|
| + if (autocomplete_attribute_value == "cc-type")
|
| + return HTML_TYPE_CREDIT_CARD_TYPE;
|
|
|
| - if (autocomplete_type == "tel")
|
| - return PHONE_HOME_WHOLE_NUMBER;
|
| + if (autocomplete_attribute_value == "tel")
|
| + return HTML_TYPE_TEL;
|
|
|
| - if (autocomplete_type == "tel-country-code")
|
| - return PHONE_HOME_COUNTRY_CODE;
|
| + if (autocomplete_attribute_value == "tel-country-code")
|
| + return HTML_TYPE_TEL_COUNTRY_CODE;
|
|
|
| - if (autocomplete_type == "tel-national")
|
| - return PHONE_HOME_CITY_AND_NUMBER;
|
| + if (autocomplete_attribute_value == "tel-national")
|
| + return HTML_TYPE_TEL_NATIONAL;
|
|
|
| - if (autocomplete_type == "tel-area-code")
|
| - return PHONE_HOME_CITY_CODE;
|
| + if (autocomplete_attribute_value == "tel-area-code")
|
| + return HTML_TYPE_TEL_AREA_CODE;
|
|
|
| - if (autocomplete_type == "tel-local")
|
| - return PHONE_HOME_NUMBER;
|
| + if (autocomplete_attribute_value == "tel-local")
|
| + return HTML_TYPE_TEL_LOCAL;
|
|
|
| - if (autocomplete_type == "tel-local-prefix")
|
| - return PHONE_HOME_NUMBER;
|
| + if (autocomplete_attribute_value == "tel-local-prefix")
|
| + return HTML_TYPE_TEL_LOCAL_PREFIX;
|
|
|
| - if (autocomplete_type == "tel-local-suffix")
|
| - return PHONE_HOME_NUMBER;
|
| + if (autocomplete_attribute_value == "tel-local-suffix")
|
| + return HTML_TYPE_TEL_LOCAL_SUFFIX;
|
|
|
| - if (autocomplete_type == "email")
|
| - return EMAIL_ADDRESS;
|
| + if (autocomplete_attribute_value == "email")
|
| + return HTML_TYPE_EMAIL;
|
|
|
| - return UNKNOWN_TYPE;
|
| + return HTML_TYPE_UNKNOWN;
|
| }
|
|
|
| std::string StripDigitsIfRequired(const base::string16& input) {
|
| @@ -377,8 +379,7 @@ void FormStructure::DetermineHeuristicTypes(
|
| // autocomplete type hint, don't try to apply other heuristics to match fields
|
| // in this form.
|
| bool has_author_specified_sections;
|
| - ParseFieldTypesFromAutocompleteAttributes(PARSE_FOR_AUTOFILL,
|
| - &has_author_specified_types_,
|
| + ParseFieldTypesFromAutocompleteAttributes(&has_author_specified_types_,
|
| &has_author_specified_sections);
|
|
|
| if (!has_author_specified_types_) {
|
| @@ -607,7 +608,7 @@ void FormStructure::ParseQueryResponse(
|
| heuristics_detected_fillable_field = true;
|
|
|
| (*field)->set_server_type(current_info->field_type);
|
| - if (heuristic_type != (*field)->Type().server_type())
|
| + if (heuristic_type != (*field)->Type().GetStorableType())
|
| query_response_overrode_heuristics = true;
|
|
|
| // Copy default value into the field if available.
|
| @@ -659,11 +660,10 @@ void FormStructure::GetFieldTypePredictions(
|
| FormFieldDataPredictions annotated_field;
|
| annotated_field.signature = (*field)->FieldSignature();
|
| annotated_field.heuristic_type =
|
| - AutofillType::FieldTypeToString((*field)->heuristic_type());
|
| + AutofillType((*field)->heuristic_type()).ToString();
|
| annotated_field.server_type =
|
| - AutofillType::FieldTypeToString((*field)->server_type());
|
| - annotated_field.overall_type =
|
| - AutofillType::FieldTypeToString((*field)->Type().server_type());
|
| + AutofillType((*field)->server_type()).ToString();
|
| + annotated_field.overall_type = (*field)->Type().ToString();
|
| form.fields.push_back(annotated_field);
|
| }
|
|
|
| @@ -835,7 +835,7 @@ void FormStructure::LogQualityMetrics(
|
| if (*it == PHONE_HOME_CITY_AND_NUMBER)
|
| collapsed_field_types.insert(PHONE_HOME_WHOLE_NUMBER);
|
| else
|
| - collapsed_field_types.insert(AutofillType::GetEquivalentFieldType(*it));
|
| + collapsed_field_types.insert(AutofillType(*it).GetStorableType());
|
| }
|
|
|
| // Capture the field's type, if it is unambiguous.
|
| @@ -843,9 +843,11 @@ void FormStructure::LogQualityMetrics(
|
| if (collapsed_field_types.size() == 1)
|
| field_type = *collapsed_field_types.begin();
|
|
|
| - ServerFieldType heuristic_type = field->heuristic_type();
|
| - ServerFieldType server_type = field->server_type();
|
| - ServerFieldType predicted_type = field->Type().server_type();
|
| + ServerFieldType heuristic_type =
|
| + AutofillType(field->heuristic_type()).GetStorableType();
|
| + ServerFieldType server_type =
|
| + AutofillType(field->server_type()).GetStorableType();
|
| + ServerFieldType predicted_type = field->Type().GetStorableType();
|
|
|
| // Log heuristic, server, and overall type quality metrics, independently of
|
| // whether the field was autofilled.
|
| @@ -1080,7 +1082,6 @@ bool FormStructure::EncodeFormRequest(
|
| }
|
|
|
| void FormStructure::ParseFieldTypesFromAutocompleteAttributes(
|
| - ParseTarget parse_target,
|
| bool* found_types,
|
| bool* found_sections) {
|
| const std::string kDefaultSection = "-default";
|
| @@ -1132,9 +1133,9 @@ void FormStructure::ParseFieldTypesFromAutocompleteAttributes(
|
| DCHECK(!tokens.empty());
|
| std::string field_type_token = tokens.back();
|
| tokens.pop_back();
|
| - ServerFieldType field_type =
|
| - FieldTypeFromAutocompleteType(field_type_token, *field);
|
| - if (field_type == UNKNOWN_TYPE)
|
| + HtmlFieldType field_type =
|
| + FieldTypeFromAutocompleteAttributeValue(field_type_token, *field);
|
| + if (field_type == HTML_TYPE_UNKNOWN)
|
| continue;
|
|
|
| // The preceding token, if any, may be a type hint.
|
| @@ -1154,21 +1155,15 @@ void FormStructure::ParseFieldTypesFromAutocompleteAttributes(
|
| // section name suffixes.
|
| DCHECK_EQ(kDefaultSection, field->section());
|
| std::string section = field->section();
|
| - if (!tokens.empty() &&
|
| - (tokens.back() == kShippingSection ||
|
| - tokens.back() == kBillingSection)) {
|
| - // Set Autofill field type to billing if section is billing.
|
| - if (tokens.back() == kBillingSection) {
|
| - field_type = AutofillType::GetEquivalentBillingFieldType(field_type);
|
| -
|
| - // The Autofill dialog uses the type CREDIT_CARD_NAME to refer to both
|
| - // the credit card holder's name and the name on the billing address.
|
| - if (parse_target == PARSE_FOR_AUTOFILL_DIALOG &&
|
| - field_type == NAME_FULL) {
|
| - field_type = CREDIT_CARD_NAME;
|
| - }
|
| - }
|
| + HtmlFieldMode mode = HTML_MODE_NONE;
|
| + if (!tokens.empty()) {
|
| + if (tokens.back() == kShippingMode)
|
| + mode = HTML_MODE_SHIPPING;
|
| + else if (tokens.back() == kBillingMode)
|
| + mode = HTML_MODE_BILLING;
|
| + }
|
|
|
| + if (mode != HTML_MODE_NONE) {
|
| section = "-" + tokens.back();
|
| tokens.pop_back();
|
| }
|
| @@ -1193,11 +1188,7 @@ void FormStructure::ParseFieldTypesFromAutocompleteAttributes(
|
|
|
| // No errors encountered while parsing!
|
| // Update the |field|'s type based on what was parsed from the attribute.
|
| - field->set_heuristic_type(field_type);
|
| - if (field_type_token == "tel-local-prefix")
|
| - field->set_phone_part(AutofillField::PHONE_PREFIX);
|
| - else if (field_type_token == "tel-local-suffix")
|
| - field->set_phone_part(AutofillField::PHONE_SUFFIX);
|
| + field->SetHtmlType(field_type, mode);
|
| }
|
| }
|
|
|
| @@ -1215,8 +1206,7 @@ void FormStructure::IdentifySections(bool has_author_specified_sections) {
|
|
|
| for (std::vector<AutofillField*>::iterator field = fields_.begin();
|
| field != fields_.end(); ++field) {
|
| - const ServerFieldType current_type =
|
| - AutofillType::GetEquivalentFieldType((*field)->Type().server_type());
|
| + const ServerFieldType current_type = (*field)->Type().GetStorableType();
|
|
|
| bool already_saw_current_type = seen_types.count(current_type) > 0;
|
|
|
|
|