Commit fa818330 authored by jiahuiguo's avatar jiahuiguo Committed by Commit Bot

Add support for Brazil Elo card in autofill.

Some additionals:
- Changed Dinners Club and MIR bin range according to the lastest wiki.
- Changed out-of-date website links
- For credit_card_unittest, the upper limit for INSTANTIATE_TEST_CASE_P is 50 cases according to [1], so did not add more coverage for the numbers.

BUG=709551
TEST=components:components_unittests

Unrelated presubmit script errors:
owners.SyntaxErrorInOwnersFile: /usr/local/google/git/chrome/chromium/src/components/resources/OWNERS:24 syntax error: components/sync/OWNERS does not refer to an existing file.

NOPRESUBMIT=true

[1] https://cs.chromium.org/chromium/src/third_party/mesa/src/src/gtest/include/gtest/gtest-param-test.h?q=gtest-param-test.h+package:%5Echromium$&dr=C&l=1190

Review-Url: https://codereview.chromium.org/2906763005
Cr-Commit-Position: refs/heads/master@{#476334}
parent 2657632c
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2017 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:targetApi="21"
android:width="32dp"
android:height="20dp"
android:viewportWidth="128"
android:viewportHeight="80">
<path
android:pathData="M0,8C0,3.58 3.59,0 8.01,0L119.99,0C124.42,0 128,3.58 128,8L128,72C128,76.42 124.41,80 119.99,80L8.01,80C3.58,80 0,76.42 0,72L0,8Z"
android:strokeColor="#00000000"
android:fillColor="#E0E0E0"
android:strokeWidth="1"/>
<path
android:pathData="M4,8L4,72C4,74.21 5.79,76 8.01,76L119.99,76C122.2,76 124,74.21 124,72L124,8C124,5.79 122.21,4 119.99,4L8.01,4C5.8,4 4,5.79 4,8Z"
android:strokeColor="#00000000"
android:fillColor="#FFFFFF"
android:strokeWidth="1"/>
<path
android:pathData="M36,40C36,24.53 48.53,12 64,12C79.47,12 92,24.53 92,40C92,55.47 79.47,68 64,68C48.53,68 36,55.47 36,40"
android:strokeColor="#00000000"
android:fillColor="#000000"
android:strokeWidth="1"/>
<path
android:pathData="M55.48,43.4C54.61,44.25 53.44,44.77 52.13,44.75C51.24,44.73 50.41,44.47 49.71,44.02L47.97,46.8C49.16,47.55 50.57,48 52.09,48.02C54.3,48.06 56.31,47.19 57.77,45.75L55.48,43.4Z"
android:strokeColor="#00000000"
android:fillColor="#FFFFFF"
android:strokeWidth="1"/>
<path
android:pathData="M47.54,40.55C47.52,40.36 47.51,40.17 47.52,39.98C47.56,37.39 49.69,35.32 52.28,35.36C53.69,35.38 54.94,36.03 55.79,37.03L47.54,40.55ZM52.33,32.08C47.93,32.02 44.31,35.53 44.24,39.93C44.22,41.58 44.69,43.12 45.53,44.4L59.96,38.23C59.15,34.76 56.06,32.14 52.33,32.08L52.33,32.08Z"
android:strokeColor="#00000000"
android:fillColor="#FFFFFF"
android:strokeWidth="1"/>
<path
android:pathData="M64.49,28.49L64.49,43.88L67.16,44.99L65.9,48.02L63.26,46.92C62.66,46.67 62.26,46.28 61.96,45.83C61.66,45.38 61.45,44.76 61.45,43.92L61.45,28.49L64.49,28.49Z"
android:strokeColor="#00000000"
android:fillColor="#FFFFFF"
android:strokeWidth="1"/>
<path
android:pathData="M72.51,43.59L72.51,43.59C71.61,42.73 70.9,41.39 70.9,40.05C70.9,38.65 71.53,37.4 72.51,36.55C72.5,36.55 70.32,34.09 70.32,34.09C68.67,35.55 67.62,37.68 67.62,40.05C67.62,42.46 68.7,44.62 70.38,46.08L72.51,43.59"
android:strokeColor="#00000000"
android:fillColor="#00A6E0"
android:strokeWidth="1"/>
<path
android:pathData="M74.03,35.64C74.54,35.45 75.02,35.36 75.59,35.36C77.86,35.36 79.74,36.97 80.19,39.1L83.4,38.43C82.65,34.81 79.44,32.08 75.59,32.08C74.66,32.08 73.77,32.25 72.94,32.54L74.03,35.64C74.03,35.64 74.05,35.63 74.03,35.64"
android:strokeColor="#00000000"
android:fillColor="#FFF000"
android:strokeWidth="1"/>
<path
android:pathData="M75.59,44.74C74.96,44.74 74.06,44.48 74.06,44.48L73.02,47.59C73.83,47.87 74.69,48.02 75.59,48.02C79.48,48.02 82.72,45.24 83.42,41.55L80.19,40.94C79.78,43.11 77.88,44.74 75.59,44.74"
android:strokeColor="#00000000"
android:fillColor="#FF0217"
android:strokeWidth="1"/>
</vector>
\ No newline at end of file
...@@ -68,6 +68,7 @@ DECLARE_RESOURCE_ID(IDR_PAGEINFO_WARNING_MAJOR, R.drawable.pageinfo_warning) ...@@ -68,6 +68,7 @@ DECLARE_RESOURCE_ID(IDR_PAGEINFO_WARNING_MAJOR, R.drawable.pageinfo_warning)
LINK_RESOURCE_ID(IDR_AUTOFILL_CC_AMEX, R.drawable.amex_card) LINK_RESOURCE_ID(IDR_AUTOFILL_CC_AMEX, R.drawable.amex_card)
LINK_RESOURCE_ID(IDR_AUTOFILL_CC_DINERS, R.drawable.diners_card) LINK_RESOURCE_ID(IDR_AUTOFILL_CC_DINERS, R.drawable.diners_card)
LINK_RESOURCE_ID(IDR_AUTOFILL_CC_DISCOVER, R.drawable.discover_card) LINK_RESOURCE_ID(IDR_AUTOFILL_CC_DISCOVER, R.drawable.discover_card)
LINK_RESOURCE_ID(IDR_AUTOFILL_CC_ELO, R.drawable.elo_card)
LINK_RESOURCE_ID(IDR_AUTOFILL_CC_GENERIC, R.drawable.ic_credit_card_black) LINK_RESOURCE_ID(IDR_AUTOFILL_CC_GENERIC, R.drawable.ic_credit_card_black)
LINK_RESOURCE_ID(IDR_AUTOFILL_CC_JCB, R.drawable.jcb_card) LINK_RESOURCE_ID(IDR_AUTOFILL_CC_JCB, R.drawable.jcb_card)
LINK_RESOURCE_ID(IDR_AUTOFILL_CC_MASTERCARD, R.drawable.mc_card) LINK_RESOURCE_ID(IDR_AUTOFILL_CC_MASTERCARD, R.drawable.mc_card)
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "chrome/browser/ui/autofill/autofill_popup_view.h" #include "chrome/browser/ui/autofill/autofill_popup_view.h"
#include "chrome/browser/ui/autofill/popup_constants.h" #include "chrome/browser/ui/autofill/popup_constants.h"
#include "components/autofill/core/browser/autofill_experiments.h" #include "components/autofill/core/browser/autofill_experiments.h"
#include "components/autofill/core/browser/credit_card.h"
#include "components/autofill/core/browser/popup_item_ids.h" #include "components/autofill/core/browser/popup_item_ids.h"
#include "components/autofill/core/browser/suggestion.h" #include "components/autofill/core/browser/suggestion.h"
#include "components/autofill/core/common/autofill_util.h" #include "components/autofill/core/common/autofill_util.h"
...@@ -49,15 +50,16 @@ const struct { ...@@ -49,15 +50,16 @@ const struct {
const char* name; const char* name;
int id; int id;
} kDataResources[] = { } kDataResources[] = {
{"americanExpressCC", IDR_AUTOFILL_CC_AMEX}, {autofill::kAmericanExpressCard, IDR_AUTOFILL_CC_AMEX},
{"dinersCC", IDR_AUTOFILL_CC_GENERIC}, {autofill::kDinersCard, IDR_AUTOFILL_CC_DINERS},
{"discoverCC", IDR_AUTOFILL_CC_DISCOVER}, {autofill::kDiscoverCard, IDR_AUTOFILL_CC_DISCOVER},
{"genericCC", IDR_AUTOFILL_CC_GENERIC}, {autofill::kEloCard, IDR_AUTOFILL_CC_ELO},
{"jcbCC", IDR_AUTOFILL_CC_GENERIC}, {autofill::kGenericCard, IDR_AUTOFILL_CC_GENERIC},
{"masterCardCC", IDR_AUTOFILL_CC_MASTERCARD}, {autofill::kJCBCard, IDR_AUTOFILL_CC_JCB},
{"mirCC", IDR_AUTOFILL_CC_MIR}, {autofill::kMasterCard, IDR_AUTOFILL_CC_MASTERCARD},
{"unionPayCC", IDR_AUTOFILL_CC_UNIONPAY}, {autofill::kMirCard, IDR_AUTOFILL_CC_MIR},
{"visaCC", IDR_AUTOFILL_CC_VISA}, {autofill::kUnionPay, IDR_AUTOFILL_CC_UNIONPAY},
{autofill::kVisaCard, IDR_AUTOFILL_CC_VISA},
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
{"httpWarning", IDR_AUTOFILL_HTTP_WARNING}, {"httpWarning", IDR_AUTOFILL_HTTP_WARNING},
{"httpsInvalid", IDR_AUTOFILL_HTTPS_INVALID_WARNING}, {"httpsInvalid", IDR_AUTOFILL_HTTPS_INVALID_WARNING},
......
...@@ -358,7 +358,7 @@ IN_PROC_BROWSER_TEST_F(PaymentRequestCreditCardEditorTest, ...@@ -358,7 +358,7 @@ IN_PROC_BROWSER_TEST_F(PaymentRequestCreditCardEditorTest,
autofill::CREDIT_CARD_NAME_FULL); autofill::CREDIT_CARD_NAME_FULL);
// In this test case, only "visa" and "mastercard" are supported, so entering // In this test case, only "visa" and "mastercard" are supported, so entering
// a MIR card will fail. // a MIR card will fail.
SetEditorTextfieldValue(base::ASCIIToUTF16("22222222invalidcard"), SetEditorTextfieldValue(base::ASCIIToUTF16("22002222invalidcard"),
autofill::CREDIT_CARD_NUMBER); autofill::CREDIT_CARD_NUMBER);
EXPECT_EQ(l10n_util::GetStringUTF16( EXPECT_EQ(l10n_util::GetStringUTF16(
IDS_PAYMENTS_VALIDATION_UNSUPPORTED_CREDIT_CARD_TYPE), IDS_PAYMENTS_VALIDATION_UNSUPPORTED_CREDIT_CARD_TYPE),
......
...@@ -33,6 +33,7 @@ const PaymentRequestData kPaymentRequestData[]{ ...@@ -33,6 +33,7 @@ const PaymentRequestData kPaymentRequestData[]{
IDS_AUTOFILL_CC_DINERS}, IDS_AUTOFILL_CC_DINERS},
{autofill::kDiscoverCard, "discover", IDR_AUTOFILL_CC_DISCOVER, {autofill::kDiscoverCard, "discover", IDR_AUTOFILL_CC_DISCOVER,
IDS_AUTOFILL_CC_DISCOVER}, IDS_AUTOFILL_CC_DISCOVER},
{autofill::kEloCard, "elo", IDR_AUTOFILL_CC_ELO, IDS_AUTOFILL_CC_ELO},
{autofill::kJCBCard, "jcb", IDR_AUTOFILL_CC_JCB, IDS_AUTOFILL_CC_JCB}, {autofill::kJCBCard, "jcb", IDR_AUTOFILL_CC_JCB, IDS_AUTOFILL_CC_JCB},
{autofill::kMasterCard, "mastercard", IDR_AUTOFILL_CC_MASTERCARD, {autofill::kMasterCard, "mastercard", IDR_AUTOFILL_CC_MASTERCARD,
IDS_AUTOFILL_CC_MASTERCARD}, IDS_AUTOFILL_CC_MASTERCARD},
......
...@@ -79,6 +79,8 @@ base::string16 NetworkForFill(const std::string& network) { ...@@ -79,6 +79,8 @@ base::string16 NetworkForFill(const std::string& network) {
return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DINERS); return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DINERS);
if (network == kDiscoverCard) if (network == kDiscoverCard)
return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DISCOVER); return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DISCOVER);
if (network == kEloCard)
return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_ELO);
if (network == kJCBCard) if (network == kJCBCard)
return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_JCB); return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_JCB);
if (network == kMasterCard) if (network == kMasterCard)
...@@ -146,6 +148,8 @@ int CreditCard::IconResourceId(const std::string& network) { ...@@ -146,6 +148,8 @@ int CreditCard::IconResourceId(const std::string& network) {
return IDR_AUTOFILL_CC_DINERS; return IDR_AUTOFILL_CC_DINERS;
if (network == kDiscoverCard) if (network == kDiscoverCard)
return IDR_AUTOFILL_CC_DISCOVER; return IDR_AUTOFILL_CC_DISCOVER;
if (network == kEloCard)
return IDR_AUTOFILL_CC_ELO;
if (network == kJCBCard) if (network == kJCBCard)
return IDR_AUTOFILL_CC_JCB; return IDR_AUTOFILL_CC_JCB;
if (network == kMasterCard) if (network == kMasterCard)
...@@ -166,27 +170,24 @@ int CreditCard::IconResourceId(const std::string& network) { ...@@ -166,27 +170,24 @@ int CreditCard::IconResourceId(const std::string& network) {
// static // static
const char* CreditCard::GetCardNetwork(const base::string16& number) { const char* CreditCard::GetCardNetwork(const base::string16& number) {
// Credit card number specifications taken from: // Credit card number specifications taken from:
// http://en.wikipedia.org/wiki/Credit_card_numbers, // https://en.wikipedia.org/wiki/Payment_card_number,
// http://en.wikipedia.org/wiki/List_of_Issuer_Identification_Numbers,
// http://www.discovernetwork.com/merchants/images/Merchant_Marketing_PDF.pdf,
// http://www.regular-expressions.info/creditcard.html, // http://www.regular-expressions.info/creditcard.html,
// http://developer.ean.com/general_info/Valid_Credit_Card_Types, // https://developer.ean.com/general-info/valid-card-types,
// http://www.bincodes.com/, // http://www.bincodes.com/, and
// http://www.fraudpractice.com/FL-binCC.html, and // http://www.fraudpractice.com/FL-binCC.html.
// http://www.beachnet.com/~hstiles/cardtype.html // (Last updated: May 29, 2017)
// //
// The last site is currently unavailable, but a cached version remains at // Card Type Prefix(es) Length
// http://web.archive.org/web/20120923111349/http://www.beachnet.com/~hstiles/cardtype.html // --------------------------------------------------------------------------
// // Visa 4 13,16,19
// Card Type Prefix(es) Length // American Express 34,37 15
// --------------------------------------------------------------- // Diners Club 300-305,309,36,38-39 14
// Visa 4 13,16 // Discover Card 6011,644-649,65 16
// American Express 34,37 15 // Elo 431274,451416,5067,5090,627780,636297 16
// Diners Club 300-305,3095,36,38-39 14 // JCB 3528-3589 16
// Discover Card 6011,644-649,65 16 // Mastercard 2221-2720, 51-55 16
// JCB 3528-3589 16 // MIR 2200-2204 16
// Mastercard 51-55 16 // UnionPay 62 16-19
// UnionPay 62 16-19
// Check for prefixes of length 1. // Check for prefixes of length 1.
if (number.empty()) if (number.empty())
...@@ -203,9 +204,6 @@ const char* CreditCard::GetCardNetwork(const base::string16& number) { ...@@ -203,9 +204,6 @@ const char* CreditCard::GetCardNetwork(const base::string16& number) {
if (!base::StringToInt(number.substr(0, 2), &first_two_digits)) if (!base::StringToInt(number.substr(0, 2), &first_two_digits))
return kGenericCard; return kGenericCard;
if (first_two_digits == 22)
return kMirCard;
if (first_two_digits == 34 || first_two_digits == 37) if (first_two_digits == 34 || first_two_digits == 37)
return kAmericanExpressCard; return kAmericanExpressCard;
...@@ -231,7 +229,8 @@ const char* CreditCard::GetCardNetwork(const base::string16& number) { ...@@ -231,7 +229,8 @@ const char* CreditCard::GetCardNetwork(const base::string16& number) {
if (!base::StringToInt(number.substr(0, 3), &first_three_digits)) if (!base::StringToInt(number.substr(0, 3), &first_three_digits))
return kGenericCard; return kGenericCard;
if (first_three_digits >= 300 && first_three_digits <= 305) if ((first_three_digits >= 300 && first_three_digits <= 305) ||
first_three_digits == 309)
return kDinersCard; return kDinersCard;
if (first_three_digits >= 644 && first_three_digits <= 649) if (first_three_digits >= 644 && first_three_digits <= 649)
...@@ -245,15 +244,35 @@ const char* CreditCard::GetCardNetwork(const base::string16& number) { ...@@ -245,15 +244,35 @@ const char* CreditCard::GetCardNetwork(const base::string16& number) {
if (!base::StringToInt(number.substr(0, 4), &first_four_digits)) if (!base::StringToInt(number.substr(0, 4), &first_four_digits))
return kGenericCard; return kGenericCard;
if (first_four_digits == 3095) if (first_four_digits >= 2200 && first_four_digits <= 2204)
return kDinersCard; return kMirCard;
if (first_four_digits >= 2221 && first_four_digits <= 2720)
return kMasterCard;
if (first_four_digits >= 3528 && first_four_digits <= 3589) if (first_four_digits >= 3528 && first_four_digits <= 3589)
return kJCBCard; return kJCBCard;
if (first_four_digits == 5067 || first_four_digits == 5090)
return kEloCard;
if (first_four_digits == 6011) if (first_four_digits == 6011)
return kDiscoverCard; return kDiscoverCard;
// Check for prefixes of length 6.
if (number.size() < 6)
return kGenericCard;
int first_six_digits = 0;
if (!base::StringToInt(number.substr(0, 6), &first_six_digits))
return kGenericCard;
if (first_six_digits == 431274 ||
first_six_digits == 451416 ||
first_six_digits == 627780 ||
first_six_digits == 636297)
return kEloCard;
return kGenericCard; return kGenericCard;
} }
...@@ -930,12 +949,10 @@ std::ostream& operator<<(std::ostream& os, const CreditCard& credit_card) { ...@@ -930,12 +949,10 @@ std::ostream& operator<<(std::ostream& os, const CreditCard& credit_card) {
credit_card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)); credit_card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
} }
// These values must match the values in WebKitPlatformSupportImpl in
// webkit/glue. We send these strings to WebKit, which then asks
// WebKitPlatformSupportImpl to load the image data.
const char kAmericanExpressCard[] = "americanExpressCC"; const char kAmericanExpressCard[] = "americanExpressCC";
const char kDinersCard[] = "dinersCC"; const char kDinersCard[] = "dinersCC";
const char kDiscoverCard[] = "discoverCC"; const char kDiscoverCard[] = "discoverCC";
const char kEloCard[] = "eloCC";
const char kGenericCard[] = "genericCC"; const char kGenericCard[] = "genericCC";
const char kJCBCard[] = "jcbCC"; const char kJCBCard[] = "jcbCC";
const char kMasterCard[] = "masterCardCC"; const char kMasterCard[] = "masterCardCC";
......
...@@ -272,6 +272,7 @@ std::ostream& operator<<(std::ostream& os, const CreditCard& credit_card); ...@@ -272,6 +272,7 @@ std::ostream& operator<<(std::ostream& os, const CreditCard& credit_card);
extern const char kAmericanExpressCard[]; extern const char kAmericanExpressCard[];
extern const char kDinersCard[]; extern const char kDinersCard[];
extern const char kDiscoverCard[]; extern const char kDiscoverCard[];
extern const char kEloCard[];
extern const char kGenericCard[]; extern const char kGenericCard[];
extern const char kJCBCard[]; extern const char kJCBCard[];
extern const char kMasterCard[]; extern const char kMasterCard[];
......
...@@ -53,7 +53,10 @@ const char* const kValidNumbers[] = { ...@@ -53,7 +53,10 @@ const char* const kValidNumbers[] = {
"5019717010103742", "5019717010103742",
"6331101999990016", "6331101999990016",
"6247130048162403", "6247130048162403",
"4532261615476013542",
"6362970000457013",
}; };
const char* const kInvalidNumbers[] = { const char* const kInvalidNumbers[] = {
"4111 1111 112", /* too short */ "4111 1111 112", /* too short */
"41111111111111111115", /* too long */ "41111111111111111115", /* too long */
...@@ -407,9 +410,6 @@ TEST(CreditCardTest, Compare) { ...@@ -407,9 +410,6 @@ TEST(CreditCardTest, Compare) {
EXPECT_LT(0, b.Compare(a)); EXPECT_LT(0, b.Compare(a));
} }
// This method is not compiled for iOS because these resources are not used and
// should not be shipped.
#if !defined(OS_IOS)
// Test we get the correct icon for each card type. // Test we get the correct icon for each card type.
TEST(CreditCardTest, IconResourceId) { TEST(CreditCardTest, IconResourceId) {
EXPECT_EQ(IDR_AUTOFILL_CC_AMEX, EXPECT_EQ(IDR_AUTOFILL_CC_AMEX,
...@@ -418,6 +418,8 @@ TEST(CreditCardTest, IconResourceId) { ...@@ -418,6 +418,8 @@ TEST(CreditCardTest, IconResourceId) {
CreditCard::IconResourceId(kDinersCard)); CreditCard::IconResourceId(kDinersCard));
EXPECT_EQ(IDR_AUTOFILL_CC_DISCOVER, EXPECT_EQ(IDR_AUTOFILL_CC_DISCOVER,
CreditCard::IconResourceId(kDiscoverCard)); CreditCard::IconResourceId(kDiscoverCard));
EXPECT_EQ(IDR_AUTOFILL_CC_ELO,
CreditCard::IconResourceId(kEloCard));
EXPECT_EQ(IDR_AUTOFILL_CC_JCB, EXPECT_EQ(IDR_AUTOFILL_CC_JCB,
CreditCard::IconResourceId(kJCBCard)); CreditCard::IconResourceId(kJCBCard));
EXPECT_EQ(IDR_AUTOFILL_CC_MASTERCARD, EXPECT_EQ(IDR_AUTOFILL_CC_MASTERCARD,
...@@ -429,7 +431,6 @@ TEST(CreditCardTest, IconResourceId) { ...@@ -429,7 +431,6 @@ TEST(CreditCardTest, IconResourceId) {
EXPECT_EQ(IDR_AUTOFILL_CC_VISA, EXPECT_EQ(IDR_AUTOFILL_CC_VISA,
CreditCard::IconResourceId(kVisaCard)); CreditCard::IconResourceId(kVisaCard));
} }
#endif // #if !defined(OS_IOS)
TEST(CreditCardTest, UpdateFromImportedCard) { TEST(CreditCardTest, UpdateFromImportedCard) {
CreditCard original_card(base::GenerateGUID(), "https://www.example.com"); CreditCard original_card(base::GenerateGUID(), "https://www.example.com");
...@@ -687,6 +688,7 @@ INSTANTIATE_TEST_CASE_P( ...@@ -687,6 +688,7 @@ INSTANTIATE_TEST_CASE_P(
GetCardNetworkTestCase{"4111111111111111", kVisaCard, true}, GetCardNetworkTestCase{"4111111111111111", kVisaCard, true},
GetCardNetworkTestCase{"4012888888881881", kVisaCard, true}, GetCardNetworkTestCase{"4012888888881881", kVisaCard, true},
GetCardNetworkTestCase{"4222222222222", kVisaCard, true}, GetCardNetworkTestCase{"4222222222222", kVisaCard, true},
GetCardNetworkTestCase{"4532261615476013542", kVisaCard, true},
// The relevant sample numbers from // The relevant sample numbers from
// https://www.auricsystems.com/sample-credit-card-numbers/ // https://www.auricsystems.com/sample-credit-card-numbers/
...@@ -703,13 +705,12 @@ INSTANTIATE_TEST_CASE_P( ...@@ -703,13 +705,12 @@ INSTANTIATE_TEST_CASE_P(
GetCardNetworkTestCase{"6500000000000002", kDiscoverCard, true}, GetCardNetworkTestCase{"6500000000000002", kDiscoverCard, true},
GetCardNetworkTestCase{"3566002020360505", kJCBCard, true}, GetCardNetworkTestCase{"3566002020360505", kJCBCard, true},
GetCardNetworkTestCase{"3528000000000007", kJCBCard, true}, GetCardNetworkTestCase{"3528000000000007", kJCBCard, true},
GetCardNetworkTestCase{"2222400061240016", kMasterCard, true},
GetCardNetworkTestCase{"2223000048400011", kMasterCard, true},
GetCardNetworkTestCase{"5500005555555559", kMasterCard, true}, GetCardNetworkTestCase{"5500005555555559", kMasterCard, true},
GetCardNetworkTestCase{"5555555555555557", kMasterCard, true}, GetCardNetworkTestCase{"5555555555555557", kMasterCard, true},
GetCardNetworkTestCase{"5454545454545454", kMasterCard, true}, GetCardNetworkTestCase{"5454545454545454", kMasterCard, true},
GetCardNetworkTestCase{"5555515555555551", kMasterCard, true},
GetCardNetworkTestCase{"5405222222222226", kMasterCard, true},
GetCardNetworkTestCase{"5478050000000007", kMasterCard, true}, GetCardNetworkTestCase{"5478050000000007", kMasterCard, true},
GetCardNetworkTestCase{"5111005111051128", kMasterCard, true},
GetCardNetworkTestCase{"5112345112345114", kMasterCard, true}, GetCardNetworkTestCase{"5112345112345114", kMasterCard, true},
GetCardNetworkTestCase{"5115915115915118", kMasterCard, true}, GetCardNetworkTestCase{"5115915115915118", kMasterCard, true},
GetCardNetworkTestCase{"6247130048162403", kUnionPay, true}, GetCardNetworkTestCase{"6247130048162403", kUnionPay, true},
...@@ -719,6 +720,12 @@ INSTANTIATE_TEST_CASE_P( ...@@ -719,6 +720,12 @@ INSTANTIATE_TEST_CASE_P(
GetCardNetworkTestCase{"2200111234567898", kMirCard, true}, GetCardNetworkTestCase{"2200111234567898", kMirCard, true},
GetCardNetworkTestCase{"2200481349288130", kMirCard, true}, GetCardNetworkTestCase{"2200481349288130", kMirCard, true},
// The relevant sample numbers from
// https://www.bincodes.com/bank-creditcard-generator/ and
// https://www.ebanx.com/business/en/developers/integrations/testing/credit-card-test-numbers
GetCardNetworkTestCase{"5067001446391275", kEloCard, true},
GetCardNetworkTestCase{"6362970000457013", kEloCard, true},
// Empty string // Empty string
GetCardNetworkTestCase{std::string(), kGenericCard, false}, GetCardNetworkTestCase{std::string(), kGenericCard, false},
...@@ -753,7 +760,11 @@ INSTANTIATE_TEST_CASE_P( ...@@ -753,7 +760,11 @@ INSTANTIATE_TEST_CASE_P(
// Issuer Identification Numbers (IINs) that Chrome recognizes. // Issuer Identification Numbers (IINs) that Chrome recognizes.
GetCardNetworkTestCase{"4", kVisaCard, false}, GetCardNetworkTestCase{"4", kVisaCard, false},
GetCardNetworkTestCase{"22", kMirCard, false}, GetCardNetworkTestCase{"2200", kMirCard, false},
GetCardNetworkTestCase{"2202", kMirCard, false},
GetCardNetworkTestCase{"2204", kMirCard, false},
GetCardNetworkTestCase{"2221", kMasterCard, false},
GetCardNetworkTestCase{"2720", kMasterCard, false},
GetCardNetworkTestCase{"34", kAmericanExpressCard, false}, GetCardNetworkTestCase{"34", kAmericanExpressCard, false},
GetCardNetworkTestCase{"37", kAmericanExpressCard, false}, GetCardNetworkTestCase{"37", kAmericanExpressCard, false},
GetCardNetworkTestCase{"300", kDinersCard, false}, GetCardNetworkTestCase{"300", kDinersCard, false},
...@@ -762,7 +773,7 @@ INSTANTIATE_TEST_CASE_P( ...@@ -762,7 +773,7 @@ INSTANTIATE_TEST_CASE_P(
GetCardNetworkTestCase{"303", kDinersCard, false}, GetCardNetworkTestCase{"303", kDinersCard, false},
GetCardNetworkTestCase{"304", kDinersCard, false}, GetCardNetworkTestCase{"304", kDinersCard, false},
GetCardNetworkTestCase{"305", kDinersCard, false}, GetCardNetworkTestCase{"305", kDinersCard, false},
GetCardNetworkTestCase{"3095", kDinersCard, false}, GetCardNetworkTestCase{"309", kDinersCard, false},
GetCardNetworkTestCase{"36", kDinersCard, false}, GetCardNetworkTestCase{"36", kDinersCard, false},
GetCardNetworkTestCase{"38", kDinersCard, false}, GetCardNetworkTestCase{"38", kDinersCard, false},
GetCardNetworkTestCase{"39", kDinersCard, false}, GetCardNetworkTestCase{"39", kDinersCard, false},
...@@ -774,6 +785,9 @@ INSTANTIATE_TEST_CASE_P( ...@@ -774,6 +785,9 @@ INSTANTIATE_TEST_CASE_P(
GetCardNetworkTestCase{"648", kDiscoverCard, false}, GetCardNetworkTestCase{"648", kDiscoverCard, false},
GetCardNetworkTestCase{"649", kDiscoverCard, false}, GetCardNetworkTestCase{"649", kDiscoverCard, false},
GetCardNetworkTestCase{"65", kDiscoverCard, false}, GetCardNetworkTestCase{"65", kDiscoverCard, false},
GetCardNetworkTestCase{"5067", kEloCard, false},
GetCardNetworkTestCase{"5090", kEloCard, false},
GetCardNetworkTestCase{"636297", kEloCard, false},
GetCardNetworkTestCase{"3528", kJCBCard, false}, GetCardNetworkTestCase{"3528", kJCBCard, false},
GetCardNetworkTestCase{"3531", kJCBCard, false}, GetCardNetworkTestCase{"3531", kJCBCard, false},
GetCardNetworkTestCase{"3589", kJCBCard, false}, GetCardNetworkTestCase{"3589", kJCBCard, false},
...@@ -788,7 +802,6 @@ INSTANTIATE_TEST_CASE_P( ...@@ -788,7 +802,6 @@ INSTANTIATE_TEST_CASE_P(
GetCardNetworkTestCase{"2", kGenericCard, false}, GetCardNetworkTestCase{"2", kGenericCard, false},
GetCardNetworkTestCase{"3", kGenericCard, false}, GetCardNetworkTestCase{"3", kGenericCard, false},
GetCardNetworkTestCase{"30", kGenericCard, false}, GetCardNetworkTestCase{"30", kGenericCard, false},
GetCardNetworkTestCase{"309", kGenericCard, false},
GetCardNetworkTestCase{"35", kGenericCard, false}, GetCardNetworkTestCase{"35", kGenericCard, false},
GetCardNetworkTestCase{"5", kGenericCard, false}, GetCardNetworkTestCase{"5", kGenericCard, false},
GetCardNetworkTestCase{"6", kGenericCard, false}, GetCardNetworkTestCase{"6", kGenericCard, false},
...@@ -817,9 +830,6 @@ INSTANTIATE_TEST_CASE_P( ...@@ -817,9 +830,6 @@ INSTANTIATE_TEST_CASE_P(
GetCardNetworkTestCase{"306", kGenericCard, false}, GetCardNetworkTestCase{"306", kGenericCard, false},
GetCardNetworkTestCase{"307", kGenericCard, false}, GetCardNetworkTestCase{"307", kGenericCard, false},
GetCardNetworkTestCase{"308", kGenericCard, false}, GetCardNetworkTestCase{"308", kGenericCard, false},
GetCardNetworkTestCase{"3091", kGenericCard, false},
GetCardNetworkTestCase{"3094", kGenericCard, false},
GetCardNetworkTestCase{"3096", kGenericCard, false},
GetCardNetworkTestCase{"31", kGenericCard, false}, GetCardNetworkTestCase{"31", kGenericCard, false},
GetCardNetworkTestCase{"32", kGenericCard, false}, GetCardNetworkTestCase{"32", kGenericCard, false},
GetCardNetworkTestCase{"33", kGenericCard, false}, GetCardNetworkTestCase{"33", kGenericCard, false},
......
...@@ -46,11 +46,11 @@ bool IsValidCreditCardExpirationDate(int year, ...@@ -46,11 +46,11 @@ bool IsValidCreditCardExpirationDate(int year,
bool IsValidCreditCardNumber(const base::string16& text) { bool IsValidCreditCardNumber(const base::string16& text) {
base::string16 number = CreditCard::StripSeparators(text); base::string16 number = CreditCard::StripSeparators(text);
// Credit card numbers are at most 19 digits in length [1]. 12 digits seems to // Credit card numbers are at most 19 digits in length, 12 digits seems to
// be a fairly safe lower-bound [2]. Specific card issuers have more rigidly // be a fairly safe lower-bound [1]. Specific card issuers have more rigidly
// defined sizes. // defined sizes.
// [1] http://www.merriampark.com/anatomycc.htm // (Last updated: May 29, 2017)
// [2] http://en.wikipedia.org/wiki/Bank_card_number // [1] https://en.wikipedia.org/wiki/Payment_card_number.
// CardEditor.isCardNumberLengthMaxium() needs to be kept in sync. // CardEditor.isCardNumberLengthMaxium() needs to be kept in sync.
const char* const type = CreditCard::GetCardNetwork(text); const char* const type = CreditCard::GetCardNetwork(text);
if (type == kAmericanExpressCard && number.size() != 15) if (type == kAmericanExpressCard && number.size() != 15)
...@@ -59,6 +59,8 @@ bool IsValidCreditCardNumber(const base::string16& text) { ...@@ -59,6 +59,8 @@ bool IsValidCreditCardNumber(const base::string16& text) {
return false; return false;
if (type == kDiscoverCard && number.size() != 16) if (type == kDiscoverCard && number.size() != 16)
return false; return false;
if (type == kEloCard && number.size() != 16)
return false;
if (type == kJCBCard && number.size() != 16) if (type == kJCBCard && number.size() != 16)
return false; return false;
if (type == kMasterCard && number.size() != 16) if (type == kMasterCard && number.size() != 16)
...@@ -67,7 +69,8 @@ bool IsValidCreditCardNumber(const base::string16& text) { ...@@ -67,7 +69,8 @@ bool IsValidCreditCardNumber(const base::string16& text) {
return false; return false;
if (type == kUnionPay && (number.size() < 16 || number.size() > 19)) if (type == kUnionPay && (number.size() < 16 || number.size() > 19))
return false; return false;
if (type == kVisaCard && number.size() != 13 && number.size() != 16) if (type == kVisaCard && number.size() != 13 && number.size() != 16 &&
number.size() != 19)
return false; return false;
if (type == kGenericCard && (number.size() < 12 || number.size() > 19)) if (type == kGenericCard && (number.size() < 12 || number.size() > 19))
return false; return false;
......
...@@ -56,6 +56,8 @@ const char* const kValidNumbers[] = { ...@@ -56,6 +56,8 @@ const char* const kValidNumbers[] = {
"5019717010103742", "5019717010103742",
"6331101999990016", "6331101999990016",
"6247130048162403", "6247130048162403",
"4532261615476013542", // Visa, 19 digits.
"6362970000457013", // Elo
}; };
const char* const kInvalidNumbers[] = { const char* const kInvalidNumbers[] = {
"4111 1111 112", /* too short */ "4111 1111 112", /* too short */
...@@ -346,7 +348,7 @@ TEST_P(AutofillCCNumberValidationTest, IsValidCreditCardNumber) { ...@@ -346,7 +348,7 @@ TEST_P(AutofillCCNumberValidationTest, IsValidCreditCardNumber) {
} }
const static std::set<std::string> kAllBasicCardNetworks{ const static std::set<std::string> kAllBasicCardNetworks{
"amex", "discover", "diners", "jcb", "amex", "discover", "diners", "elo", "jcb",
"mastercard", "mir", "unionpay", "visa"}; "mastercard", "mir", "unionpay", "visa"};
INSTANTIATE_TEST_CASE_P( INSTANTIATE_TEST_CASE_P(
...@@ -384,6 +386,8 @@ INSTANTIATE_TEST_CASE_P( ...@@ -384,6 +386,8 @@ INSTANTIATE_TEST_CASE_P(
IDS_PAYMENTS_VALIDATION_UNSUPPORTED_CREDIT_CARD_TYPE), IDS_PAYMENTS_VALIDATION_UNSUPPORTED_CREDIT_CARD_TYPE),
CCNumberCase(kValidNumbers[17], kAllBasicCardNetworks, true, 0), CCNumberCase(kValidNumbers[17], kAllBasicCardNetworks, true, 0),
CCNumberCase(kValidNumbers[18], kAllBasicCardNetworks, true, 0),
CCNumberCase(kValidNumbers[19], kAllBasicCardNetworks, true, 0),
CCNumberCase(kInvalidNumbers[0], CCNumberCase(kInvalidNumbers[0],
kAllBasicCardNetworks, kAllBasicCardNetworks,
...@@ -436,6 +440,7 @@ INSTANTIATE_TEST_CASE_P( ...@@ -436,6 +440,7 @@ INSTANTIATE_TEST_CASE_P(
GetCvcLengthForCardTypeCase{kAmericanExpressCard, AMEX_CVC_LENGTH}, GetCvcLengthForCardTypeCase{kAmericanExpressCard, AMEX_CVC_LENGTH},
GetCvcLengthForCardTypeCase{kDinersCard, GENERAL_CVC_LENGTH}, GetCvcLengthForCardTypeCase{kDinersCard, GENERAL_CVC_LENGTH},
GetCvcLengthForCardTypeCase{kDiscoverCard, GENERAL_CVC_LENGTH}, GetCvcLengthForCardTypeCase{kDiscoverCard, GENERAL_CVC_LENGTH},
GetCvcLengthForCardTypeCase{kEloCard, GENERAL_CVC_LENGTH},
GetCvcLengthForCardTypeCase{kGenericCard, GENERAL_CVC_LENGTH}, GetCvcLengthForCardTypeCase{kGenericCard, GENERAL_CVC_LENGTH},
GetCvcLengthForCardTypeCase{kJCBCard, GENERAL_CVC_LENGTH}, GetCvcLengthForCardTypeCase{kJCBCard, GENERAL_CVC_LENGTH},
GetCvcLengthForCardTypeCase{kMasterCard, GENERAL_CVC_LENGTH}, GetCvcLengthForCardTypeCase{kMasterCard, GENERAL_CVC_LENGTH},
......
...@@ -63,6 +63,9 @@ ...@@ -63,6 +63,9 @@
<message name="IDS_AUTOFILL_CC_DISCOVER" desc="Discover credit card name." formatter_data="android_java"> <message name="IDS_AUTOFILL_CC_DISCOVER" desc="Discover credit card name." formatter_data="android_java">
Discover Discover
</message> </message>
<message name="IDS_AUTOFILL_CC_ELO" desc="Elo credit card name." formatter_data="android_java">
Elo
</message>
<message name="IDS_AUTOFILL_CC_JCB" desc="JCB credit card name." formatter_data="android_java"> <message name="IDS_AUTOFILL_CC_JCB" desc="JCB credit card name." formatter_data="android_java">
JCB JCB
</message> </message>
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
<structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_AMEX" file="autofill/amex.png" /> <structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_AMEX" file="autofill/amex.png" />
<structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_DINERS" file="autofill/diners.png" /> <structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_DINERS" file="autofill/diners.png" />
<structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_DISCOVER" file="autofill/discover.png" /> <structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_DISCOVER" file="autofill/discover.png" />
<structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_ELO" file="autofill/elo.png" />
<structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_GENERIC" file="autofill/cc-generic.png" /> <structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_GENERIC" file="autofill/cc-generic.png" />
<structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_JCB" file="autofill/jcb.png" /> <structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_JCB" file="autofill/jcb.png" />
<structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_MASTERCARD" file="autofill/mastercard.png" /> <structure type="chrome_scaled_image" name="IDR_AUTOFILL_CC_MASTERCARD" file="autofill/mastercard.png" />
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment