| Index: components/autofill/core/browser/credit_card.cc
|
| diff --git a/components/autofill/core/browser/credit_card.cc b/components/autofill/core/browser/credit_card.cc
|
| index b63d627c4f4dc943f036cc5088db3f56f07b9354..cf22144e01688c162864356c39580a46a9c31a75 100644
|
| --- a/components/autofill/core/browser/credit_card.cc
|
| +++ b/components/autofill/core/browser/credit_card.cc
|
| @@ -150,8 +150,6 @@ base::string16 CreditCard::TypeForDisplay(const std::string& type) {
|
| return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_JCB);
|
| if (type == kMasterCard)
|
| return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_MASTERCARD);
|
| - if (type == kSoloCard)
|
| - return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_SOLO);
|
| if (type == kVisaCard)
|
| return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_VISA);
|
|
|
| @@ -173,8 +171,6 @@ int CreditCard::IconResourceId(const std::string& type) {
|
| return IDR_AUTOFILL_CC_JCB;
|
| if (type == kMasterCard)
|
| return IDR_AUTOFILL_CC_MASTERCARD;
|
| - if (type == kSoloCard)
|
| - return IDR_AUTOFILL_CC_SOLO;
|
| if (type == kVisaCard)
|
| return IDR_AUTOFILL_CC_VISA;
|
|
|
| @@ -186,85 +182,83 @@ int CreditCard::IconResourceId(const std::string& type) {
|
|
|
| // static
|
| std::string CreditCard::GetCreditCardType(const base::string16& number) {
|
| - // Don't check for a specific type if this is not a credit card number.
|
| - if (!autofill::IsValidCreditCardNumber(number))
|
| - return kGenericCard;
|
| -
|
| // Credit card number specifications taken from:
|
| - // http://en.wikipedia.org/wiki/Credit_card_numbers and
|
| + // http://en.wikipedia.org/wiki/Credit_card_numbers,
|
| + // http://www.discovernetwork.com/merchants/images/Merchant_Marketing_PDF.pdf,
|
| + // http://www.regular-expressions.info/creditcard.html, and
|
| // http://www.beachnet.com/~hstiles/cardtype.html
|
| + //
|
| + // The last site is currently unavailable, but a cached version remains at
|
| + // http://web.archive.org/web/20120923111349/http://www.beachnet.com/~hstiles/cardtype.html
|
| + //
|
| // Card Type Prefix(es) Length
|
| // ---------------------------------------------------------------
|
| // Visa 4 13,16
|
| // American Express 34,37 15
|
| - // Diners Club 300-305,2014,2149,36, 14,15
|
| - // Discover Card 6011,65 16
|
| - // JCB 3 16
|
| - // JCB 2131,1800 15
|
| + // Diners Club 300-305,3095,36,38-39 14
|
| + // Discover Card 6011,644-649,65 16
|
| + // JCB 3528-3589 16
|
| // MasterCard 51-55 16
|
| - // Solo (debit card) 6334,6767 16,18,19
|
|
|
| - // We need at least 4 digits to work with.
|
| - if (number.length() < 4)
|
| + // Check for prefixes of length 1.
|
| + if (number.empty())
|
| return kGenericCard;
|
|
|
| - int first_four_digits = 0;
|
| - if (!base::StringToInt(number.substr(0, 4), &first_four_digits))
|
| + if (number[0] == '4')
|
| + return kVisaCard;
|
| +
|
| + // Check for prefixes of length 2.
|
| + if (number.size() < 2)
|
| return kGenericCard;
|
|
|
| - int first_three_digits = first_four_digits / 10;
|
| - int first_two_digits = first_three_digits / 10;
|
| - int first_digit = first_two_digits / 10;
|
| + int first_two_digits = 0;
|
| + if (!base::StringToInt(number.substr(0, 2), &first_two_digits))
|
| + return kGenericCard;
|
|
|
| - switch (number.length()) {
|
| - case 13:
|
| - if (first_digit == 4)
|
| - return kVisaCard;
|
| + if (first_two_digits == 34 || first_two_digits == 37)
|
| + return kAmericanExpressCard;
|
|
|
| - break;
|
| - case 14:
|
| - if (first_three_digits >= 300 && first_three_digits <= 305)
|
| - return kDinersCard;
|
| + if (first_two_digits == 36 ||
|
| + first_two_digits == 38 ||
|
| + first_two_digits == 39)
|
| + return kDinersCard;
|
|
|
| - if (first_digit == 36)
|
| - return kDinersCard;
|
| + if (first_two_digits >= 51 && first_two_digits <= 55)
|
| + return kMasterCard;
|
|
|
| - break;
|
| - case 15:
|
| - if (first_two_digits == 34 || first_two_digits == 37)
|
| - return kAmericanExpressCard;
|
| + if (first_two_digits == 65)
|
| + return kDiscoverCard;
|
|
|
| - if (first_four_digits == 2131 || first_four_digits == 1800)
|
| - return kJCBCard;
|
| + // Check for prefixes of length 3.
|
| + if (number.size() < 3)
|
| + return kGenericCard;
|
|
|
| - if (first_four_digits == 2014 || first_four_digits == 2149)
|
| - return kDinersCard;
|
| + int first_three_digits = 0;
|
| + if (!base::StringToInt(number.substr(0, 3), &first_three_digits))
|
| + return kGenericCard;
|
|
|
| - break;
|
| - case 16:
|
| - if (first_four_digits == 6011 || first_two_digits == 65)
|
| - return kDiscoverCard;
|
| + if (first_three_digits >= 300 && first_three_digits <= 305)
|
| + return kDinersCard;
|
|
|
| - if (first_four_digits == 6334 || first_four_digits == 6767)
|
| - return kSoloCard;
|
| + if (first_three_digits >= 644 && first_three_digits <= 649)
|
| + return kDiscoverCard;
|
|
|
| - if (first_two_digits >= 51 && first_two_digits <= 55)
|
| - return kMasterCard;
|
| + // Check for prefixes of length 4.
|
| + if (number.size() < 4)
|
| + return kGenericCard;
|
|
|
| - if (first_digit == 3)
|
| - return kJCBCard;
|
| + int first_four_digits = 0;
|
| + if (!base::StringToInt(number.substr(0, 4), &first_four_digits))
|
| + return kGenericCard;
|
|
|
| - if (first_digit == 4)
|
| - return kVisaCard;
|
| + if (first_four_digits == 3095)
|
| + return kDinersCard;
|
|
|
| - break;
|
| - case 18:
|
| - case 19:
|
| - if (first_four_digits == 6334 || first_four_digits == 6767)
|
| - return kSoloCard;
|
| + if (first_four_digits >= 3528 && first_four_digits <= 3589)
|
| + return kJCBCard;
|
|
|
| - break;
|
| - }
|
| + if (first_four_digits == 6011)
|
| + return kDiscoverCard;
|
|
|
| return kGenericCard;
|
| }
|
| @@ -691,7 +685,6 @@ const char* const kDiscoverCard = "discoverCC";
|
| const char* const kGenericCard = "genericCC";
|
| const char* const kJCBCard = "jcbCC";
|
| const char* const kMasterCard = "masterCardCC";
|
| -const char* const kSoloCard = "soloCC";
|
| const char* const kVisaCard = "visaCC";
|
|
|
| } // namespace autofill
|
|
|