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 |