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

Unified Diff: components/autofill/core/browser/credit_card.cc

Issue 381613005: [Autofill] Autofill fails to fill credit card number when split across fields. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: components/autofill/core/browser/credit_card.cc
diff --git a/components/autofill/core/browser/credit_card.cc b/components/autofill/core/browser/credit_card.cc
index 25a2329b72486b539b61c09ff3c90643bb6b40ba..dec9f07115e0871ea9eec02f7745fc9ee99569bb 100644
--- a/components/autofill/core/browser/credit_card.cc
+++ b/components/autofill/core/browser/credit_card.cc
@@ -310,7 +310,19 @@ base::string16 CreditCard::GetRawInfo(ServerFieldType type) const {
return TypeForDisplay();
case CREDIT_CARD_NUMBER:
- return number_;
+ return this->GetNumber();
+
+ case CREDIT_CARD_NUMBER_PART1:
+ return this->number_part1_;
+
+ case CREDIT_CARD_NUMBER_PART2:
+ return this->number_part2_;
+
+ case CREDIT_CARD_NUMBER_PART3:
+ return this->number_part3_;
+
+ case CREDIT_CARD_NUMBER_PART4:
+ return this->number_part4_;
case CREDIT_CARD_VERIFICATION_CODE:
// Chrome doesn't store credit card verification codes.
@@ -361,6 +373,34 @@ void CreditCard::SetRawInfo(ServerFieldType type,
break;
}
+ case CREDIT_CARD_NUMBER_PART1: {
+ // Don't change the real value if the input is an obfuscated string.
+ if (value.size() > 0 && value[0] != kCreditCardObfuscationSymbol)
+ SetNumber(value, autofill::CreditCard::first_part);
+ break;
+ }
+
+ case CREDIT_CARD_NUMBER_PART2: {
+ // Don't change the real value if the input is an obfuscated string.
+ if (value.size() > 0 && value[0] != kCreditCardObfuscationSymbol)
+ SetNumber(value, autofill::CreditCard::second_part);
+ break;
+ }
+
+ case CREDIT_CARD_NUMBER_PART3: {
+ // Don't change the real value if the input is an obfuscated string.
+ if (value.size() > 0 && value[0] != kCreditCardObfuscationSymbol)
+ SetNumber(value, autofill::CreditCard::third_part);
+ break;
+ }
+
+ case CREDIT_CARD_NUMBER_PART4: {
+ // Don't change the real value if the input is an obfuscated string.
+ if (value.size() > 0 && value[0] != kCreditCardObfuscationSymbol)
+ SetNumber(value, autofill::CreditCard::last_part);
+ break;
+ }
+
case CREDIT_CARD_VERIFICATION_CODE:
// Chrome doesn't store the credit card verification code.
break;
@@ -375,7 +415,7 @@ base::string16 CreditCard::GetInfo(const AutofillType& type,
const std::string& app_locale) const {
ServerFieldType storable_type = type.GetStorableType();
if (storable_type == CREDIT_CARD_NUMBER)
- return StripSeparators(number_);
+ return this->GetNumber();
return GetRawInfo(storable_type);
}
@@ -413,7 +453,7 @@ void CreditCard::GetMatchingTypes(const base::string16& text,
const base::string16 CreditCard::Label() const {
base::string16 label;
- if (number().empty())
+ if (GetNumber().empty())
return name_on_card_; // No CC number, return name only.
base::string16 obfuscated_cc_number = ObfuscatedNumber();
@@ -453,10 +493,10 @@ void CreditCard::SetInfoForMonthInputType(const base::string16& value) {
base::string16 CreditCard::ObfuscatedNumber() const {
// If the number is shorter than four digits, there's no need to obfuscate it.
- if (number_.size() < 4)
- return number_;
+ if (this->GetNumber().size() < 4)
+ return this->GetNumber();
- base::string16 number = StripSeparators(number_);
+ base::string16 number = this->GetNumber();
// Avoid making very long obfuscated numbers.
size_t obfuscated_digits = std::min(kMaxObfuscationSize, number.size() - 4);
@@ -467,7 +507,7 @@ base::string16 CreditCard::ObfuscatedNumber() const {
base::string16 CreditCard::LastFourDigits() const {
static const size_t kNumLastDigits = 4;
- base::string16 number = StripSeparators(number_);
+ base::string16 number = this->GetNumber();
if (number.size() < kNumLastDigits)
return base::string16();
@@ -495,7 +535,10 @@ void CreditCard::operator=(const CreditCard& credit_card) {
if (this == &credit_card)
return;
- number_ = credit_card.number_;
+ number_part1_ = credit_card.number_part1_;
+ number_part2_ = credit_card.number_part2_;
+ number_part3_ = credit_card.number_part3_;
+ number_part4_ = credit_card.number_part4_;
name_on_card_ = credit_card.name_on_card_;
type_ = credit_card.type_;
expiration_month_ = credit_card.expiration_month_;
@@ -570,14 +613,12 @@ bool CreditCard::IsEmpty(const std::string& app_locale) const {
}
bool CreditCard::IsComplete() const {
- return
- autofill::IsValidCreditCardNumber(number_) &&
- expiration_month_ != 0 &&
- expiration_year_ != 0;
+ return autofill::IsValidCreditCardNumber(this->GetNumber()) &&
+ expiration_month_ != 0 && expiration_year_ != 0;
}
bool CreditCard::IsValid() const {
- return autofill::IsValidCreditCardNumber(number_) &&
+ return autofill::IsValidCreditCardNumber(this->GetNumber()) &&
autofill::IsValidCreditCardExpirationDate(
expiration_year_, expiration_month_, base::Time::Now());
}
@@ -585,6 +626,10 @@ bool CreditCard::IsValid() const {
void CreditCard::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
supported_types->insert(CREDIT_CARD_NAME);
supported_types->insert(CREDIT_CARD_NUMBER);
+ supported_types->insert(CREDIT_CARD_NUMBER_PART1);
+ supported_types->insert(CREDIT_CARD_NUMBER_PART2);
+ supported_types->insert(CREDIT_CARD_NUMBER_PART3);
+ supported_types->insert(CREDIT_CARD_NUMBER_PART4);
supported_types->insert(CREDIT_CARD_TYPE);
supported_types->insert(CREDIT_CARD_EXP_MONTH);
supported_types->insert(CREDIT_CARD_EXP_2_DIGIT_YEAR);
@@ -637,9 +682,55 @@ void CreditCard::SetExpirationYearFromString(const base::string16& text) {
SetExpirationYear(year);
}
-void CreditCard::SetNumber(const base::string16& number) {
- number_ = number;
- type_ = GetCreditCardType(StripSeparators(number_));
+void CreditCard::SetNumber(const base::string16& number, const Part& part) {
+ base::string16 card_number = StripSeparators(number);
+ switch (part) {
+ case autofill::CreditCard::first_part:
+ number_part1_ = card_number;
+ type_ = GetCreditCardType(number_part1_);
+ break;
+
+ case autofill::CreditCard::second_part:
+ number_part2_ = card_number;
+ break;
+
+ case autofill::CreditCard::third_part:
+ number_part3_ = card_number;
+ break;
+
+ case autofill::CreditCard::last_part:
+ number_part4_ = card_number;
+ break;
+
+ default: {
+ static const size_t kNumDigits = 4;
+ size_t card_number_length = card_number.size();
+ number_part1_ = base::string16();
+ number_part2_ = base::string16();
+ number_part3_ = base::string16();
+ number_part4_ = base::string16();
+ type_ = "";
+
+ if (card_number_length)
+ number_part1_ =
+ card_number.substr(0, std::min(kNumDigits, card_number_length));
+
+ if (card_number_length > kNumDigits)
+ number_part2_ = card_number.substr(
+ kNumDigits, std::min(kNumDigits, card_number_length - kNumDigits));
+
+ if (card_number_length > 2 * kNumDigits)
+ number_part3_ = card_number.substr(
+ 2 * kNumDigits,
+ std::min(kNumDigits, card_number_length - 2 * kNumDigits));
+
+ if (card_number_length > 3 * kNumDigits)
+ number_part4_ = card_number.substr(3 * kNumDigits,
+ card_number_length - 3 * kNumDigits);
+
+ type_ = GetCreditCardType(card_number);
+ }
+ }
}
void CreditCard::SetExpirationMonth(int expiration_month) {
@@ -658,25 +749,33 @@ void CreditCard::SetExpirationYear(int expiration_year) {
expiration_year_ = expiration_year;
}
+base::string16 CreditCard::GetNumber() const {
+ base::string16 number = number_part1_;
+ number += number_part2_;
+ number += number_part3_;
+ number += number_part4_;
+ return number;
+}
+
// So we can compare CreditCards with EXPECT_EQ().
std::ostream& operator<<(std::ostream& os, const CreditCard& credit_card) {
return os
- << base::UTF16ToUTF8(credit_card.Label())
- << " "
- << credit_card.guid()
- << " "
- << credit_card.origin()
- << " "
- << base::UTF16ToUTF8(credit_card.GetRawInfo(CREDIT_CARD_NAME))
- << " "
- << base::UTF16ToUTF8(credit_card.GetRawInfo(CREDIT_CARD_TYPE))
- << " "
- << base::UTF16ToUTF8(credit_card.GetRawInfo(CREDIT_CARD_NUMBER))
- << " "
- << base::UTF16ToUTF8(credit_card.GetRawInfo(CREDIT_CARD_EXP_MONTH))
- << " "
- << base::UTF16ToUTF8(
- credit_card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
+ << base::UTF16ToUTF8(credit_card.Label()) << " " << credit_card.guid()
+ << " " << credit_card.origin() << " "
+ << base::UTF16ToUTF8(credit_card.GetRawInfo(CREDIT_CARD_NAME)) << " "
+ << base::UTF16ToUTF8(credit_card.GetRawInfo(CREDIT_CARD_TYPE)) << " "
+ << base::UTF16ToUTF8(credit_card.GetRawInfo(CREDIT_CARD_NUMBER)) << " "
+ << base::UTF16ToUTF8(credit_card.GetRawInfo(CREDIT_CARD_NUMBER_PART1))
+ << " "
+ << base::UTF16ToUTF8(credit_card.GetRawInfo(CREDIT_CARD_NUMBER_PART2))
+ << " "
+ << base::UTF16ToUTF8(credit_card.GetRawInfo(CREDIT_CARD_NUMBER_PART3))
+ << " "
+ << base::UTF16ToUTF8(credit_card.GetRawInfo(CREDIT_CARD_NUMBER_PART4))
+ << " "
+ << base::UTF16ToUTF8(credit_card.GetRawInfo(CREDIT_CARD_EXP_MONTH))
+ << " " << base::UTF16ToUTF8(
+ credit_card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR));
}
// These values must match the values in WebKitPlatformSupportImpl in

Powered by Google App Engine
This is Rietveld 408576698