Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Side by Side Diff: components/autofill/browser/credit_card.cc

Issue 16254010: [Autofill] Update credit card type detection logic. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix a typo Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/autofill/browser/credit_card.h" 5 #include "components/autofill/browser/credit_card.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <ostream> 9 #include <ostream>
10 #include <string> 10 #include <string>
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 if (type == kAmericanExpressCard) 143 if (type == kAmericanExpressCard)
144 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX); 144 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX);
145 if (type == kDinersCard) 145 if (type == kDinersCard)
146 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DINERS); 146 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DINERS);
147 if (type == kDiscoverCard) 147 if (type == kDiscoverCard)
148 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DISCOVER); 148 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DISCOVER);
149 if (type == kJCBCard) 149 if (type == kJCBCard)
150 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_JCB); 150 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_JCB);
151 if (type == kMasterCard) 151 if (type == kMasterCard)
152 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_MASTERCARD); 152 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_MASTERCARD);
153 if (type == kSoloCard)
154 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_SOLO);
155 if (type == kVisaCard) 153 if (type == kVisaCard)
156 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_VISA); 154 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_VISA);
157 155
158 // If you hit this DCHECK, the above list of cases needs to be updated to 156 // If you hit this DCHECK, the above list of cases needs to be updated to
159 // include a new card. 157 // include a new card.
160 DCHECK_EQ(kGenericCard, type); 158 DCHECK_EQ(kGenericCard, type);
161 return base::string16(); 159 return base::string16();
162 } 160 }
163 161
164 // static 162 // static
165 std::string CreditCard::GetCreditCardType(const base::string16& number) { 163 std::string CreditCard::GetCreditCardType(const base::string16& number) {
166 // Don't check for a specific type if this is not a credit card number. 164 // Don't check for a specific type if this is not a credit card number.
167 if (!autofill::IsValidCreditCardNumber(number)) 165 if (!autofill::IsValidCreditCardNumber(number))
168 return kGenericCard; 166 return kGenericCard;
benquan 2013/06/08 07:27:57 There are tons of card types, I think kGenericCard
Ilya Sherman 2013/06/18 03:37:38 Done.
169 167
170 // Credit card number specifications taken from: 168 // Credit card number specifications taken from:
171 // http://en.wikipedia.org/wiki/Credit_card_numbers and 169 // http://en.wikipedia.org/wiki/Credit_card_numbers,
170 // http://www.discovernetwork.com/merchants/images/Merchant_Marketing_PDF.pdf,
171 // http://www.regular-expressions.info/creditcard.html, and
172 // http://www.beachnet.com/~hstiles/cardtype.html 172 // http://www.beachnet.com/~hstiles/cardtype.html
benquan 2013/06/08 07:27:57 this link is dead, remove it?
Ilya Sherman 2013/06/18 03:37:38 I've kept the link, because it seems to be where t
173 //
173 // Card Type Prefix(es) Length 174 // Card Type Prefix(es) Length
174 // --------------------------------------------------------------- 175 // ---------------------------------------------------------------
175 // Visa 4 13,16 176 // Visa 4 13,16
176 // American Express 34,37 15 177 // American Express 34,37 15
177 // Diners Club 300-305,2014,2149,36, 14,15 178 // Diners Club 300-305,3095,36,38-39 14
178 // Discover Card 6011,65 16 179 // Discover Card 6011,65 16
179 // JCB 3 16 180 // JCB 3528-3589 16
180 // JCB 2131,1800 15
181 // MasterCard 51-55 16 181 // MasterCard 51-55 16
182 // Solo (debit card) 6334,6767 16,18,19
183 182
184 // We need at least 4 digits to work with. 183 // We need at least 4 digits to work with.
185 if (number.length() < 4) 184 if (number.length() < 4)
186 return kGenericCard; 185 return kGenericCard;
187 186
188 int first_four_digits = 0; 187 int first_four_digits = 0;
189 if (!base::StringToInt(number.substr(0, 4), &first_four_digits)) 188 if (!base::StringToInt(number.substr(0, 4), &first_four_digits))
190 return kGenericCard; 189 return kGenericCard;
191 190
192 int first_three_digits = first_four_digits / 10; 191 int first_three_digits = first_four_digits / 10;
193 int first_two_digits = first_three_digits / 10; 192 int first_two_digits = first_three_digits / 10;
194 int first_digit = first_two_digits / 10; 193 int first_digit = first_two_digits / 10;
195 194
196 switch (number.length()) { 195 switch (number.length()) {
197 case 13: 196 case 13:
198 if (first_digit == 4) 197 if (first_digit == 4)
199 return kVisaCard; 198 return kVisaCard;
200 199
201 break; 200 break;
201
202 case 14: 202 case 14:
203 if (first_three_digits >= 300 && first_three_digits <= 305) 203 if (first_three_digits >= 300 && first_three_digits <= 305)
204 return kDinersCard; 204 return kDinersCard;
205 205
206 if (first_digit == 36) 206 if (first_two_digits == 36)
207 return kDinersCard;
208
209 if (first_two_digits >= 38 && first_two_digits <= 39)
210 return kDinersCard;
211
212 if (first_four_digits == 3095)
207 return kDinersCard; 213 return kDinersCard;
208 214
209 break; 215 break;
216
210 case 15: 217 case 15:
211 if (first_two_digits == 34 || first_two_digits == 37) 218 if (first_two_digits == 34 || first_two_digits == 37)
212 return kAmericanExpressCard; 219 return kAmericanExpressCard;
213 220
214 if (first_four_digits == 2131 || first_four_digits == 1800) 221 break;
215 return kJCBCard;
216 222
217 if (first_four_digits == 2014 || first_four_digits == 2149)
218 return kDinersCard;
219
220 break;
221 case 16: 223 case 16:
222 if (first_four_digits == 6011 || first_two_digits == 65) 224 if (first_four_digits == 6011 || first_two_digits == 65)
223 return kDiscoverCard; 225 return kDiscoverCard;
224 226
225 if (first_four_digits == 6334 || first_four_digits == 6767) 227 if (first_three_digits >= 644 && first_three_digits <= 649)
226 return kSoloCard; 228 return kDiscoverCard;
227 229
228 if (first_two_digits >= 51 && first_two_digits <= 55) 230 if (first_two_digits >= 51 && first_two_digits <= 55)
229 return kMasterCard; 231 return kMasterCard;
230 232
231 if (first_digit == 3) 233 if (first_four_digits >= 3528 && first_four_digits <= 3589)
232 return kJCBCard; 234 return kJCBCard;
233 235
234 if (first_digit == 4) 236 if (first_digit == 4)
235 return kVisaCard; 237 return kVisaCard;
236 238
237 break; 239 break;
238 case 18:
239 case 19:
240 if (first_four_digits == 6334 || first_four_digits == 6767)
241 return kSoloCard;
242
243 break;
244 } 240 }
245 241
246 return kGenericCard; 242 return kGenericCard;
benquan 2013/06/08 07:27:57 Card type should be determined by BIN (the first 6
Ilya Sherman 2013/06/18 03:37:38 Done.
247 } 243 }
248 244
249 base::string16 CreditCard::GetRawInfo(AutofillFieldType type) const { 245 base::string16 CreditCard::GetRawInfo(AutofillFieldType type) const {
250 switch (type) { 246 switch (type) {
251 case CREDIT_CARD_NAME: 247 case CREDIT_CARD_NAME:
252 return name_on_card_; 248 return name_on_card_;
253 249
254 case CREDIT_CARD_EXP_MONTH: 250 case CREDIT_CARD_EXP_MONTH:
255 return ExpirationMonthAsString(); 251 return ExpirationMonthAsString();
256 252
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 const char* const kAmericanExpressCard = "americanExpressCC"; 678 const char* const kAmericanExpressCard = "americanExpressCC";
683 const char* const kDinersCard = "dinersCC"; 679 const char* const kDinersCard = "dinersCC";
684 const char* const kDiscoverCard = "discoverCC"; 680 const char* const kDiscoverCard = "discoverCC";
685 const char* const kGenericCard = "genericCC"; 681 const char* const kGenericCard = "genericCC";
686 const char* const kJCBCard = "jcbCC"; 682 const char* const kJCBCard = "jcbCC";
687 const char* const kMasterCard = "masterCardCC"; 683 const char* const kMasterCard = "masterCardCC";
688 const char* const kSoloCard = "soloCC"; 684 const char* const kSoloCard = "soloCC";
689 const char* const kVisaCard = "visaCC"; 685 const char* const kVisaCard = "visaCC";
690 686
691 } // namespace autofill 687 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698