summaryrefslogtreecommitdiffstats
path: root/chrome/browser/autofill/credit_card.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/autofill/credit_card.cc')
-rw-r--r--chrome/browser/autofill/credit_card.cc167
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)))
<< " "