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

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

Issue 770333006: Autofill - change presentation of credit card suggestions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: resolve merge conflict Created 6 years 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
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 <algorithm> 9 #include <algorithm>
10 #include <ostream> 10 #include <ostream>
(...skipping 18 matching lines...) Expand all
29 #include "third_party/icu/source/common/unicode/uloc.h" 29 #include "third_party/icu/source/common/unicode/uloc.h"
30 #include "third_party/icu/source/i18n/unicode/dtfmtsym.h" 30 #include "third_party/icu/source/i18n/unicode/dtfmtsym.h"
31 #include "ui/base/l10n/l10n_util.h" 31 #include "ui/base/l10n/l10n_util.h"
32 32
33 namespace autofill { 33 namespace autofill {
34 34
35 namespace { 35 namespace {
36 36
37 const base::char16 kCreditCardObfuscationSymbol = '*'; 37 const base::char16 kCreditCardObfuscationSymbol = '*';
38 38
39 // This is the maximum obfuscated symbols displayed.
40 // It is introduced to avoid rare cases where the credit card number is
41 // too large and fills the screen.
42 const size_t kMaxObfuscationSize = 20;
43
44 bool ConvertYear(const base::string16& year, int* num) { 39 bool ConvertYear(const base::string16& year, int* num) {
45 // If the |year| is empty, clear the stored value. 40 // If the |year| is empty, clear the stored value.
46 if (year.empty()) { 41 if (year.empty()) {
47 *num = 0; 42 *num = 0;
48 return true; 43 return true;
49 } 44 }
50 45
51 // Try parsing the |year| as a number. 46 // Try parsing the |year| as a number.
52 if (base::StringToInt(year, num)) 47 if (base::StringToInt(year, num))
53 return true; 48 return true;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 if (lowercased_month == base::StringToLowerASCII(icu_month)) { 96 if (lowercased_month == base::StringToLowerASCII(icu_month)) {
102 *num = i + 1; // Adjust from 0-indexed to 1-indexed. 97 *num = i + 1; // Adjust from 0-indexed to 1-indexed.
103 return true; 98 return true;
104 } 99 }
105 } 100 }
106 101
107 *num = 0; 102 *num = 0;
108 return false; 103 return false;
109 } 104 }
110 105
106 base::string16 TypeForFill(const std::string& type) {
107 if (type == kAmericanExpressCard)
108 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX);
109 if (type == kDinersCard)
110 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DINERS);
111 if (type == kDiscoverCard)
112 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DISCOVER);
113 if (type == kJCBCard)
114 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_JCB);
115 if (type == kMasterCard)
116 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_MASTERCARD);
117 if (type == kUnionPay)
118 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_UNION_PAY);
119 if (type == kVisaCard)
120 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_VISA);
121
122 // If you hit this DCHECK, the above list of cases needs to be updated to
123 // include a new card.
124 DCHECK_EQ(kGenericCard, type);
125 return base::string16();
126 }
127
111 } // namespace 128 } // namespace
112 129
113 CreditCard::CreditCard(const std::string& guid, const std::string& origin) 130 CreditCard::CreditCard(const std::string& guid, const std::string& origin)
114 : AutofillDataModel(guid, origin), 131 : AutofillDataModel(guid, origin),
115 record_type_(LOCAL_CARD), 132 record_type_(LOCAL_CARD),
116 type_(kGenericCard), 133 type_(kGenericCard),
117 expiration_month_(0), 134 expiration_month_(0),
118 expiration_year_(0) { 135 expiration_year_(0) {
119 } 136 }
120 137
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 170
154 // static 171 // static
155 const base::string16 CreditCard::StripSeparators(const base::string16& number) { 172 const base::string16 CreditCard::StripSeparators(const base::string16& number) {
156 base::string16 stripped; 173 base::string16 stripped;
157 base::RemoveChars(number, base::ASCIIToUTF16("- "), &stripped); 174 base::RemoveChars(number, base::ASCIIToUTF16("- "), &stripped);
158 return stripped; 175 return stripped;
159 } 176 }
160 177
161 // static 178 // static
162 base::string16 CreditCard::TypeForDisplay(const std::string& type) { 179 base::string16 CreditCard::TypeForDisplay(const std::string& type) {
163 if (type == kAmericanExpressCard) 180 if (kGenericCard == type)
164 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX); 181 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_GENERIC);
165 if (type == kDinersCard) 182 return ::autofill::TypeForFill(type);
166 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DINERS);
167 if (type == kDiscoverCard)
168 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DISCOVER);
169 if (type == kJCBCard)
170 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_JCB);
171 if (type == kMasterCard)
172 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_MASTERCARD);
173 if (type == kUnionPay)
174 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_UNION_PAY);
175 if (type == kVisaCard)
176 return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_VISA);
177
178 // If you hit this DCHECK, the above list of cases needs to be updated to
179 // include a new card.
180 DCHECK_EQ(kGenericCard, type);
181 return base::string16();
182 } 183 }
183 184
184 // This method is not compiled on iOS because the resources are not used and 185 // This method is not compiled on iOS because the resources are not used and
185 // should not be shipped. 186 // should not be shipped.
186 #if !defined(OS_IOS) 187 #if !defined(OS_IOS)
187 // static 188 // static
188 int CreditCard::IconResourceId(const std::string& type) { 189 int CreditCard::IconResourceId(const std::string& type) {
189 if (type == kAmericanExpressCard) 190 if (type == kAmericanExpressCard)
190 return IDR_AUTOFILL_CC_AMEX; 191 return IDR_AUTOFILL_CC_AMEX;
191 if (type == kDinersCard) 192 if (type == kDinersCard)
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 325
325 case CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR: { 326 case CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR: {
326 base::string16 month = ExpirationMonthAsString(); 327 base::string16 month = ExpirationMonthAsString();
327 base::string16 year = Expiration4DigitYearAsString(); 328 base::string16 year = Expiration4DigitYearAsString();
328 if (!month.empty() && !year.empty()) 329 if (!month.empty() && !year.empty())
329 return month + base::ASCIIToUTF16("/") + year; 330 return month + base::ASCIIToUTF16("/") + year;
330 return base::string16(); 331 return base::string16();
331 } 332 }
332 333
333 case CREDIT_CARD_TYPE: 334 case CREDIT_CARD_TYPE:
334 return TypeForDisplay(); 335 return TypeForFill();
335 336
336 case CREDIT_CARD_NUMBER: 337 case CREDIT_CARD_NUMBER:
337 return number_; 338 return number_;
338 339
339 case CREDIT_CARD_VERIFICATION_CODE: 340 case CREDIT_CARD_VERIFICATION_CODE:
340 // Chrome doesn't store credit card verification codes. 341 // Chrome doesn't store credit card verification codes.
341 return base::string16(); 342 return base::string16();
342 343
343 default: 344 default:
344 // ComputeDataPresentForArray will hit this repeatedly. 345 // ComputeDataPresentForArray will hit this repeatedly.
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 month == expiration_month_) { 434 month == expiration_month_) {
434 matching_types->insert(CREDIT_CARD_EXP_MONTH); 435 matching_types->insert(CREDIT_CARD_EXP_MONTH);
435 } 436 }
436 } 437 }
437 438
438 const base::string16 CreditCard::Label() const { 439 const base::string16 CreditCard::Label() const {
439 base::string16 label; 440 base::string16 label;
440 if (number().empty()) 441 if (number().empty())
441 return name_on_card_; // No CC number, return name only. 442 return name_on_card_; // No CC number, return name only.
442 443
443 base::string16 obfuscated_cc_number = ObfuscatedNumber(); 444 base::string16 obfuscated_cc_number = TypeAndLastFourDigits();
444 if (!expiration_month_ || !expiration_year_) 445 if (!expiration_month_ || !expiration_year_)
445 return obfuscated_cc_number; // No expiration date set. 446 return obfuscated_cc_number; // No expiration date set.
446 447
447 // TODO(georgey): Internationalize date. 448 // TODO(georgey): Internationalize date.
448 base::string16 formatted_date(ExpirationMonthAsString()); 449 base::string16 formatted_date(ExpirationMonthAsString());
449 formatted_date.append(base::ASCIIToUTF16("/")); 450 formatted_date.append(base::ASCIIToUTF16("/"));
450 formatted_date.append(Expiration4DigitYearAsString()); 451 formatted_date.append(Expiration4DigitYearAsString());
451 452
452 label = l10n_util::GetStringFUTF16(IDS_CREDIT_CARD_NUMBER_PREVIEW_FORMAT, 453 label = l10n_util::GetStringFUTF16(IDS_CREDIT_CARD_NUMBER_PREVIEW_FORMAT,
453 obfuscated_cc_number, 454 obfuscated_cc_number,
(...skipping 14 matching lines...) Expand all
468 int num = 0; 469 int num = 0;
469 bool converted = false; 470 bool converted = false;
470 converted = base::StringToInt(year_month[0], &num); 471 converted = base::StringToInt(year_month[0], &num);
471 DCHECK(converted); 472 DCHECK(converted);
472 SetExpirationYear(num); 473 SetExpirationYear(num);
473 converted = base::StringToInt(year_month[1], &num); 474 converted = base::StringToInt(year_month[1], &num);
474 DCHECK(converted); 475 DCHECK(converted);
475 SetExpirationMonth(num); 476 SetExpirationMonth(num);
476 } 477 }
477 478
478 base::string16 CreditCard::ObfuscatedNumber() const {
479 // If the number is four or less digits, there's no need to obfuscate it.
480 if (number_.size() <= 4)
481 return number_;
482
483 base::string16 number = StripSeparators(number_);
484
485 // Avoid making very long obfuscated numbers.
486 size_t obfuscated_digits = std::min(kMaxObfuscationSize, number.size() - 4);
487 base::string16 result(obfuscated_digits, kCreditCardObfuscationSymbol);
488 return result.append(LastFourDigits());
489 }
490
491 base::string16 CreditCard::LastFourDigits() const { 479 base::string16 CreditCard::LastFourDigits() const {
492 static const size_t kNumLastDigits = 4; 480 static const size_t kNumLastDigits = 4;
493 481
494 base::string16 number = StripSeparators(number_); 482 base::string16 number = StripSeparators(number_);
495 if (number.size() <= kNumLastDigits) 483 if (number.size() <= kNumLastDigits)
496 return number; 484 return number;
497 485
498 return number.substr(number.size() - kNumLastDigits, kNumLastDigits); 486 return number.substr(number.size() - kNumLastDigits, kNumLastDigits);
499 } 487 }
500 488
501 base::string16 CreditCard::TypeForDisplay() const { 489 base::string16 CreditCard::TypeForDisplay() const {
502 return CreditCard::TypeForDisplay(type_); 490 return CreditCard::TypeForDisplay(type_);
503 } 491 }
504 492
505 base::string16 CreditCard::TypeAndLastFourDigits() const { 493 base::string16 CreditCard::TypeAndLastFourDigits() const {
506 base::string16 type = TypeForDisplay(); 494 base::string16 type = TypeForDisplay();
507 // TODO(estade): type may be empty, we probably want to return
508 // "Card - 1234" or something in that case.
509 495
510 base::string16 digits = LastFourDigits(); 496 base::string16 digits = LastFourDigits();
511 if (digits.empty()) 497 if (digits.empty())
512 return type; 498 return type;
513 499
514 // TODO(estade): i18n. 500 // TODO(estade): i18n.
515 return type + base::ASCIIToUTF16(" - ") + digits; 501 return type + base::ASCIIToUTF16(" - ") + digits;
516 } 502 }
517 503
518 void CreditCard::operator=(const CreditCard& credit_card) { 504 void CreditCard::operator=(const CreditCard& credit_card) {
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 610
625 base::string16 month = base::IntToString16(expiration_month_); 611 base::string16 month = base::IntToString16(expiration_month_);
626 if (expiration_month_ >= 10) 612 if (expiration_month_ >= 10)
627 return month; 613 return month;
628 614
629 base::string16 zero = base::ASCIIToUTF16("0"); 615 base::string16 zero = base::ASCIIToUTF16("0");
630 zero.append(month); 616 zero.append(month);
631 return zero; 617 return zero;
632 } 618 }
633 619
620 base::string16 CreditCard::TypeForFill() const {
621 return ::autofill::TypeForFill(type_);
622 }
623
634 base::string16 CreditCard::Expiration4DigitYearAsString() const { 624 base::string16 CreditCard::Expiration4DigitYearAsString() const {
635 if (expiration_year_ == 0) 625 if (expiration_year_ == 0)
636 return base::string16(); 626 return base::string16();
637 627
638 return base::IntToString16(Expiration4DigitYear()); 628 return base::IntToString16(Expiration4DigitYear());
639 } 629 }
640 630
641 base::string16 CreditCard::Expiration2DigitYearAsString() const { 631 base::string16 CreditCard::Expiration2DigitYearAsString() const {
642 if (expiration_year_ == 0) 632 if (expiration_year_ == 0)
643 return base::string16(); 633 return base::string16();
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 const char* const kAmericanExpressCard = "americanExpressCC"; 700 const char* const kAmericanExpressCard = "americanExpressCC";
711 const char* const kDinersCard = "dinersCC"; 701 const char* const kDinersCard = "dinersCC";
712 const char* const kDiscoverCard = "discoverCC"; 702 const char* const kDiscoverCard = "discoverCC";
713 const char* const kGenericCard = "genericCC"; 703 const char* const kGenericCard = "genericCC";
714 const char* const kJCBCard = "jcbCC"; 704 const char* const kJCBCard = "jcbCC";
715 const char* const kMasterCard = "masterCardCC"; 705 const char* const kMasterCard = "masterCardCC";
716 const char* const kUnionPay = "unionPayCC"; 706 const char* const kUnionPay = "unionPayCC";
717 const char* const kVisaCard = "visaCC"; 707 const char* const kVisaCard = "visaCC";
718 708
719 } // namespace autofill 709 } // 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