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

Side by Side Diff: components/autofill/core/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: Rebase 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/core/browser/credit_card.h" 5 #include "components/autofill/core/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 int CreditCard::IconResourceId(const std::string& type) { 163 int CreditCard::IconResourceId(const std::string& type) {
166 if (type == kAmericanExpressCard) 164 if (type == kAmericanExpressCard)
167 return IDR_AUTOFILL_CC_AMEX; 165 return IDR_AUTOFILL_CC_AMEX;
168 if (type == kDinersCard) 166 if (type == kDinersCard)
169 return IDR_AUTOFILL_CC_DINERS; 167 return IDR_AUTOFILL_CC_DINERS;
170 if (type == kDiscoverCard) 168 if (type == kDiscoverCard)
171 return IDR_AUTOFILL_CC_DISCOVER; 169 return IDR_AUTOFILL_CC_DISCOVER;
172 if (type == kJCBCard) 170 if (type == kJCBCard)
173 return IDR_AUTOFILL_CC_JCB; 171 return IDR_AUTOFILL_CC_JCB;
174 if (type == kMasterCard) 172 if (type == kMasterCard)
175 return IDR_AUTOFILL_CC_MASTERCARD; 173 return IDR_AUTOFILL_CC_MASTERCARD;
176 if (type == kSoloCard)
177 return IDR_AUTOFILL_CC_SOLO;
178 if (type == kVisaCard) 174 if (type == kVisaCard)
179 return IDR_AUTOFILL_CC_VISA; 175 return IDR_AUTOFILL_CC_VISA;
180 176
181 // If you hit this DCHECK, the above list of cases needs to be updated to 177 // If you hit this DCHECK, the above list of cases needs to be updated to
182 // include a new card. 178 // include a new card.
183 DCHECK_EQ(kGenericCard, type); 179 DCHECK_EQ(kGenericCard, type);
184 return IDR_AUTOFILL_CC_GENERIC; 180 return IDR_AUTOFILL_CC_GENERIC;
185 } 181 }
186 182
187 // static 183 // static
188 std::string CreditCard::GetCreditCardType(const base::string16& number) { 184 std::string CreditCard::GetCreditCardType(const base::string16& number) {
189 // Don't check for a specific type if this is not a credit card number.
190 if (!autofill::IsValidCreditCardNumber(number))
191 return kGenericCard;
192
193 // Credit card number specifications taken from: 185 // Credit card number specifications taken from:
194 // http://en.wikipedia.org/wiki/Credit_card_numbers and 186 // http://en.wikipedia.org/wiki/Credit_card_numbers,
187 // http://www.discovernetwork.com/merchants/images/Merchant_Marketing_PDF.pdf,
188 // http://www.regular-expressions.info/creditcard.html, and
195 // http://www.beachnet.com/~hstiles/cardtype.html 189 // http://www.beachnet.com/~hstiles/cardtype.html
190 //
191 // The last site is currently unavailable, but a cached version remains at
192 // http://web.archive.org/web/20120923111349/http://www.beachnet.com/~hstiles/ cardtype.html
193 //
196 // Card Type Prefix(es) Length 194 // Card Type Prefix(es) Length
197 // --------------------------------------------------------------- 195 // ---------------------------------------------------------------
198 // Visa 4 13,16 196 // Visa 4 13,16
199 // American Express 34,37 15 197 // American Express 34,37 15
200 // Diners Club 300-305,2014,2149,36, 14,15 198 // Diners Club 300-305,3095,36,38-39 14
201 // Discover Card 6011,65 16 199 // Discover Card 6011,644-649,65 16
202 // JCB 3 16 200 // JCB 3528-3589 16
203 // JCB 2131,1800 15
204 // MasterCard 51-55 16 201 // MasterCard 51-55 16
205 // Solo (debit card) 6334,6767 16,18,19
206 202
207 // We need at least 4 digits to work with. 203 // Check for prefixes of length 1.
208 if (number.length() < 4) 204 if (number.empty())
205 return kGenericCard;
206
207 if (number[0] == '4')
208 return kVisaCard;
209
210 // Check for prefixes of length 2.
211 if (number.size() < 2)
212 return kGenericCard;
213
214 int first_two_digits = 0;
215 if (!base::StringToInt(number.substr(0, 2), &first_two_digits))
216 return kGenericCard;
217
218 if (first_two_digits == 34 || first_two_digits == 37)
219 return kAmericanExpressCard;
220
221 if (first_two_digits == 36 ||
222 first_two_digits == 38 ||
223 first_two_digits == 39)
224 return kDinersCard;
225
226 if (first_two_digits >= 51 && first_two_digits <= 55)
227 return kMasterCard;
228
229 if (first_two_digits == 65)
230 return kDiscoverCard;
231
232 // Check for prefixes of length 3.
233 if (number.size() < 3)
234 return kGenericCard;
235
236 int first_three_digits = 0;
237 if (!base::StringToInt(number.substr(0, 3), &first_three_digits))
238 return kGenericCard;
239
240 if (first_three_digits >= 300 && first_three_digits <= 305)
241 return kDinersCard;
242
243 if (first_three_digits >= 644 && first_three_digits <= 649)
244 return kDiscoverCard;
245
246 // Check for prefixes of length 4.
247 if (number.size() < 4)
209 return kGenericCard; 248 return kGenericCard;
210 249
211 int first_four_digits = 0; 250 int first_four_digits = 0;
212 if (!base::StringToInt(number.substr(0, 4), &first_four_digits)) 251 if (!base::StringToInt(number.substr(0, 4), &first_four_digits))
213 return kGenericCard; 252 return kGenericCard;
214 253
215 int first_three_digits = first_four_digits / 10; 254 if (first_four_digits == 3095)
216 int first_two_digits = first_three_digits / 10; 255 return kDinersCard;
217 int first_digit = first_two_digits / 10;
218 256
219 switch (number.length()) { 257 if (first_four_digits >= 3528 && first_four_digits <= 3589)
220 case 13: 258 return kJCBCard;
221 if (first_digit == 4)
222 return kVisaCard;
223 259
224 break; 260 if (first_four_digits == 6011)
225 case 14: 261 return kDiscoverCard;
226 if (first_three_digits >= 300 && first_three_digits <= 305)
227 return kDinersCard;
228
229 if (first_digit == 36)
230 return kDinersCard;
231
232 break;
233 case 15:
234 if (first_two_digits == 34 || first_two_digits == 37)
235 return kAmericanExpressCard;
236
237 if (first_four_digits == 2131 || first_four_digits == 1800)
238 return kJCBCard;
239
240 if (first_four_digits == 2014 || first_four_digits == 2149)
241 return kDinersCard;
242
243 break;
244 case 16:
245 if (first_four_digits == 6011 || first_two_digits == 65)
246 return kDiscoverCard;
247
248 if (first_four_digits == 6334 || first_four_digits == 6767)
249 return kSoloCard;
250
251 if (first_two_digits >= 51 && first_two_digits <= 55)
252 return kMasterCard;
253
254 if (first_digit == 3)
255 return kJCBCard;
256
257 if (first_digit == 4)
258 return kVisaCard;
259
260 break;
261 case 18:
262 case 19:
263 if (first_four_digits == 6334 || first_four_digits == 6767)
264 return kSoloCard;
265
266 break;
267 }
268 262
269 return kGenericCard; 263 return kGenericCard;
270 } 264 }
271 265
272 base::string16 CreditCard::GetRawInfo(AutofillFieldType type) const { 266 base::string16 CreditCard::GetRawInfo(AutofillFieldType type) const {
273 switch (type) { 267 switch (type) {
274 case CREDIT_CARD_NAME: 268 case CREDIT_CARD_NAME:
275 return name_on_card_; 269 return name_on_card_;
276 270
277 case CREDIT_CARD_EXP_MONTH: 271 case CREDIT_CARD_EXP_MONTH:
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 678
685 // These values must match the values in WebKitPlatformSupportImpl in 679 // These values must match the values in WebKitPlatformSupportImpl in
686 // webkit/glue. We send these strings to WebKit, which then asks 680 // webkit/glue. We send these strings to WebKit, which then asks
687 // WebKitPlatformSupportImpl to load the image data. 681 // WebKitPlatformSupportImpl to load the image data.
688 const char* const kAmericanExpressCard = "americanExpressCC"; 682 const char* const kAmericanExpressCard = "americanExpressCC";
689 const char* const kDinersCard = "dinersCC"; 683 const char* const kDinersCard = "dinersCC";
690 const char* const kDiscoverCard = "discoverCC"; 684 const char* const kDiscoverCard = "discoverCC";
691 const char* const kGenericCard = "genericCC"; 685 const char* const kGenericCard = "genericCC";
692 const char* const kJCBCard = "jcbCC"; 686 const char* const kJCBCard = "jcbCC";
693 const char* const kMasterCard = "masterCardCC"; 687 const char* const kMasterCard = "masterCardCC";
694 const char* const kSoloCard = "soloCC";
695 const char* const kVisaCard = "visaCC"; 688 const char* const kVisaCard = "visaCC";
696 689
697 } // namespace autofill 690 } // namespace autofill
OLDNEW
« no previous file with comments | « components/autofill/core/browser/credit_card.h ('k') | components/autofill/core/browser/credit_card_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698