diff options
Diffstat (limited to 'chrome/browser/autofill/credit_card.cc')
-rw-r--r-- | chrome/browser/autofill/credit_card.cc | 167 |
1 files changed, 133 insertions, 34 deletions
diff --git a/chrome/browser/autofill/credit_card.cc b/chrome/browser/autofill/credit_card.cc index efc4d64..50861a3 100644 --- a/chrome/browser/autofill/credit_card.cc +++ b/chrome/browser/autofill/credit_card.cc @@ -4,13 +4,20 @@ #include "chrome/browser/autofill/credit_card.h" +<<<<<<< HEAD #ifndef ANDROID // FIXME: Need l10n on Android? +======= +#include <string> + +>>>>>>> Chromium at release 7.0.540.0 #include "app/l10n_util.h" #endif #include "base/basictypes.h" #include "base/string_util.h" +#include "base/string_number_conversions.h" +#include "base/string16.h" #include "base/utf_string_conversions.h" #include "chrome/browser/autofill/autofill_type.h" #include "chrome/browser/autofill/field_types.h" @@ -18,10 +25,12 @@ #include "grit/generated_resources.h" #endif -static const string16 kCreditCardSeparators = ASCIIToUTF16(" -"); -static const char* kCreditCardObfuscationString = "************"; +namespace { + +const string16::value_type kCreditCardSeparators[] = {' ','-',0}; +const char* kCreditCardObfuscationString = "************"; -static const AutoFillFieldType kAutoFillCreditCardTypes[] = { +const AutoFillFieldType kAutoFillCreditCardTypes[] = { CREDIT_CARD_NAME, CREDIT_CARD_NUMBER, CREDIT_CARD_TYPE, @@ -29,13 +38,107 @@ static const AutoFillFieldType kAutoFillCreditCardTypes[] = { CREDIT_CARD_EXP_4_DIGIT_YEAR, }; -static const int kAutoFillCreditCardLength = - arraysize(kAutoFillCreditCardTypes); +const int kAutoFillCreditCardLength = arraysize(kAutoFillCreditCardTypes); + +// These values must match the values in WebKitClientImpl in webkit/glue. We +// send these strings to WK, which then asks WebKitClientImpl to load the image +// data. +const char* kAmericanExpressCard = "americanExpressCC"; +const char* kDinersCard = "dinersCC"; +const char* kDiscoverCard = "discoverCC"; +const char* kGenericCard = "genericCC"; +const char* kJCBCard = "jcbCC"; +const char* kMasterCard = "masterCardCC"; +const char* kSoloCard = "soloCC"; +const char* kVisaCard = "visaCC"; + +std::string GetCreditCardType(const string16& number) { + // Credit card number specifications taken from: + // http://en.wikipedia.org/wiki/Credit_card_numbers and + // http://www.beachnet.com/~hstiles/cardtype.html + // Card Type Prefix(es) Length + // --------------------------------------------------------------- + // Visa 4 13,16 + // American Express 34,37 15 + // Diners Club 300-305,2014,2149,36, 14,15 + // Discover Card 6011,65 16 + // JCB 3 16 + // JCB 2131,1800 15 + // MasterCard 51-55 16 + // Solo (debit card) 6334,6767 16,18,19 + + // We need at least 4 digits to work with. + if (number.length() < 4) + return kGenericCard; + + int first_four_digits = 0; + if (!base::StringToInt(number.substr(0, 4), &first_four_digits)) + return kGenericCard; + + int first_three_digits = first_four_digits / 10; + int first_two_digits = first_three_digits / 10; + int first_digit = first_two_digits / 10; + + switch (number.length()) { + case 13: + if (first_digit == 4) + return kVisaCard; + + break; + case 14: + if (first_three_digits >= 300 && first_three_digits <=305) + return kDinersCard; + + if (first_digit == 36) + return kDinersCard; + + break; + case 15: + if (first_two_digits == 34 || first_two_digits == 37) + return kAmericanExpressCard; + + if (first_four_digits == 2131 || first_four_digits == 1800) + return kJCBCard; + + if (first_four_digits == 2014 || first_four_digits == 2149) + return kDinersCard; + + break; + case 16: + if (first_four_digits == 6011 || first_two_digits == 65) + return kDiscoverCard; + + if (first_four_digits == 6334 || first_four_digits == 6767) + return kSoloCard; + + if (first_two_digits >= 51 && first_two_digits <= 55) + return kMasterCard; + + if (first_digit == 3) + return kJCBCard; + + if (first_digit == 4) + return kVisaCard; + + break; + case 18: + case 19: + if (first_four_digits == 6334 || first_four_digits == 6767) + return kSoloCard; + + break; + } + + return kGenericCard; +} + +} // namespace CreditCard::CreditCard(const string16& label, int unique_id) : expiration_month_(0), expiration_year_(0), label_(label), + billing_address_id_(0), unique_id_(unique_id) { } @@ -46,6 +149,7 @@ CreditCard::CreditCard(const CreditCard& card) : FormGroup() { CreditCard::CreditCard() : expiration_month_(0), expiration_year_(0), + billing_address_id_(0), unique_id_(0) { } @@ -69,9 +173,6 @@ void CreditCard::GetPossibleFieldTypes(const string16& text, if (Is4DigitExpirationYear(text)) possible_types->insert(CREDIT_CARD_EXP_4_DIGIT_YEAR); - - if (IsCardType(text)) - possible_types->insert(CREDIT_CARD_TYPE); } void CreditCard::GetAvailableFieldTypes(FieldTypeSet* available_types) const { @@ -89,9 +190,6 @@ void CreditCard::GetAvailableFieldTypes(FieldTypeSet* available_types) const { if (!Expiration4DigitYearAsString().empty()) available_types->insert(CREDIT_CARD_EXP_4_DIGIT_YEAR); - if (!type().empty()) - available_types->insert(CREDIT_CARD_TYPE); - if (!number().empty()) available_types->insert(CREDIT_CARD_NUMBER); } @@ -162,7 +260,8 @@ string16 CreditCard::GetFieldText(const AutoFillType& type) const { } case CREDIT_CARD_TYPE: - return this->type(); + // We don't handle this case. + return string16(); case CREDIT_CARD_NUMBER: return number(); @@ -206,7 +305,7 @@ void CreditCard::SetInfo(const AutoFillType& type, const string16& value) { break; case CREDIT_CARD_TYPE: - set_type(value); + // We determine the type based on the number. break; case CREDIT_CARD_NUMBER: { @@ -215,6 +314,7 @@ void CreditCard::SetInfo(const AutoFillType& type, const string16& value) { break; } set_number(value); + set_type(ASCIIToUTF16(GetCreditCardType(number()))); // Update last four digits as well. if (value.length() > 4) set_last_four_digits(value.substr(value.length() - 4)); @@ -286,7 +386,7 @@ void CreditCard::operator=(const CreditCard& source) { expiration_month_ = source.expiration_month_; expiration_year_ = source.expiration_year_; label_ = source.label_; - billing_address_ = source.billing_address_; + billing_address_id_ = source.billing_address_id_; unique_id_ = source.unique_id_; } @@ -302,7 +402,7 @@ bool CreditCard::operator==(const CreditCard& creditcard) const { if (label_ != creditcard.label_ || unique_id_ != creditcard.unique_id_ || - billing_address_ != creditcard.billing_address_) { + billing_address_id_ != creditcard.billing_address_id_) { return false; } @@ -323,7 +423,7 @@ bool CreditCard::operator!=(const CreditCard& creditcard) const { // static bool CreditCard::IsCreditCardNumber(const string16& text) { string16 number; - RemoveChars(text, kCreditCardSeparators.c_str(), &number); + RemoveChars(text, kCreditCardSeparators, &number); int sum = 0; bool odd = false; @@ -348,7 +448,7 @@ bool CreditCard::IsCreditCardNumber(const string16& text) { bool CreditCard::IsEmpty() const { FieldTypeSet types; GetAvailableFieldTypes(&types); - return types.empty() && billing_address().empty(); + return types.empty() && billing_address_id_ == 0; } @@ -356,7 +456,7 @@ string16 CreditCard::ExpirationMonthAsString() const { if (expiration_month_ == 0) return string16(); - string16 month = IntToString16(expiration_month_); + string16 month = base::IntToString16(expiration_month_); if (expiration_month_ >= 10) return month; @@ -369,14 +469,14 @@ string16 CreditCard::Expiration4DigitYearAsString() const { if (expiration_year_ == 0) return string16(); - return IntToString16(Expiration4DigitYear()); + return base::IntToString16(Expiration4DigitYear()); } string16 CreditCard::Expiration2DigitYearAsString() const { if (expiration_year_ == 0) return string16(); - return IntToString16(Expiration2DigitYear()); + return base::IntToString16(Expiration2DigitYear()); } void CreditCard::SetExpirationMonthFromString(const string16& text) { @@ -428,18 +528,21 @@ bool CreditCard::FindInfoMatchesHelper(const AutoFillFieldType& field_type, string16 exp_month(ExpirationMonthAsString()); if (StartsWith(exp_month, info, true)) *match = exp_month; + break; } case CREDIT_CARD_EXP_2_DIGIT_YEAR: { string16 exp_year(Expiration2DigitYearAsString()); if (StartsWith(exp_year, info, true)) *match = exp_year; + break; } case CREDIT_CARD_EXP_4_DIGIT_YEAR: { string16 exp_year(Expiration4DigitYearAsString()); if (StartsWith(exp_year, info, true)) *match = exp_year; + break; } case CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR: { @@ -447,6 +550,7 @@ bool CreditCard::FindInfoMatchesHelper(const AutoFillFieldType& field_type, Expiration2DigitYearAsString()); if (StartsWith(exp_date, info, true)) *match = exp_date; + break; } case CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR: { @@ -454,13 +558,12 @@ bool CreditCard::FindInfoMatchesHelper(const AutoFillFieldType& field_type, Expiration4DigitYearAsString()); if (StartsWith(exp_date, info, true)) *match = exp_date; + break; } - case CREDIT_CARD_TYPE: { - string16 card_type(this->type()); - if (StartsWith(card_type, info, true)) - *match = card_type; - } + case CREDIT_CARD_TYPE: + // We don't handle this case. + break; case CREDIT_CARD_VERIFICATION_CODE: NOTREACHED(); @@ -478,7 +581,7 @@ bool CreditCard::IsNameOnCard(const string16& text) const { bool CreditCard::IsExpirationMonth(const string16& text) const { int month; - if (!StringToInt(text, &month)) + if (!base::StringToInt(text, &month)) return false; return expiration_month_ == month; @@ -486,7 +589,7 @@ bool CreditCard::IsExpirationMonth(const string16& text) const { bool CreditCard::Is2DigitExpirationYear(const string16& text) const { int year; - if (!StringToInt(text, &year)) + if (!base::StringToInt(text, &year)) return false; return year < 100 && (expiration_year_ % 100) == year; @@ -494,19 +597,15 @@ bool CreditCard::Is2DigitExpirationYear(const string16& text) const { bool CreditCard::Is4DigitExpirationYear(const string16& text) const { int year; - if (!StringToInt(text, &year)) + if (!base::StringToInt(text, &year)) return false; return expiration_year_ == year; } -bool CreditCard::IsCardType(const string16& text) const { - return StringToLowerASCII(text) == StringToLowerASCII(type_); -} - bool CreditCard::ConvertDate(const string16& date, int* num) const { if (!date.empty()) { - bool converted = StringToInt(date, num); + bool converted = base::StringToInt(date, num); DCHECK(converted); if (!converted) return false; @@ -525,7 +624,7 @@ std::ostream& operator<<(std::ostream& os, const CreditCard& creditcard) { << " " << creditcard.unique_id() << " " - << UTF16ToUTF8(creditcard.billing_address()) + << creditcard.billing_address_id() << " " << UTF16ToUTF8(creditcard.GetFieldText(AutoFillType(CREDIT_CARD_NAME))) << " " |