blob: ab43e41d75659d7ff2e2e4ce580e63bdad7ed078 [file]
// Copyright 2022 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_type_utils.h"
#include "base/check.h"
#include "base/containers/fixed_flat_map.h"
#include "base/notreached.h"
#include "components/autofill/core/browser/autofill_field.h"
#include "components/autofill/core/browser/autofill_type.h"
#include "components/autofill/core/browser/field_types.h"
namespace autofill {
bool FieldHasMeaningfulPossibleFieldTypes(const AutofillField& field) {
// This function should only be invoked when the possible types have been
// determined.
DCHECK(!field.possible_types().empty());
if (field.possible_types().contains_any({UNKNOWN_TYPE, EMPTY_TYPE})) {
// If either UNKNOWN_TYPE or EMPTY_TYPE is present, there should be no other
// type
DCHECK_EQ(field.possible_types().size(), 1u);
return false;
}
return true;
}
bool TypeOfFieldIsPossibleType(const AutofillField& field) {
return field.possible_types().contains_any(field.Type().GetTypes());
}
size_t AddressLineIndex(FieldType type) {
static constexpr auto kAddressLineIndex =
base::MakeFixedFlatMap<FieldType, size_t>({{ADDRESS_HOME_LINE1, 0},
{ADDRESS_HOME_LINE2, 1},
{ADDRESS_HOME_LINE3, 2}});
if (auto it = kAddressLineIndex.find(type); it != kAddressLineIndex.end()) {
return it->second;
}
NOTREACHED();
}
size_t DetermineExpirationYearLength(FieldType assumed_field_type) {
switch (assumed_field_type) {
case CREDIT_CARD_EXP_2_DIGIT_YEAR:
return 2;
case CREDIT_CARD_EXP_4_DIGIT_YEAR:
return 4;
default:
NOTREACHED();
}
}
bool IsAlternativeNameType(FieldType type) {
return type == ALTERNATIVE_FULL_NAME || type == ALTERNATIVE_GIVEN_NAME ||
type == ALTERNATIVE_FAMILY_NAME;
}
bool IsDateFieldType(FieldType field_type) {
switch (field_type) {
case NO_SERVER_DATA:
case UNKNOWN_TYPE:
case EMPTY_TYPE:
case NAME_FIRST:
case NAME_MIDDLE:
case NAME_LAST:
case NAME_MIDDLE_INITIAL:
case NAME_FULL:
case NAME_SUFFIX:
case EMAIL_ADDRESS:
case PHONE_HOME_NUMBER:
case PHONE_HOME_CITY_CODE:
case PHONE_HOME_COUNTRY_CODE:
case PHONE_HOME_CITY_AND_NUMBER:
case PHONE_HOME_WHOLE_NUMBER:
case ADDRESS_HOME_LINE1:
case ADDRESS_HOME_LINE2:
case ADDRESS_HOME_APT_NUM:
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_COUNTRY:
case CREDIT_CARD_NAME_FULL:
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_TYPE:
case CREDIT_CARD_VERIFICATION_CODE:
case COMPANY_NAME:
case MERCHANT_EMAIL_SIGNUP:
case MERCHANT_PROMO_CODE:
case PASSWORD:
case ACCOUNT_CREATION_PASSWORD:
case ADDRESS_HOME_STREET_ADDRESS:
case ADDRESS_HOME_SORTING_CODE:
case ADDRESS_HOME_DEPENDENT_LOCALITY:
case ADDRESS_HOME_LINE3:
case NOT_ACCOUNT_CREATION_PASSWORD:
case USERNAME:
case USERNAME_AND_EMAIL_ADDRESS:
case NEW_PASSWORD:
case PROBABLY_NEW_PASSWORD:
case NOT_NEW_PASSWORD:
case CREDIT_CARD_NAME_FIRST:
case CREDIT_CARD_NAME_LAST:
case PHONE_HOME_EXTENSION:
case CONFIRMATION_PASSWORD:
case AMBIGUOUS_TYPE:
case SEARCH_TERM:
case PRICE:
case NOT_PASSWORD:
case SINGLE_USERNAME:
case NOT_USERNAME:
case ADDRESS_HOME_STREET_NAME:
case ADDRESS_HOME_HOUSE_NUMBER:
case ADDRESS_HOME_SUBPREMISE:
case ADDRESS_HOME_OTHER_SUBUNIT:
case NAME_LAST_FIRST:
case NAME_LAST_CONJUNCTION:
case NAME_LAST_SECOND:
case NAME_HONORIFIC_PREFIX:
case ADDRESS_HOME_ADDRESS:
case ADDRESS_HOME_ADDRESS_WITH_NAME:
case ADDRESS_HOME_FLOOR:
case PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX:
case PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX:
case PHONE_HOME_NUMBER_PREFIX:
case PHONE_HOME_NUMBER_SUFFIX:
case IBAN_VALUE:
case CREDIT_CARD_STANDALONE_VERIFICATION_CODE:
case NUMERIC_QUANTITY:
case ONE_TIME_CODE:
case DELIVERY_INSTRUCTIONS:
case ADDRESS_HOME_OVERFLOW:
case ADDRESS_HOME_LANDMARK:
case ADDRESS_HOME_OVERFLOW_AND_LANDMARK:
case ADDRESS_HOME_ADMIN_LEVEL2:
case ADDRESS_HOME_STREET_LOCATION:
case ADDRESS_HOME_BETWEEN_STREETS:
case ADDRESS_HOME_BETWEEN_STREETS_OR_LANDMARK:
case ADDRESS_HOME_STREET_LOCATION_AND_LOCALITY:
case ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK:
case ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK:
case ADDRESS_HOME_BETWEEN_STREETS_1:
case ADDRESS_HOME_BETWEEN_STREETS_2:
case ADDRESS_HOME_HOUSE_NUMBER_AND_APT:
case SINGLE_USERNAME_FORGOT_PASSWORD:
case ADDRESS_HOME_APT:
case ADDRESS_HOME_APT_TYPE:
case LOYALTY_MEMBERSHIP_ID:
case EMAIL_OR_LOYALTY_MEMBERSHIP_ID:
case SINGLE_USERNAME_WITH_INTERMEDIATE_VALUES:
case ALTERNATIVE_FULL_NAME:
case ALTERNATIVE_GIVEN_NAME:
case ALTERNATIVE_FAMILY_NAME:
case PASSPORT_NUMBER:
case PASSPORT_ISSUING_COUNTRY:
case LOYALTY_MEMBERSHIP_PROGRAM:
case LOYALTY_MEMBERSHIP_PROVIDER:
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 NATIONAL_ID_CARD_NUMBER:
case NATIONAL_ID_CARD_ISSUING_COUNTRY:
case REDRESS_NUMBER:
case KNOWN_TRAVELER_NUMBER:
case MAX_VALID_FIELD_TYPE:
case FLIGHT_RESERVATION_FLIGHT_NUMBER:
case FLIGHT_RESERVATION_TICKET_NUMBER:
case FLIGHT_RESERVATION_CONFIRMATION_CODE:
case ADDRESS_HOME_ZIP_AND_CITY:
case ORDER_ID:
case ORDER_MERCHANT_NAME:
case SHIPMENT_TRACKING_NUMBER:
return false;
case CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR:
case CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR:
case PASSPORT_EXPIRATION_DATE:
case PASSPORT_ISSUE_DATE:
case DRIVERS_LICENSE_EXPIRATION_DATE:
case DRIVERS_LICENSE_ISSUE_DATE:
case NATIONAL_ID_CARD_EXPIRATION_DATE:
case NATIONAL_ID_CARD_ISSUE_DATE:
case KNOWN_TRAVELER_NUMBER_EXPIRATION_DATE:
case FLIGHT_RESERVATION_DEPARTURE_DATE:
case ORDER_DATE:
return true;
}
NOTREACHED();
}
bool IsAffixFormatStringEnabledForType(FieldType type) {
switch (type) {
case NO_SERVER_DATA:
case UNKNOWN_TYPE:
case EMPTY_TYPE:
case NAME_FIRST:
case NAME_MIDDLE:
case NAME_LAST:
case NAME_MIDDLE_INITIAL:
case NAME_FULL:
case NAME_SUFFIX:
case EMAIL_ADDRESS:
case PHONE_HOME_NUMBER:
case PHONE_HOME_CITY_CODE:
case PHONE_HOME_COUNTRY_CODE:
case PHONE_HOME_CITY_AND_NUMBER:
case PHONE_HOME_WHOLE_NUMBER:
case ADDRESS_HOME_LINE1:
case ADDRESS_HOME_LINE2:
case ADDRESS_HOME_APT_NUM:
case ADDRESS_HOME_CITY:
case ADDRESS_HOME_STATE:
case ADDRESS_HOME_ZIP:
case ADDRESS_HOME_COUNTRY:
case CREDIT_CARD_NAME_FULL:
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 COMPANY_NAME:
case MERCHANT_EMAIL_SIGNUP:
case MERCHANT_PROMO_CODE:
case PASSWORD:
case ACCOUNT_CREATION_PASSWORD:
case ADDRESS_HOME_STREET_ADDRESS:
case ADDRESS_HOME_SORTING_CODE:
case ADDRESS_HOME_DEPENDENT_LOCALITY:
case ADDRESS_HOME_LINE3:
case NOT_ACCOUNT_CREATION_PASSWORD:
case USERNAME:
case USERNAME_AND_EMAIL_ADDRESS:
case NEW_PASSWORD:
case PROBABLY_NEW_PASSWORD:
case NOT_NEW_PASSWORD:
case CREDIT_CARD_NAME_FIRST:
case CREDIT_CARD_NAME_LAST:
case PHONE_HOME_EXTENSION:
case CONFIRMATION_PASSWORD:
case AMBIGUOUS_TYPE:
case SEARCH_TERM:
case PRICE:
case NOT_PASSWORD:
case SINGLE_USERNAME:
case NOT_USERNAME:
case ADDRESS_HOME_STREET_NAME:
case ADDRESS_HOME_HOUSE_NUMBER:
case ADDRESS_HOME_SUBPREMISE:
case ADDRESS_HOME_OTHER_SUBUNIT:
case NAME_LAST_FIRST:
case NAME_LAST_CONJUNCTION:
case NAME_LAST_SECOND:
case NAME_HONORIFIC_PREFIX:
case ADDRESS_HOME_ADDRESS:
case ADDRESS_HOME_ADDRESS_WITH_NAME:
case ADDRESS_HOME_FLOOR:
case PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX:
case PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX:
case PHONE_HOME_NUMBER_PREFIX:
case PHONE_HOME_NUMBER_SUFFIX:
case IBAN_VALUE:
case CREDIT_CARD_STANDALONE_VERIFICATION_CODE:
case NUMERIC_QUANTITY:
case ONE_TIME_CODE:
case DELIVERY_INSTRUCTIONS:
case ADDRESS_HOME_OVERFLOW:
case ADDRESS_HOME_LANDMARK:
case ADDRESS_HOME_OVERFLOW_AND_LANDMARK:
case ADDRESS_HOME_ADMIN_LEVEL2:
case ADDRESS_HOME_STREET_LOCATION:
case ADDRESS_HOME_BETWEEN_STREETS:
case ADDRESS_HOME_BETWEEN_STREETS_OR_LANDMARK:
case ADDRESS_HOME_STREET_LOCATION_AND_LOCALITY:
case ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK:
case ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK:
case ADDRESS_HOME_BETWEEN_STREETS_1:
case ADDRESS_HOME_BETWEEN_STREETS_2:
case ADDRESS_HOME_HOUSE_NUMBER_AND_APT:
case SINGLE_USERNAME_FORGOT_PASSWORD:
case ADDRESS_HOME_APT:
case ADDRESS_HOME_APT_TYPE:
case LOYALTY_MEMBERSHIP_ID:
case SINGLE_USERNAME_WITH_INTERMEDIATE_VALUES:
case ALTERNATIVE_FULL_NAME:
case ALTERNATIVE_GIVEN_NAME:
case ALTERNATIVE_FAMILY_NAME:
case PASSPORT_ISSUING_COUNTRY:
case PASSPORT_EXPIRATION_DATE:
case PASSPORT_ISSUE_DATE:
case LOYALTY_MEMBERSHIP_PROGRAM:
case LOYALTY_MEMBERSHIP_PROVIDER:
case VEHICLE_LICENSE_PLATE:
case VEHICLE_MAKE:
case VEHICLE_MODEL:
case DRIVERS_LICENSE_REGION:
case DRIVERS_LICENSE_EXPIRATION_DATE:
case DRIVERS_LICENSE_ISSUE_DATE:
case VEHICLE_YEAR:
case VEHICLE_PLATE_STATE:
case EMAIL_OR_LOYALTY_MEMBERSHIP_ID:
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 ADDRESS_HOME_ZIP_PREFIX:
case ADDRESS_HOME_ZIP_SUFFIX:
case MAX_VALID_FIELD_TYPE:
case FLIGHT_RESERVATION_FLIGHT_NUMBER:
case FLIGHT_RESERVATION_TICKET_NUMBER:
case FLIGHT_RESERVATION_CONFIRMATION_CODE:
case FLIGHT_RESERVATION_DEPARTURE_DATE:
case ADDRESS_HOME_ZIP_AND_CITY:
case ORDER_ID:
case ORDER_DATE:
case ORDER_MERCHANT_NAME:
case SHIPMENT_TRACKING_NUMBER:
return false;
case PASSPORT_NUMBER:
case VEHICLE_VIN:
case DRIVERS_LICENSE_NUMBER:
case NATIONAL_ID_CARD_NUMBER:
return true;
}
NOTREACHED();
}
} // namespace autofill