summaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-21 14:30:25 +0000
committerisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-21 14:30:25 +0000
commitfce5d927cd91430c0515866418c892ded4e12999 (patch)
tree8fd478d281c5050b49ff741930e91e47916f2045 /components
parentcdd539c4d47ae6368bd5404733b4d9cd5d925376 (diff)
downloadchromium_src-fce5d927cd91430c0515866418c892ded4e12999.zip
chromium_src-fce5d927cd91430c0515866418c892ded4e12999.tar.gz
chromium_src-fce5d927cd91430c0515866418c892ded4e12999.tar.bz2
[Autofill] Update credit card type detection logic.
* Remove Solo card support, as Solo cards have been decommissioned permanently since March 31, 2011. * Update the BIN range for DiscoverCard to include 644-649. * Correct the BIN ranges for Diner's Club and JCB cards. * Add test coverage BUG=246497 TEST=CreditCardTest.GetCreditCardType R=estade@chromium.org TBR=joi@chromium.org Review URL: https://chromiumcodereview.appspot.com/16254010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@207809 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components')
-rw-r--r--components/autofill/content/browser/wallet/wallet_items.cc7
-rw-r--r--components/autofill/core/browser/autofill_manager_unittest.cc20
-rw-r--r--components/autofill/core/browser/credit_card.cc111
-rw-r--r--components/autofill/core/browser/credit_card.h9
-rw-r--r--components/autofill/core/browser/credit_card_unittest.cc165
-rw-r--r--components/autofill/core/browser/personal_data_manager_unittest.cc3
-rw-r--r--components/autofill/core/browser/validation.cc21
-rw-r--r--components/component_strings.grd3
8 files changed, 252 insertions, 87 deletions
diff --git a/components/autofill/content/browser/wallet/wallet_items.cc b/components/autofill/content/browser/wallet/wallet_items.cc
index de64dae..30317ac 100644
--- a/components/autofill/content/browser/wallet/wallet_items.cc
+++ b/components/autofill/content/browser/wallet/wallet_items.cc
@@ -269,8 +269,6 @@ base::string16 WalletItems::MaskedInstrument::TypeAndLastFourDigits() const {
display_type = CreditCard::TypeForDisplay(kDiscoverCard);
else if (type_ == MASTER_CARD)
display_type = CreditCard::TypeForDisplay(kMasterCard);
- else if (type_ == SOLO)
- display_type = CreditCard::TypeForDisplay(kSoloCard);
else if (type_ == VISA)
display_type = CreditCard::TypeForDisplay(kVisaCard);
else
@@ -295,14 +293,11 @@ const gfx::Image& WalletItems::MaskedInstrument::CardIcon() const {
idr = IDR_AUTOFILL_CC_MASTERCARD;
break;
- case SOLO:
- idr = IDR_AUTOFILL_CC_SOLO;
- break;
-
case VISA:
idr = IDR_AUTOFILL_CC_VISA;
break;
+ case SOLO:
case MAESTRO:
case SWITCH:
case UNKNOWN:
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc
index fc29c5f..c35a902 100644
--- a/components/autofill/core/browser/autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -1180,8 +1180,8 @@ TEST_F(AutofillManagerTest, GetCreditCardSuggestionsEmptyValue) {
base::string16 expected_labels[] = { ASCIIToUTF16("*3456"),
ASCIIToUTF16("*8765")};
base::string16 expected_icons[] = {
- ASCIIToUTF16("visaCC"),
- ASCIIToUTF16("genericCC")
+ ASCIIToUTF16(kVisaCard),
+ ASCIIToUTF16(kMasterCard)
};
int expected_unique_ids[] = {
autofill_manager_->GetPackedCreditCardID(4),
@@ -1220,7 +1220,7 @@ TEST_F(AutofillManagerTest, GetCreditCardSuggestionsMatchCharacter) {
base::string16 expected_values[] = {ASCIIToUTF16("************3456")};
base::string16 expected_labels[] = {ASCIIToUTF16("*3456")};
- base::string16 expected_icons[] = {ASCIIToUTF16("visaCC")};
+ base::string16 expected_icons[] = {ASCIIToUTF16(kVisaCard)};
int expected_unique_ids[] = {autofill_manager_->GetPackedCreditCardID(4)};
ExpectSuggestions(page_id, values, labels, icons, unique_ids,
kDefaultPageID, arraysize(expected_values), expected_values,
@@ -1259,8 +1259,8 @@ TEST_F(AutofillManagerTest, GetCreditCardSuggestionsNonCCNumber) {
base::string16 expected_labels[] = { ASCIIToUTF16("*3456"),
ASCIIToUTF16("*8765") };
base::string16 expected_icons[] = {
- ASCIIToUTF16("visaCC"),
- ASCIIToUTF16("genericCC")
+ ASCIIToUTF16(kVisaCard),
+ ASCIIToUTF16(kMasterCard)
};
int expected_unique_ids[] = {
autofill_manager_->GetPackedCreditCardID(4),
@@ -1383,9 +1383,9 @@ TEST_F(AutofillManagerTest, GetCreditCardSuggestionsRepeatedObfuscatedNumber) {
ASCIIToUTF16("*3456"),
};
base::string16 expected_icons[] = {
- ASCIIToUTF16("visaCC"),
- ASCIIToUTF16("genericCC"),
- ASCIIToUTF16("masterCardCC")
+ ASCIIToUTF16(kVisaCard),
+ ASCIIToUTF16(kMasterCard),
+ ASCIIToUTF16(kMasterCard)
};
int expected_unique_ids[] = {
autofill_manager_->GetPackedCreditCardID(4),
@@ -1456,8 +1456,8 @@ TEST_F(AutofillManagerTest, GetAddressAndCreditCardSuggestions) {
base::string16 expected_labels2[] = { ASCIIToUTF16("*3456"),
ASCIIToUTF16("*8765")};
base::string16 expected_icons2[] = {
- ASCIIToUTF16("visaCC"),
- ASCIIToUTF16("genericCC")
+ ASCIIToUTF16(kVisaCard),
+ ASCIIToUTF16(kMasterCard)
};
int expected_unique_ids2[] = {
autofill_manager_->GetPackedCreditCardID(4),
diff --git a/components/autofill/core/browser/credit_card.cc b/components/autofill/core/browser/credit_card.cc
index 1258794..ea41214 100644
--- a/components/autofill/core/browser/credit_card.cc
+++ b/components/autofill/core/browser/credit_card.cc
@@ -151,8 +151,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);
@@ -174,8 +172,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;
@@ -187,85 +183,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;
}
@@ -698,7 +692,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
diff --git a/components/autofill/core/browser/credit_card.h b/components/autofill/core/browser/credit_card.h
index 9da67f8..98ab9e03 100644
--- a/components/autofill/core/browser/credit_card.h
+++ b/components/autofill/core/browser/credit_card.h
@@ -37,7 +37,13 @@ class CreditCard : public AutofillDataModel {
// The ResourceBundle ID for the appropriate credit card image.
static int IconResourceId(const std::string& type);
- // The internal representation of credit card type.
+ // Returns the internal representation of credit card type corresponding to
+ // the given |number|. The credit card type is determined purely according to
+ // the Issuer Identification Number (IIN), a.k.a. the "Bank Identification
+ // Number (BIN)", which is parsed from the relevant prefix of the |number|.
+ // This function performs no additional validation checks on the |number|.
+ // Hence, the returned type for both the valid card "4111-1111-1111-1111" and
+ // the invalid card "4garbage" will be Visa, which has an IIN of 4.
static std::string GetCreditCardType(const base::string16& number);
// FormGroup:
@@ -159,7 +165,6 @@ extern const char* const kDiscoverCard;
extern const char* const kGenericCard;
extern const char* const kJCBCard;
extern const char* const kMasterCard;
-extern const char* const kSoloCard;
extern const char* const kVisaCard;
} // namespace autofill
diff --git a/components/autofill/core/browser/credit_card_unittest.cc b/components/autofill/core/browser/credit_card_unittest.cc
index d40aa36..b92488d 100644
--- a/components/autofill/core/browser/credit_card_unittest.cc
+++ b/components/autofill/core/browser/credit_card_unittest.cc
@@ -7,6 +7,7 @@
#include "base/strings/utf_string_conversions.h"
#include "components/autofill/core/browser/autofill_common_test.h"
#include "components/autofill/core/browser/credit_card.h"
+#include "components/autofill/core/browser/validation.h"
#include "components/autofill/core/common/form_field_data.h"
#include "grit/webkit_resources.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -292,7 +293,8 @@ TEST(CreditCardTest, InvalidMastercardNumber) {
test::SetCreditCardInfo(&card, "Baby Face Nelson",
"5200000000000004", "01", "2010");
- EXPECT_EQ("genericCC", card.type());
+ EXPECT_EQ(kMasterCard, card.type());
+ EXPECT_FALSE(card.IsComplete());
}
// Verify that we preserve exactly what the user typed for credit card numbers.
@@ -509,4 +511,165 @@ TEST(CreditCardTest, CreditCardTypeSelectControl) {
}
}
+TEST(CreditCardTest, GetCreditCardType) {
+ struct {
+ std::string card_number;
+ std::string type;
+ bool is_valid;
+ } test_cases[] = {
+ // The relevant sample numbers from
+ // http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
+ { "378282246310005", kAmericanExpressCard, true },
+ { "371449635398431", kAmericanExpressCard, true },
+ { "378734493671000", kAmericanExpressCard, true },
+ { "30569309025904", kDinersCard, true },
+ { "38520000023237", kDinersCard, true },
+ { "6011111111111117", kDiscoverCard, true },
+ { "6011000990139424", kDiscoverCard, true },
+ { "3530111333300000", kJCBCard, true },
+ { "3566002020360505", kJCBCard, true },
+ { "5555555555554444", kMasterCard, true },
+ { "5105105105105100", kMasterCard, true },
+ { "4111111111111111", kVisaCard, true },
+ { "4012888888881881", kVisaCard, true },
+ { "4222222222222", kVisaCard, true },
+
+ // The relevant sample numbers from
+ // http://auricsystems.com/support-center/sample-credit-card-numbers/
+ { "343434343434343", kAmericanExpressCard, true },
+ { "371144371144376", kAmericanExpressCard, true },
+ { "341134113411347", kAmericanExpressCard, true },
+ { "36438936438936", kDinersCard, true },
+ { "36110361103612", kDinersCard, true },
+ { "36111111111111", kDinersCard, true },
+ { "6011016011016011", kDiscoverCard, true },
+ { "6011000990139424", kDiscoverCard, true },
+ { "6011000000000004", kDiscoverCard, true },
+ { "6011000995500000", kDiscoverCard, true },
+ { "6500000000000002", kDiscoverCard, true },
+ { "3566002020360505", kJCBCard, true },
+ { "3528000000000007", kJCBCard, true },
+ { "5500005555555559", kMasterCard, true },
+ { "5555555555555557", kMasterCard, true },
+ { "5454545454545454", kMasterCard, true },
+ { "5555515555555551", kMasterCard, true },
+ { "5405222222222226", kMasterCard, true },
+ { "5478050000000007", kMasterCard, true },
+ { "5111005111051128", kMasterCard, true },
+ { "5112345112345114", kMasterCard, true },
+ { "5115915115915118", kMasterCard, true },
+
+ // Empty string
+ { std::string(), kGenericCard, false },
+
+ // Non-numeric
+ { "garbage", kGenericCard, false },
+ { "4garbage", kVisaCard, false },
+
+ // Fails Luhn check.
+ { "4111111111111112", kVisaCard, false },
+
+ // Invalid length.
+ { "3434343434343434", kAmericanExpressCard, false },
+ { "411111111111116", kVisaCard, false },
+
+ // Issuer Identification Numbers (IINs) that Chrome recognizes.
+ { "4", kVisaCard, false },
+ { "34", kAmericanExpressCard, false },
+ { "37", kAmericanExpressCard, false },
+ { "300", kDinersCard, false },
+ { "301", kDinersCard, false },
+ { "302", kDinersCard, false },
+ { "303", kDinersCard, false },
+ { "304", kDinersCard, false },
+ { "305", kDinersCard, false },
+ { "3095", kDinersCard, false },
+ { "36", kDinersCard, false },
+ { "38", kDinersCard, false },
+ { "39", kDinersCard, false },
+ { "6011", kDiscoverCard, false },
+ { "644", kDiscoverCard, false },
+ { "645", kDiscoverCard, false },
+ { "646", kDiscoverCard, false },
+ { "647", kDiscoverCard, false },
+ { "648", kDiscoverCard, false },
+ { "649", kDiscoverCard, false },
+ { "65", kDiscoverCard, false },
+ { "3528", kJCBCard, false },
+ { "3531", kJCBCard, false },
+ { "3589", kJCBCard, false },
+ { "51", kMasterCard, false },
+ { "52", kMasterCard, false },
+ { "53", kMasterCard, false },
+ { "54", kMasterCard, false },
+ { "55", kMasterCard, false },
+
+ // Not enough data to determine an IIN uniquely.
+ { "3", kGenericCard, false },
+ { "30", kGenericCard, false },
+ { "309", kGenericCard, false },
+ { "35", kGenericCard, false },
+ { "5", kGenericCard, false },
+ { "6", kGenericCard, false },
+ { "60", kGenericCard, false },
+ { "601", kGenericCard, false },
+ { "64", kGenericCard, false },
+
+ // Unknown IINs.
+ { "0", kGenericCard, false },
+ { "1", kGenericCard, false },
+ { "2", kGenericCard, false },
+ { "306", kGenericCard, false },
+ { "307", kGenericCard, false },
+ { "308", kGenericCard, false },
+ { "3091", kGenericCard, false },
+ { "3094", kGenericCard, false },
+ { "3096", kGenericCard, false },
+ { "31", kGenericCard, false },
+ { "32", kGenericCard, false },
+ { "33", kGenericCard, false },
+ { "351", kGenericCard, false },
+ { "3527", kGenericCard, false },
+ { "359", kGenericCard, false },
+ { "50", kGenericCard, false },
+ { "56", kGenericCard, false },
+ { "57", kGenericCard, false },
+ { "58", kGenericCard, false },
+ { "59", kGenericCard, false },
+ { "600", kGenericCard, false },
+ { "602", kGenericCard, false },
+ { "603", kGenericCard, false },
+ { "604", kGenericCard, false },
+ { "605", kGenericCard, false },
+ { "606", kGenericCard, false },
+ { "607", kGenericCard, false },
+ { "608", kGenericCard, false },
+ { "609", kGenericCard, false },
+ { "61", kGenericCard, false },
+ { "62", kGenericCard, false },
+ { "63", kGenericCard, false },
+ { "640", kGenericCard, false },
+ { "641", kGenericCard, false },
+ { "642", kGenericCard, false },
+ { "643", kGenericCard, false },
+ { "66", kGenericCard, false },
+ { "67", kGenericCard, false },
+ { "68", kGenericCard, false },
+ { "69", kGenericCard, false },
+ { "7", kGenericCard, false },
+ { "8", kGenericCard, false },
+ { "9", kGenericCard, false },
+
+ // Oddball case: Unknown issuer, but valid Luhn check and plausible length.
+ { "7000700070007000", kGenericCard, true },
+ };
+
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
+ base::string16 card_number = ASCIIToUTF16(test_cases[i].card_number);
+ SCOPED_TRACE(card_number);
+ EXPECT_EQ(test_cases[i].type, CreditCard::GetCreditCardType(card_number));
+ EXPECT_EQ(test_cases[i].is_valid, IsValidCreditCardNumber(card_number));
+ }
+}
+
} // namespace autofill
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc
index 86d0322..aa39d8a 100644
--- a/components/autofill/core/browser/personal_data_manager_unittest.cc
+++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -2230,7 +2230,7 @@ TEST_F(PersonalDataManagerTest, GetNonEmptyTypes) {
base::MessageLoop::current()->Run();
personal_data_->GetNonEmptyTypes(&non_empty_types);
- EXPECT_EQ(25U, non_empty_types.size());
+ EXPECT_EQ(26U, non_empty_types.size());
EXPECT_TRUE(non_empty_types.count(NAME_FIRST));
EXPECT_TRUE(non_empty_types.count(NAME_MIDDLE));
EXPECT_TRUE(non_empty_types.count(NAME_MIDDLE_INITIAL));
@@ -2251,6 +2251,7 @@ TEST_F(PersonalDataManagerTest, GetNonEmptyTypes) {
EXPECT_TRUE(non_empty_types.count(PHONE_HOME_WHOLE_NUMBER));
EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_NAME));
EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_NUMBER));
+ EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_TYPE));
EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_EXP_MONTH));
EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_EXP_2_DIGIT_YEAR));
EXPECT_TRUE(non_empty_types.count(CREDIT_CARD_EXP_4_DIGIT_YEAR));
diff --git a/components/autofill/core/browser/validation.cc b/components/autofill/core/browser/validation.cc
index 139388f..5922b73 100644
--- a/components/autofill/core/browser/validation.cc
+++ b/components/autofill/core/browser/validation.cc
@@ -63,13 +63,24 @@ bool IsValidCreditCardNumber(const base::string16& text) {
base::string16 number = CreditCard::StripSeparators(text);
// Credit card numbers are at most 19 digits in length [1]. 12 digits seems to
- // be a fairly safe lower-bound [2].
+ // be a fairly safe lower-bound [2]. Specific card issuers have more rigidly
+ // defined sizes.
// [1] http://www.merriampark.com/anatomycc.htm
// [2] http://en.wikipedia.org/wiki/Bank_card_number
- const size_t kMinCreditCardDigits = 12;
- const size_t kMaxCreditCardDigits = 19;
- if (number.size() < kMinCreditCardDigits ||
- number.size() > kMaxCreditCardDigits)
+ const std::string type = CreditCard::GetCreditCardType(text);
+ if (type == kAmericanExpressCard && number.size() != 15)
+ return false;
+ if (type == kDinersCard && number.size() != 14)
+ return false;
+ if (type == kDiscoverCard && number.size() != 16)
+ return false;
+ if (type == kJCBCard && number.size() != 16)
+ return false;
+ if (type == kMasterCard && number.size() != 16)
+ return false;
+ if (type == kVisaCard && number.size() != 13 && number.size() != 16)
+ return false;
+ if (type == kGenericCard && (number.size() < 12 || number.size() > 19))
return false;
// Use the Luhn formula [3] to validate the number.
diff --git a/components/component_strings.grd b/components/component_strings.grd
index 3b1734d..367cad3 100644
--- a/components/component_strings.grd
+++ b/components/component_strings.grd
@@ -185,9 +185,6 @@
<message name="IDS_AUTOFILL_CC_MASTERCARD" desc="MasterCard credit card name.">
MasterCard
</message>
- <message name="IDS_AUTOFILL_CC_SOLO" desc="Solo debit card name.">
- Solo
- </message>
<message name="IDS_AUTOFILL_CC_VISA" desc="Visa credit card name.">
Visa
</message>