| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/autofill/core/browser/field_types.h" |
| |
| #include <string_view> |
| |
| #include "base/containers/fixed_flat_map.h" |
| #include "base/containers/to_vector.h" |
| #include "base/no_destructor.h" |
| #include "base/notreached.h" |
| #include "base/strings/string_util.h" |
| #include "build/build_config.h" |
| #include "components/autofill/core/common/autofill_features.h" |
| #include "components/autofill/core/common/autofill_payments_features.h" |
| #include "components/password_manager/core/browser/features/password_features.h" |
| |
| namespace autofill { |
| |
| std::ostream& operator<<(std::ostream& o, FieldTypeSet field_type_set) { |
| o << "["; |
| bool first = true; |
| for (const auto type : field_type_set) { |
| if (!first) { |
| o << ", "; |
| } else { |
| first = false; |
| } |
| o << FieldTypeToStringView(type); |
| } |
| o << "]"; |
| return o; |
| } |
| |
| // This map should be extended for every added FieldType. |
| // You are free to add or remove the String representation of FieldType, |
| // but don't change any existing values, Android WebView presents them to |
| // Autofill Service as part of APIs. |
| static constexpr auto kTypeNameToFieldType = |
| base::MakeFixedFlatMap<std::string_view, FieldType>( |
| {{"NO_SERVER_DATA", NO_SERVER_DATA}, |
| {"UNKNOWN_TYPE", UNKNOWN_TYPE}, |
| {"EMPTY_TYPE", EMPTY_TYPE}, |
| {"NAME_FIRST", NAME_FIRST}, |
| {"NAME_MIDDLE", NAME_MIDDLE}, |
| {"NAME_LAST", NAME_LAST}, |
| {"NAME_MIDDLE_INITIAL", NAME_MIDDLE_INITIAL}, |
| {"NAME_FULL", NAME_FULL}, |
| {"NAME_SUFFIX", NAME_SUFFIX}, |
| {"ALTERNATIVE_FULL_NAME", ALTERNATIVE_FULL_NAME}, |
| {"ALTERNATIVE_GIVEN_NAME", ALTERNATIVE_GIVEN_NAME}, |
| {"ALTERNATIVE_FAMILY_NAME", ALTERNATIVE_FAMILY_NAME}, |
| {"EMAIL_ADDRESS", EMAIL_ADDRESS}, |
| {"PHONE_HOME_NUMBER", PHONE_HOME_NUMBER}, |
| {"PHONE_HOME_CITY_CODE", PHONE_HOME_CITY_CODE}, |
| {"PHONE_HOME_COUNTRY_CODE", PHONE_HOME_COUNTRY_CODE}, |
| {"PHONE_HOME_CITY_AND_NUMBER", PHONE_HOME_CITY_AND_NUMBER}, |
| {"PHONE_HOME_WHOLE_NUMBER", PHONE_HOME_WHOLE_NUMBER}, |
| {"ADDRESS_HOME_LINE1", ADDRESS_HOME_LINE1}, |
| {"ADDRESS_HOME_LINE2", ADDRESS_HOME_LINE2}, |
| {"ADDRESS_HOME_APT", ADDRESS_HOME_APT}, |
| {"ADDRESS_HOME_APT_NUM", ADDRESS_HOME_APT_NUM}, |
| {"ADDRESS_HOME_APT_TYPE", ADDRESS_HOME_APT_TYPE}, |
| {"ADDRESS_HOME_HOUSE_NUMBER_AND_APT", |
| ADDRESS_HOME_HOUSE_NUMBER_AND_APT}, |
| {"ADDRESS_HOME_CITY", ADDRESS_HOME_CITY}, |
| {"ADDRESS_HOME_STATE", ADDRESS_HOME_STATE}, |
| {"ADDRESS_HOME_ZIP", ADDRESS_HOME_ZIP}, |
| {"ADDRESS_HOME_ZIP_PREFIX", ADDRESS_HOME_ZIP_PREFIX}, |
| {"ADDRESS_HOME_ZIP_SUFFIX", ADDRESS_HOME_ZIP_SUFFIX}, |
| {"ADDRESS_HOME_ZIP_AND_CITY", ADDRESS_HOME_ZIP_AND_CITY}, |
| {"ADDRESS_HOME_COUNTRY", ADDRESS_HOME_COUNTRY}, |
| {"CREDIT_CARD_NAME_FULL", CREDIT_CARD_NAME_FULL}, |
| {"CREDIT_CARD_NUMBER", CREDIT_CARD_NUMBER}, |
| {"CREDIT_CARD_EXP_MONTH", CREDIT_CARD_EXP_MONTH}, |
| {"CREDIT_CARD_EXP_2_DIGIT_YEAR", CREDIT_CARD_EXP_2_DIGIT_YEAR}, |
| {"CREDIT_CARD_EXP_4_DIGIT_YEAR", CREDIT_CARD_EXP_4_DIGIT_YEAR}, |
| {"CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR", |
| CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}, |
| {"CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR", |
| CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR}, |
| {"CREDIT_CARD_TYPE", CREDIT_CARD_TYPE}, |
| {"CREDIT_CARD_VERIFICATION_CODE", CREDIT_CARD_VERIFICATION_CODE}, |
| {"COMPANY_NAME", COMPANY_NAME}, |
| {"MERCHANT_EMAIL_SIGNUP", MERCHANT_EMAIL_SIGNUP}, |
| {"MERCHANT_PROMO_CODE", MERCHANT_PROMO_CODE}, |
| {"PASSWORD", PASSWORD}, |
| {"ACCOUNT_CREATION_PASSWORD", ACCOUNT_CREATION_PASSWORD}, |
| {"ADDRESS_HOME_STREET_ADDRESS", ADDRESS_HOME_STREET_ADDRESS}, |
| {"ADDRESS_HOME_SORTING_CODE", ADDRESS_HOME_SORTING_CODE}, |
| {"ADDRESS_HOME_DEPENDENT_LOCALITY", ADDRESS_HOME_DEPENDENT_LOCALITY}, |
| {"ADDRESS_HOME_LINE3", ADDRESS_HOME_LINE3}, |
| {"NOT_ACCOUNT_CREATION_PASSWORD", NOT_ACCOUNT_CREATION_PASSWORD}, |
| {"USERNAME", USERNAME}, |
| {"USERNAME_AND_EMAIL_ADDRESS", USERNAME_AND_EMAIL_ADDRESS}, |
| {"NEW_PASSWORD", NEW_PASSWORD}, |
| {"PROBABLY_NEW_PASSWORD", PROBABLY_NEW_PASSWORD}, |
| {"NOT_NEW_PASSWORD", NOT_NEW_PASSWORD}, |
| {"CREDIT_CARD_NAME_FIRST", CREDIT_CARD_NAME_FIRST}, |
| {"CREDIT_CARD_NAME_LAST", CREDIT_CARD_NAME_LAST}, |
| {"PHONE_HOME_EXTENSION", PHONE_HOME_EXTENSION}, |
| {"CONFIRMATION_PASSWORD", CONFIRMATION_PASSWORD}, |
| {"AMBIGUOUS_TYPE", AMBIGUOUS_TYPE}, |
| {"SEARCH_TERM", SEARCH_TERM}, |
| {"PRICE", PRICE}, |
| {"NOT_PASSWORD", NOT_PASSWORD}, |
| {"SINGLE_USERNAME", SINGLE_USERNAME}, |
| {"NOT_USERNAME", NOT_USERNAME}, |
| {"ADDRESS_HOME_STREET_NAME", ADDRESS_HOME_STREET_NAME}, |
| {"ADDRESS_HOME_HOUSE_NUMBER", ADDRESS_HOME_HOUSE_NUMBER}, |
| {"ADDRESS_HOME_SUBPREMISE", ADDRESS_HOME_SUBPREMISE}, |
| {"ADDRESS_HOME_OTHER_SUBUNIT", ADDRESS_HOME_OTHER_SUBUNIT}, |
| {"NAME_LAST_FIRST", NAME_LAST_FIRST}, |
| {"NAME_LAST_CONJUNCTION", NAME_LAST_CONJUNCTION}, |
| {"NAME_LAST_SECOND", NAME_LAST_SECOND}, |
| {"NAME_HONORIFIC_PREFIX", NAME_HONORIFIC_PREFIX}, |
| {"ADDRESS_HOME_ADDRESS", ADDRESS_HOME_ADDRESS}, |
| {"ADDRESS_HOME_ADDRESS_WITH_NAME", ADDRESS_HOME_ADDRESS_WITH_NAME}, |
| {"ADDRESS_HOME_FLOOR", ADDRESS_HOME_FLOOR}, |
| {"PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX", |
| PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX}, |
| {"PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX", |
| PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX}, |
| {"PHONE_HOME_NUMBER_PREFIX", PHONE_HOME_NUMBER_PREFIX}, |
| {"PHONE_HOME_NUMBER_SUFFIX", PHONE_HOME_NUMBER_SUFFIX}, |
| {"IBAN_VALUE", IBAN_VALUE}, |
| {"CREDIT_CARD_STANDALONE_VERIFICATION_CODE", |
| CREDIT_CARD_STANDALONE_VERIFICATION_CODE}, |
| {"NUMERIC_QUANTITY", NUMERIC_QUANTITY}, |
| {"ONE_TIME_CODE", ONE_TIME_CODE}, |
| {"ADDRESS_HOME_LANDMARK", ADDRESS_HOME_LANDMARK}, |
| {"ADDRESS_HOME_BETWEEN_STREETS", ADDRESS_HOME_BETWEEN_STREETS}, |
| {"ADDRESS_HOME_ADMIN_LEVEL2", ADDRESS_HOME_ADMIN_LEVEL2}, |
| {"DELIVERY_INSTRUCTIONS", DELIVERY_INSTRUCTIONS}, |
| {"ADDRESS_HOME_OVERFLOW", ADDRESS_HOME_OVERFLOW}, |
| {"ADDRESS_HOME_STREET_LOCATION", ADDRESS_HOME_STREET_LOCATION}, |
| {"ADDRESS_HOME_BETWEEN_STREETS_1", ADDRESS_HOME_BETWEEN_STREETS_1}, |
| {"ADDRESS_HOME_BETWEEN_STREETS_2", ADDRESS_HOME_BETWEEN_STREETS_2}, |
| {"ADDRESS_HOME_OVERFLOW_AND_LANDMARK", |
| ADDRESS_HOME_OVERFLOW_AND_LANDMARK}, |
| {"ADDRESS_HOME_BETWEEN_STREETS_OR_LANDMARK", |
| ADDRESS_HOME_BETWEEN_STREETS_OR_LANDMARK}, |
| {"SINGLE_USERNAME_FORGOT_PASSWORD", SINGLE_USERNAME_FORGOT_PASSWORD}, |
| {"SINGLE_USERNAME_WITH_INTERMEDIATE_VALUES", |
| SINGLE_USERNAME_WITH_INTERMEDIATE_VALUES}, |
| {"ADDRESS_HOME_STREET_LOCATION_AND_LOCALITY", |
| ADDRESS_HOME_STREET_LOCATION_AND_LOCALITY}, |
| {"ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK", |
| ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK}, |
| {"ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK", |
| ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK}, |
| {"PASSPORT_NUMBER", PASSPORT_NUMBER}, |
| {"PASSPORT_ISSUING_COUNTRY", PASSPORT_ISSUING_COUNTRY}, |
| {"PASSPORT_EXPIRATION_DATE", PASSPORT_EXPIRATION_DATE}, |
| {"PASSPORT_ISSUE_DATE", PASSPORT_ISSUE_DATE}, |
| {"ORDER_ID", ORDER_ID}, |
| {"ORDER_DATE", ORDER_DATE}, |
| {"ORDER_MERCHANT_NAME", ORDER_MERCHANT_NAME}, |
| {"SHIPMENT_TRACKING_NUMBER", SHIPMENT_TRACKING_NUMBER}, |
| {"LOYALTY_MEMBERSHIP_PROGRAM", LOYALTY_MEMBERSHIP_PROGRAM}, |
| {"LOYALTY_MEMBERSHIP_PROVIDER", LOYALTY_MEMBERSHIP_PROVIDER}, |
| {"LOYALTY_MEMBERSHIP_ID", LOYALTY_MEMBERSHIP_ID}, |
| {"VEHICLE_LICENSE_PLATE", VEHICLE_LICENSE_PLATE}, |
| {"VEHICLE_VIN", VEHICLE_VIN}, |
| {"VEHICLE_MAKE", VEHICLE_MAKE}, |
| {"VEHICLE_MODEL", VEHICLE_MODEL}, |
| {"VEHICLE_YEAR", VEHICLE_YEAR}, |
| {"VEHICLE_PLATE_STATE", VEHICLE_PLATE_STATE}, |
| {"DRIVERS_LICENSE_REGION", DRIVERS_LICENSE_REGION}, |
| {"DRIVERS_LICENSE_NUMBER", DRIVERS_LICENSE_NUMBER}, |
| {"DRIVERS_LICENSE_EXPIRATION_DATE", DRIVERS_LICENSE_EXPIRATION_DATE}, |
| {"DRIVERS_LICENSE_ISSUE_DATE", DRIVERS_LICENSE_ISSUE_DATE}, |
| {"NATIONAL_ID_CARD_NUMBER", NATIONAL_ID_CARD_NUMBER}, |
| {"NATIONAL_ID_CARD_EXPIRATION_DATE", NATIONAL_ID_CARD_EXPIRATION_DATE}, |
| {"NATIONAL_ID_CARD_ISSUE_DATE", NATIONAL_ID_CARD_ISSUE_DATE}, |
| {"NATIONAL_ID_CARD_ISSUING_COUNTRY", NATIONAL_ID_CARD_ISSUING_COUNTRY}, |
| {"KNOWN_TRAVELER_NUMBER", KNOWN_TRAVELER_NUMBER}, |
| {"KNOWN_TRAVELER_NUMBER_EXPIRATION_DATE", |
| KNOWN_TRAVELER_NUMBER_EXPIRATION_DATE}, |
| {"REDRESS_NUMBER", REDRESS_NUMBER}, |
| {"EMAIL_OR_LOYALTY_MEMBERSHIP_ID", EMAIL_OR_LOYALTY_MEMBERSHIP_ID}, |
| {"FLIGHT_RESERVATION_FLIGHT_NUMBER", FLIGHT_RESERVATION_FLIGHT_NUMBER}, |
| {"FLIGHT_RESERVATION_TICKET_NUMBER", FLIGHT_RESERVATION_TICKET_NUMBER}, |
| {"FLIGHT_RESERVATION_CONFIRMATION_CODE", |
| FLIGHT_RESERVATION_CONFIRMATION_CODE}, |
| {"FLIGHT_RESERVATION_DEPARTURE_DATE", |
| FLIGHT_RESERVATION_DEPARTURE_DATE}}); |
| |
| bool IsFillableFieldType(FieldType field_type) { |
| switch (field_type) { |
| case NAME_HONORIFIC_PREFIX: |
| case NAME_FIRST: |
| case NAME_MIDDLE: |
| case NAME_LAST: |
| case NAME_LAST_FIRST: |
| case NAME_LAST_CONJUNCTION: |
| case NAME_LAST_SECOND: |
| case NAME_MIDDLE_INITIAL: |
| case NAME_FULL: |
| case NAME_SUFFIX: |
| case ALTERNATIVE_FULL_NAME: |
| case ALTERNATIVE_FAMILY_NAME: |
| case ALTERNATIVE_GIVEN_NAME: |
| case EMAIL_ADDRESS: |
| case USERNAME_AND_EMAIL_ADDRESS: |
| case PHONE_HOME_NUMBER: |
| case PHONE_HOME_NUMBER_PREFIX: |
| case PHONE_HOME_NUMBER_SUFFIX: |
| case PHONE_HOME_CITY_CODE: |
| case PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX: |
| case PHONE_HOME_COUNTRY_CODE: |
| case PHONE_HOME_CITY_AND_NUMBER: |
| case PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX: |
| case PHONE_HOME_WHOLE_NUMBER: |
| case PHONE_HOME_EXTENSION: |
| case ADDRESS_HOME_LINE1: |
| case ADDRESS_HOME_LINE2: |
| case ADDRESS_HOME_LINE3: |
| case ADDRESS_HOME_APT: |
| case ADDRESS_HOME_APT_NUM: |
| case ADDRESS_HOME_APT_TYPE: |
| case ADDRESS_HOME_HOUSE_NUMBER_AND_APT: |
| case ADDRESS_HOME_CITY: |
| case ADDRESS_HOME_STATE: |
| case ADDRESS_HOME_ZIP: |
| case ADDRESS_HOME_ZIP_PREFIX: |
| case ADDRESS_HOME_ZIP_SUFFIX: |
| case ADDRESS_HOME_ZIP_AND_CITY: |
| case ADDRESS_HOME_COUNTRY: |
| case ADDRESS_HOME_STREET_ADDRESS: |
| case ADDRESS_HOME_SORTING_CODE: |
| case ADDRESS_HOME_DEPENDENT_LOCALITY: |
| case ADDRESS_HOME_STREET_NAME: |
| case ADDRESS_HOME_HOUSE_NUMBER: |
| case ADDRESS_HOME_STREET_LOCATION: |
| case ADDRESS_HOME_SUBPREMISE: |
| case ADDRESS_HOME_OTHER_SUBUNIT: |
| case ADDRESS_HOME_ADDRESS: |
| case ADDRESS_HOME_ADDRESS_WITH_NAME: |
| case ADDRESS_HOME_FLOOR: |
| case ADDRESS_HOME_LANDMARK: |
| case ADDRESS_HOME_BETWEEN_STREETS: |
| case ADDRESS_HOME_BETWEEN_STREETS_1: |
| case ADDRESS_HOME_BETWEEN_STREETS_2: |
| case ADDRESS_HOME_ADMIN_LEVEL2: |
| case ADDRESS_HOME_OVERFLOW: |
| case ADDRESS_HOME_BETWEEN_STREETS_OR_LANDMARK: |
| case ADDRESS_HOME_OVERFLOW_AND_LANDMARK: |
| case ADDRESS_HOME_STREET_LOCATION_AND_LOCALITY: |
| case ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK: |
| case ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK: |
| case DELIVERY_INSTRUCTIONS: |
| case LOYALTY_MEMBERSHIP_PROGRAM: |
| case LOYALTY_MEMBERSHIP_PROVIDER: |
| case LOYALTY_MEMBERSHIP_ID: |
| case EMAIL_OR_LOYALTY_MEMBERSHIP_ID: |
| return true; |
| |
| case CREDIT_CARD_NAME_FULL: |
| case CREDIT_CARD_NAME_FIRST: |
| case CREDIT_CARD_NAME_LAST: |
| case CREDIT_CARD_NUMBER: |
| case CREDIT_CARD_EXP_MONTH: |
| case CREDIT_CARD_EXP_2_DIGIT_YEAR: |
| case CREDIT_CARD_EXP_4_DIGIT_YEAR: |
| case CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR: |
| case CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR: |
| case CREDIT_CARD_TYPE: |
| case CREDIT_CARD_VERIFICATION_CODE: |
| case CREDIT_CARD_STANDALONE_VERIFICATION_CODE: |
| return true; |
| |
| case IBAN_VALUE: |
| return true; |
| |
| case COMPANY_NAME: |
| return true; |
| |
| case MERCHANT_PROMO_CODE: |
| return true; |
| |
| // Fillable credential fields. |
| case USERNAME: |
| case PASSWORD: |
| case ACCOUNT_CREATION_PASSWORD: |
| case CONFIRMATION_PASSWORD: |
| case SINGLE_USERNAME: |
| case SINGLE_USERNAME_FORGOT_PASSWORD: |
| case SINGLE_USERNAME_WITH_INTERMEDIATE_VALUES: |
| return true; |
| |
| case ONE_TIME_CODE: |
| #if BUILDFLAG(IS_ANDROID) |
| return base::FeatureList::IsEnabled( |
| password_manager::features::kAndroidSmsOtpFilling); |
| #else |
| return false; // Feature is not applicable on other platforms |
| #endif |
| |
| // Autofill AI types. |
| case DRIVERS_LICENSE_EXPIRATION_DATE: |
| case DRIVERS_LICENSE_ISSUE_DATE: |
| case DRIVERS_LICENSE_NUMBER: |
| case DRIVERS_LICENSE_REGION: |
| case PASSPORT_EXPIRATION_DATE: |
| case PASSPORT_ISSUE_DATE: |
| case PASSPORT_ISSUING_COUNTRY: |
| case PASSPORT_NUMBER: |
| case VEHICLE_LICENSE_PLATE: |
| case VEHICLE_MAKE: |
| case VEHICLE_MODEL: |
| case VEHICLE_PLATE_STATE: |
| case VEHICLE_VIN: |
| case VEHICLE_YEAR: |
| case NATIONAL_ID_CARD_NUMBER: |
| case NATIONAL_ID_CARD_EXPIRATION_DATE: |
| case NATIONAL_ID_CARD_ISSUE_DATE: |
| case NATIONAL_ID_CARD_ISSUING_COUNTRY: |
| case REDRESS_NUMBER: |
| case KNOWN_TRAVELER_NUMBER: |
| case KNOWN_TRAVELER_NUMBER_EXPIRATION_DATE: |
| case FLIGHT_RESERVATION_FLIGHT_NUMBER: |
| case FLIGHT_RESERVATION_TICKET_NUMBER: |
| case FLIGHT_RESERVATION_CONFIRMATION_CODE: |
| case ORDER_ID: |
| case ORDER_DATE: |
| case ORDER_MERCHANT_NAME: |
| case SHIPMENT_TRACKING_NUMBER: |
| return true; |
| |
| // Autofill AI types that are not fillable. |
| case FLIGHT_RESERVATION_DEPARTURE_DATE: |
| return false; |
| |
| // Not fillable credential fields. |
| case NOT_PASSWORD: |
| case NOT_USERNAME: |
| return false; |
| |
| // Credential field types that the server should never return as |
| // classifications. |
| case NOT_ACCOUNT_CREATION_PASSWORD: |
| case NEW_PASSWORD: |
| case PROBABLY_NEW_PASSWORD: |
| case NOT_NEW_PASSWORD: |
| |
| case NO_SERVER_DATA: |
| case EMPTY_TYPE: |
| case AMBIGUOUS_TYPE: |
| case MERCHANT_EMAIL_SIGNUP: |
| case PRICE: |
| case NUMERIC_QUANTITY: |
| case SEARCH_TERM: |
| case UNKNOWN_TYPE: |
| case MAX_VALID_FIELD_TYPE: |
| return false; |
| } |
| NOTREACHED(); |
| } |
| |
| std::string_view FieldTypeToStringView(FieldType type) { |
| static const base::NoDestructor<base::flat_map<FieldType, std::string_view>> |
| kFieldTypeToTypeName(base::MakeFlatMap<FieldType, std::string_view>( |
| kTypeNameToFieldType, {}, [](const auto& item) { |
| return std::make_pair(item.second, item.first); |
| })); |
| |
| auto it = kFieldTypeToTypeName->find(type); |
| if (it != kFieldTypeToTypeName->end()) { |
| return it->second; |
| } |
| NOTREACHED(); |
| } |
| |
| std::string FieldTypeToString(FieldType type) { |
| return std::string(FieldTypeToStringView(type)); |
| } |
| |
| std::string FieldTypeSetToString(FieldTypeSet s) { |
| return base::JoinString( |
| base::ToVector(s, [](FieldType t) { return FieldTypeToStringView(t); }), |
| ", "); |
| } |
| |
| FieldType TypeNameToFieldType(std::string_view type_name) { |
| auto it = kTypeNameToFieldType.find(type_name); |
| return it != kTypeNameToFieldType.end() ? it->second : UNKNOWN_TYPE; |
| } |
| |
| std::string_view FieldTypeToDeveloperRepresentationString(FieldType type) { |
| switch (type) { |
| case NO_SERVER_DATA: |
| case UNKNOWN_TYPE: |
| case EMPTY_TYPE: |
| case NOT_ACCOUNT_CREATION_PASSWORD: |
| case NOT_NEW_PASSWORD: |
| case NOT_PASSWORD: |
| case NOT_USERNAME: |
| case AMBIGUOUS_TYPE: |
| case NAME_SUFFIX: |
| case ADDRESS_HOME_ADDRESS: |
| case ADDRESS_HOME_ADDRESS_WITH_NAME: |
| case PASSPORT_NUMBER: |
| case PASSPORT_ISSUING_COUNTRY: |
| case PASSPORT_EXPIRATION_DATE: |
| case PASSPORT_ISSUE_DATE: |
| case LOYALTY_MEMBERSHIP_PROGRAM: |
| case LOYALTY_MEMBERSHIP_PROVIDER: |
| case LOYALTY_MEMBERSHIP_ID: |
| case EMAIL_OR_LOYALTY_MEMBERSHIP_ID: |
| case VEHICLE_LICENSE_PLATE: |
| case VEHICLE_VIN: |
| case VEHICLE_MAKE: |
| case VEHICLE_MODEL: |
| case VEHICLE_YEAR: |
| case VEHICLE_PLATE_STATE: |
| case DRIVERS_LICENSE_REGION: |
| case DRIVERS_LICENSE_NUMBER: |
| case DRIVERS_LICENSE_EXPIRATION_DATE: |
| case DRIVERS_LICENSE_ISSUE_DATE: |
| case NATIONAL_ID_CARD_NUMBER: |
| case NATIONAL_ID_CARD_EXPIRATION_DATE: |
| case NATIONAL_ID_CARD_ISSUE_DATE: |
| case NATIONAL_ID_CARD_ISSUING_COUNTRY: |
| case REDRESS_NUMBER: |
| case KNOWN_TRAVELER_NUMBER: |
| case KNOWN_TRAVELER_NUMBER_EXPIRATION_DATE: |
| case FLIGHT_RESERVATION_FLIGHT_NUMBER: |
| case FLIGHT_RESERVATION_TICKET_NUMBER: |
| case FLIGHT_RESERVATION_CONFIRMATION_CODE: |
| case FLIGHT_RESERVATION_DEPARTURE_DATE: |
| case ORDER_ID: |
| case ORDER_DATE: |
| case ORDER_MERCHANT_NAME: |
| case SHIPMENT_TRACKING_NUMBER: |
| return ""; |
| case NUMERIC_QUANTITY: |
| return "Numeric quantity"; |
| case MERCHANT_EMAIL_SIGNUP: |
| return "Merchant email signup"; |
| case MERCHANT_PROMO_CODE: |
| return "Merchant promo code"; |
| case PASSWORD: |
| return "Password"; |
| case ACCOUNT_CREATION_PASSWORD: |
| return "Account creation password"; |
| case USERNAME: |
| case SINGLE_USERNAME: |
| case SINGLE_USERNAME_FORGOT_PASSWORD: |
| case SINGLE_USERNAME_WITH_INTERMEDIATE_VALUES: |
| return "Username"; |
| case USERNAME_AND_EMAIL_ADDRESS: |
| return "Username and email"; |
| case PROBABLY_NEW_PASSWORD: |
| case NEW_PASSWORD: |
| return "New password"; |
| case CONFIRMATION_PASSWORD: |
| return "Confirmation password"; |
| case SEARCH_TERM: |
| return "Search term"; |
| case PRICE: |
| return "Price"; |
| case NAME_HONORIFIC_PREFIX: |
| return "Honorific prefix"; |
| case NAME_FIRST: |
| return "First name"; |
| case NAME_MIDDLE: |
| return "Middle name"; |
| case NAME_LAST: |
| return "Last name"; |
| case NAME_LAST_FIRST: |
| return "First last name"; |
| case NAME_LAST_CONJUNCTION: |
| return "Last name conjunction"; |
| case NAME_LAST_SECOND: |
| return "Second last name"; |
| case NAME_MIDDLE_INITIAL: |
| return "Middle name initial"; |
| case NAME_FULL: |
| return "Full name"; |
| case ALTERNATIVE_FULL_NAME: |
| return "Alternative full name"; |
| case ALTERNATIVE_FAMILY_NAME: |
| return "Alternative family name"; |
| case ALTERNATIVE_GIVEN_NAME: |
| return "Alternative given name"; |
| case EMAIL_ADDRESS: |
| return "Email address"; |
| case PHONE_HOME_NUMBER: |
| case PHONE_HOME_WHOLE_NUMBER: |
| case PHONE_HOME_CITY_AND_NUMBER: |
| case PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX: |
| return "Phone number"; |
| case PHONE_HOME_NUMBER_PREFIX: |
| return "Phone number prefix"; |
| case PHONE_HOME_NUMBER_SUFFIX: |
| return "Phone number suffix"; |
| case PHONE_HOME_CITY_CODE: |
| case PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX: |
| return "Phone number city code"; |
| case PHONE_HOME_COUNTRY_CODE: |
| return "Phone number country code"; |
| case PHONE_HOME_EXTENSION: |
| return "Phone number extension"; |
| case ADDRESS_HOME_FLOOR: |
| return "Floor"; |
| case ADDRESS_HOME_LANDMARK: |
| return "Landmark"; |
| case ADDRESS_HOME_STREET_NAME: |
| return "Street name"; |
| case ADDRESS_HOME_HOUSE_NUMBER: |
| return "House number"; |
| case ADDRESS_HOME_BETWEEN_STREETS: |
| return "Address between-streets"; |
| case ADDRESS_HOME_BETWEEN_STREETS_1: |
| return "Address between-streets 1"; |
| case ADDRESS_HOME_BETWEEN_STREETS_2: |
| return "Address between-streets 2"; |
| case ADDRESS_HOME_LINE1: |
| return "Address line 1"; |
| case ADDRESS_HOME_LINE2: |
| return "Address line 2"; |
| case ADDRESS_HOME_LINE3: |
| return "Address line 3"; |
| case ADDRESS_HOME_SUBPREMISE: |
| return "Address subpremise"; |
| case ADDRESS_HOME_OTHER_SUBUNIT: |
| return "Address subunit"; |
| case ADDRESS_HOME_ADMIN_LEVEL2: |
| return "Administrative area level 2"; |
| case ADDRESS_HOME_STREET_LOCATION: |
| return "Street location"; |
| case ADDRESS_HOME_STREET_ADDRESS: |
| return "Street address"; |
| case ADDRESS_HOME_SORTING_CODE: |
| return "Sorting code"; |
| case ADDRESS_HOME_DEPENDENT_LOCALITY: |
| return "Dependent locality"; |
| case ADDRESS_HOME_APT: |
| return "Apt"; |
| case ADDRESS_HOME_APT_NUM: |
| return "Apt num"; |
| case ADDRESS_HOME_APT_TYPE: |
| return "Apt type"; |
| case ADDRESS_HOME_CITY: |
| return "City"; |
| case ADDRESS_HOME_STATE: |
| return "State"; |
| case ADDRESS_HOME_ZIP: |
| return "ZIP code"; |
| case ADDRESS_HOME_ZIP_PREFIX: |
| return "ZIP code prefix"; |
| case ADDRESS_HOME_ZIP_SUFFIX: |
| return "ZIP code suffix"; |
| case ADDRESS_HOME_ZIP_AND_CITY: |
| return "ZIP code and city"; |
| case ADDRESS_HOME_COUNTRY: |
| return "Country"; |
| case ADDRESS_HOME_OVERFLOW: |
| return "Address overflow"; |
| case ADDRESS_HOME_OVERFLOW_AND_LANDMARK: |
| return "Address overflow and landmark"; |
| case ADDRESS_HOME_BETWEEN_STREETS_OR_LANDMARK: |
| return "Address between-streets and landmark"; |
| case ADDRESS_HOME_STREET_LOCATION_AND_LOCALITY: |
| return "Address street location and locality"; |
| case ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK: |
| return "Address street location and landmark"; |
| case ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK: |
| return "Address locality and landmark"; |
| case ADDRESS_HOME_HOUSE_NUMBER_AND_APT: |
| return "House number and apartment number"; |
| case DELIVERY_INSTRUCTIONS: |
| return "Delivery instructions"; |
| case CREDIT_CARD_NAME_FULL: |
| return "Credit card full name"; |
| case CREDIT_CARD_NAME_FIRST: |
| return "Credit card first name"; |
| case CREDIT_CARD_NAME_LAST: |
| return "Credit card last name"; |
| case CREDIT_CARD_NUMBER: |
| return "Credit card number"; |
| case CREDIT_CARD_EXP_MONTH: |
| return "Credit card exp month"; |
| case CREDIT_CARD_EXP_2_DIGIT_YEAR: |
| case CREDIT_CARD_EXP_4_DIGIT_YEAR: |
| case CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR: |
| case CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR: |
| return "Credit card exp year"; |
| case CREDIT_CARD_TYPE: |
| return "Credit card type"; |
| case CREDIT_CARD_VERIFICATION_CODE: |
| return "Credit card verification code"; |
| case COMPANY_NAME: |
| return "Company name"; |
| case IBAN_VALUE: |
| return "IBAN"; |
| case CREDIT_CARD_STANDALONE_VERIFICATION_CODE: |
| case ONE_TIME_CODE: |
| return "One time code"; |
| case MAX_VALID_FIELD_TYPE: |
| return ""; |
| } |
| NOTREACHED(); |
| } |
| |
| FieldTypeGroup GroupTypeOfHtmlFieldType(HtmlFieldType field_type) { |
| switch (field_type) { |
| case HtmlFieldType::kName: |
| case HtmlFieldType::kHonorificPrefix: |
| case HtmlFieldType::kGivenName: |
| case HtmlFieldType::kAdditionalName: |
| case HtmlFieldType::kAdditionalNameInitial: |
| case HtmlFieldType::kFamilyName: |
| return FieldTypeGroup::kName; |
| |
| case HtmlFieldType::kOrganization: |
| return FieldTypeGroup::kCompany; |
| |
| case HtmlFieldType::kStreetAddress: |
| case HtmlFieldType::kAddressLine1: |
| case HtmlFieldType::kAddressLine2: |
| case HtmlFieldType::kAddressLine3: |
| case HtmlFieldType::kAddressLevel1: |
| case HtmlFieldType::kAddressLevel2: |
| case HtmlFieldType::kAddressLevel3: |
| case HtmlFieldType::kCountryCode: |
| case HtmlFieldType::kCountryName: |
| case HtmlFieldType::kPostalCode: |
| return FieldTypeGroup::kAddress; |
| |
| case HtmlFieldType::kCreditCardNameFull: |
| case HtmlFieldType::kCreditCardNameFirst: |
| case HtmlFieldType::kCreditCardNameLast: |
| case HtmlFieldType::kCreditCardNumber: |
| case HtmlFieldType::kCreditCardExp: |
| case HtmlFieldType::kCreditCardExpDate2DigitYear: |
| case HtmlFieldType::kCreditCardExpDate4DigitYear: |
| case HtmlFieldType::kCreditCardExpMonth: |
| case HtmlFieldType::kCreditCardExpYear: |
| case HtmlFieldType::kCreditCardExp2DigitYear: |
| case HtmlFieldType::kCreditCardExp4DigitYear: |
| case HtmlFieldType::kCreditCardVerificationCode: |
| case HtmlFieldType::kCreditCardType: |
| return FieldTypeGroup::kCreditCard; |
| |
| case HtmlFieldType::kTransactionAmount: |
| case HtmlFieldType::kTransactionCurrency: |
| return FieldTypeGroup::kTransaction; |
| |
| case HtmlFieldType::kTel: |
| case HtmlFieldType::kTelCountryCode: |
| case HtmlFieldType::kTelNational: |
| case HtmlFieldType::kTelAreaCode: |
| case HtmlFieldType::kTelLocal: |
| case HtmlFieldType::kTelLocalPrefix: |
| case HtmlFieldType::kTelLocalSuffix: |
| case HtmlFieldType::kTelExtension: |
| return FieldTypeGroup::kPhone; |
| |
| case HtmlFieldType::kEmail: |
| return FieldTypeGroup::kEmail; |
| |
| case HtmlFieldType::kBirthdateDay: |
| case HtmlFieldType::kBirthdateMonth: |
| case HtmlFieldType::kBirthdateYear: |
| return FieldTypeGroup::kNoGroup; |
| |
| case HtmlFieldType::kOneTimeCode: |
| return FieldTypeGroup::kOneTimePassword; |
| |
| case HtmlFieldType::kMerchantPromoCode: |
| return FieldTypeGroup::kNoGroup; |
| |
| case HtmlFieldType::kIban: |
| return FieldTypeGroup::kIban; |
| |
| case HtmlFieldType::kUnspecified: |
| case HtmlFieldType::kUnrecognized: |
| return FieldTypeGroup::kNoGroup; |
| } |
| NOTREACHED(); |
| } |
| |
| FieldType HtmlFieldTypeToBestCorrespondingFieldType(HtmlFieldType field_type) { |
| switch (field_type) { |
| case HtmlFieldType::kUnspecified: |
| return UNKNOWN_TYPE; |
| |
| case HtmlFieldType::kName: |
| return NAME_FULL; |
| |
| case HtmlFieldType::kHonorificPrefix: |
| return NAME_HONORIFIC_PREFIX; |
| |
| case HtmlFieldType::kGivenName: |
| return NAME_FIRST; |
| |
| case HtmlFieldType::kAdditionalName: |
| return NAME_MIDDLE; |
| |
| case HtmlFieldType::kFamilyName: |
| return NAME_LAST; |
| |
| case HtmlFieldType::kOrganization: |
| return COMPANY_NAME; |
| |
| case HtmlFieldType::kStreetAddress: |
| return ADDRESS_HOME_STREET_ADDRESS; |
| |
| case HtmlFieldType::kAddressLine1: |
| return ADDRESS_HOME_LINE1; |
| |
| case HtmlFieldType::kAddressLine2: |
| return ADDRESS_HOME_LINE2; |
| |
| case HtmlFieldType::kAddressLine3: |
| return ADDRESS_HOME_LINE3; |
| |
| case HtmlFieldType::kAddressLevel1: |
| return ADDRESS_HOME_STATE; |
| |
| case HtmlFieldType::kAddressLevel2: |
| return ADDRESS_HOME_CITY; |
| |
| case HtmlFieldType::kAddressLevel3: |
| return ADDRESS_HOME_DEPENDENT_LOCALITY; |
| |
| case HtmlFieldType::kCountryCode: |
| case HtmlFieldType::kCountryName: |
| return ADDRESS_HOME_COUNTRY; |
| |
| case HtmlFieldType::kPostalCode: |
| return ADDRESS_HOME_ZIP; |
| |
| case HtmlFieldType::kCreditCardNameFull: |
| return CREDIT_CARD_NAME_FULL; |
| |
| case HtmlFieldType::kCreditCardNameFirst: |
| return CREDIT_CARD_NAME_FIRST; |
| |
| case HtmlFieldType::kCreditCardNameLast: |
| return CREDIT_CARD_NAME_LAST; |
| |
| case HtmlFieldType::kCreditCardNumber: |
| return CREDIT_CARD_NUMBER; |
| |
| case HtmlFieldType::kCreditCardExp: |
| return CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR; |
| |
| case HtmlFieldType::kCreditCardExpMonth: |
| return CREDIT_CARD_EXP_MONTH; |
| |
| case HtmlFieldType::kCreditCardExpYear: |
| return CREDIT_CARD_EXP_4_DIGIT_YEAR; |
| |
| case HtmlFieldType::kCreditCardVerificationCode: |
| return CREDIT_CARD_VERIFICATION_CODE; |
| |
| case HtmlFieldType::kCreditCardType: |
| return CREDIT_CARD_TYPE; |
| |
| case HtmlFieldType::kTel: |
| return PHONE_HOME_WHOLE_NUMBER; |
| |
| case HtmlFieldType::kTelCountryCode: |
| return PHONE_HOME_COUNTRY_CODE; |
| |
| case HtmlFieldType::kTelNational: |
| return PHONE_HOME_CITY_AND_NUMBER; |
| |
| case HtmlFieldType::kTelAreaCode: |
| return PHONE_HOME_CITY_CODE; |
| |
| case HtmlFieldType::kTelLocal: |
| return PHONE_HOME_NUMBER; |
| |
| case HtmlFieldType::kTelLocalPrefix: |
| return PHONE_HOME_NUMBER_PREFIX; |
| |
| case HtmlFieldType::kTelLocalSuffix: |
| return PHONE_HOME_NUMBER_SUFFIX; |
| |
| case HtmlFieldType::kTelExtension: |
| return PHONE_HOME_EXTENSION; |
| |
| case HtmlFieldType::kEmail: |
| return EMAIL_ADDRESS; |
| |
| case HtmlFieldType::kAdditionalNameInitial: |
| return NAME_MIDDLE_INITIAL; |
| |
| case HtmlFieldType::kCreditCardExpDate2DigitYear: |
| return CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR; |
| |
| case HtmlFieldType::kCreditCardExpDate4DigitYear: |
| return CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR; |
| |
| case HtmlFieldType::kCreditCardExp2DigitYear: |
| return CREDIT_CARD_EXP_2_DIGIT_YEAR; |
| |
| case HtmlFieldType::kCreditCardExp4DigitYear: |
| return CREDIT_CARD_EXP_4_DIGIT_YEAR; |
| |
| case HtmlFieldType::kOneTimeCode: |
| return ONE_TIME_CODE; |
| |
| case HtmlFieldType::kIban: |
| return IBAN_VALUE; |
| |
| // These types aren't stored; they're transient. |
| case HtmlFieldType::kBirthdateDay: |
| case HtmlFieldType::kBirthdateMonth: |
| case HtmlFieldType::kBirthdateYear: |
| case HtmlFieldType::kTransactionAmount: |
| case HtmlFieldType::kTransactionCurrency: |
| case HtmlFieldType::kMerchantPromoCode: |
| return UNKNOWN_TYPE; |
| |
| case HtmlFieldType::kUnrecognized: |
| return UNKNOWN_TYPE; |
| } |
| NOTREACHED(); |
| } |
| |
| } // namespace autofill |