| 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
|
|
|