| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/autofill/credit_card.h" | 5 #include "chrome/browser/autofill/credit_card.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/string16.h" | 10 #include "base/string16.h" |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 if (!Expiration2DigitYearAsString().empty()) | 178 if (!Expiration2DigitYearAsString().empty()) |
| 179 available_types->insert(CREDIT_CARD_EXP_2_DIGIT_YEAR); | 179 available_types->insert(CREDIT_CARD_EXP_2_DIGIT_YEAR); |
| 180 | 180 |
| 181 if (!Expiration4DigitYearAsString().empty()) | 181 if (!Expiration4DigitYearAsString().empty()) |
| 182 available_types->insert(CREDIT_CARD_EXP_4_DIGIT_YEAR); | 182 available_types->insert(CREDIT_CARD_EXP_4_DIGIT_YEAR); |
| 183 | 183 |
| 184 if (!number().empty()) | 184 if (!number().empty()) |
| 185 available_types->insert(CREDIT_CARD_NUMBER); | 185 available_types->insert(CREDIT_CARD_NUMBER); |
| 186 } | 186 } |
| 187 | 187 |
| 188 void CreditCard::FindInfoMatches(const AutofillType& type, | 188 void CreditCard::FindInfoMatches(AutofillFieldType type, |
| 189 const string16& info, | 189 const string16& info, |
| 190 std::vector<string16>* matched_text) const { | 190 std::vector<string16>* matched_text) const { |
| 191 DCHECK(matched_text); | 191 DCHECK(matched_text); |
| 192 | 192 |
| 193 string16 match; | 193 string16 match; |
| 194 switch (type.field_type()) { | 194 switch (type) { |
| 195 case CREDIT_CARD_NUMBER: { | 195 case CREDIT_CARD_NUMBER: { |
| 196 // Because the credit card number is encrypted and we are not able to do | 196 // Because the credit card number is encrypted and we are not able to do |
| 197 // comparisons with it we will say that any field that is known to be a | 197 // comparisons with it we will say that any field that is known to be a |
| 198 // credit card number field will match all credit card numbers. | 198 // credit card number field will match all credit card numbers. |
| 199 string16 text = GetPreviewText(AutofillType(CREDIT_CARD_NUMBER)); | 199 string16 text = GetPreviewText(CREDIT_CARD_NUMBER); |
| 200 if (!text.empty()) | 200 if (!text.empty()) |
| 201 matched_text->push_back(text); | 201 matched_text->push_back(text); |
| 202 break; | 202 break; |
| 203 } | 203 } |
| 204 | 204 |
| 205 case CREDIT_CARD_VERIFICATION_CODE: | 205 case CREDIT_CARD_VERIFICATION_CODE: |
| 206 NOTREACHED(); | 206 NOTREACHED(); |
| 207 break; | 207 break; |
| 208 | 208 |
| 209 case UNKNOWN_TYPE: | 209 case UNKNOWN_TYPE: |
| 210 for (int i = 0; i < kAutoFillCreditCardLength; ++i) { | 210 for (int i = 0; i < kAutoFillCreditCardLength; ++i) { |
| 211 if (FindInfoMatchesHelper(kAutoFillCreditCardTypes[i], info, &match)) | 211 if (FindInfoMatchesHelper(kAutoFillCreditCardTypes[i], info, &match)) |
| 212 matched_text->push_back(match); | 212 matched_text->push_back(match); |
| 213 } | 213 } |
| 214 break; | 214 break; |
| 215 | 215 |
| 216 default: | 216 default: |
| 217 if (FindInfoMatchesHelper(type.field_type(), info, &match)) | 217 if (FindInfoMatchesHelper(type, info, &match)) |
| 218 matched_text->push_back(match); | 218 matched_text->push_back(match); |
| 219 break; | 219 break; |
| 220 } | 220 } |
| 221 } | 221 } |
| 222 | 222 |
| 223 string16 CreditCard::GetFieldText(const AutofillType& type) const { | 223 string16 CreditCard::GetFieldText(AutofillFieldType type) const { |
| 224 switch (type.field_type()) { | 224 switch (type) { |
| 225 case CREDIT_CARD_NAME: | 225 case CREDIT_CARD_NAME: |
| 226 return name_on_card(); | 226 return name_on_card(); |
| 227 | 227 |
| 228 case CREDIT_CARD_EXP_MONTH: | 228 case CREDIT_CARD_EXP_MONTH: |
| 229 return ExpirationMonthAsString(); | 229 return ExpirationMonthAsString(); |
| 230 | 230 |
| 231 case CREDIT_CARD_EXP_2_DIGIT_YEAR: | 231 case CREDIT_CARD_EXP_2_DIGIT_YEAR: |
| 232 return Expiration2DigitYearAsString(); | 232 return Expiration2DigitYearAsString(); |
| 233 | 233 |
| 234 case CREDIT_CARD_EXP_4_DIGIT_YEAR: | 234 case CREDIT_CARD_EXP_4_DIGIT_YEAR: |
| (...skipping 25 matching lines...) Expand all Loading... |
| 260 case CREDIT_CARD_VERIFICATION_CODE: | 260 case CREDIT_CARD_VERIFICATION_CODE: |
| 261 NOTREACHED(); | 261 NOTREACHED(); |
| 262 return string16(); | 262 return string16(); |
| 263 | 263 |
| 264 default: | 264 default: |
| 265 // ComputeDataPresentForArray will hit this repeatedly. | 265 // ComputeDataPresentForArray will hit this repeatedly. |
| 266 return string16(); | 266 return string16(); |
| 267 } | 267 } |
| 268 } | 268 } |
| 269 | 269 |
| 270 string16 CreditCard::GetPreviewText(const AutofillType& type) const { | 270 string16 CreditCard::GetPreviewText(AutofillFieldType type) const { |
| 271 switch (type.field_type()) { | 271 switch (type) { |
| 272 case CREDIT_CARD_NUMBER: | 272 case CREDIT_CARD_NUMBER: |
| 273 return last_four_digits(); | 273 return last_four_digits(); |
| 274 | 274 |
| 275 case CREDIT_CARD_VERIFICATION_CODE: | 275 case CREDIT_CARD_VERIFICATION_CODE: |
| 276 NOTREACHED(); | 276 NOTREACHED(); |
| 277 return string16(); | 277 return string16(); |
| 278 | 278 |
| 279 default: | 279 default: |
| 280 return GetFieldText(type); | 280 return GetFieldText(type); |
| 281 } | 281 } |
| 282 } | 282 } |
| 283 | 283 |
| 284 void CreditCard::SetInfo(const AutofillType& type, const string16& value) { | 284 void CreditCard::SetInfo(AutofillFieldType type, const string16& value) { |
| 285 switch (type.field_type()) { | 285 switch (type) { |
| 286 case CREDIT_CARD_NAME: | 286 case CREDIT_CARD_NAME: |
| 287 set_name_on_card(value); | 287 set_name_on_card(value); |
| 288 break; | 288 break; |
| 289 | 289 |
| 290 case CREDIT_CARD_EXP_MONTH: | 290 case CREDIT_CARD_EXP_MONTH: |
| 291 SetExpirationMonthFromString(value); | 291 SetExpirationMonthFromString(value); |
| 292 break; | 292 break; |
| 293 | 293 |
| 294 case CREDIT_CARD_EXP_2_DIGIT_YEAR: | 294 case CREDIT_CARD_EXP_2_DIGIT_YEAR: |
| 295 // This is a read-only attribute. | 295 // This is a read-only attribute. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 315 set_last_four_digits(value.substr(value.length() - 4)); | 315 set_last_four_digits(value.substr(value.length() - 4)); |
| 316 else | 316 else |
| 317 set_last_four_digits(string16()); | 317 set_last_four_digits(string16()); |
| 318 } break; | 318 } break; |
| 319 | 319 |
| 320 case CREDIT_CARD_VERIFICATION_CODE: | 320 case CREDIT_CARD_VERIFICATION_CODE: |
| 321 NOTREACHED(); | 321 NOTREACHED(); |
| 322 break; | 322 break; |
| 323 | 323 |
| 324 default: | 324 default: |
| 325 DLOG(ERROR) << "Attempting to set unknown info-type " | 325 DLOG(ERROR) << "Attempting to set unknown info-type " << type; |
| 326 << type.field_type(); | |
| 327 break; | 326 break; |
| 328 } | 327 } |
| 329 } | 328 } |
| 330 | 329 |
| 331 const string16 CreditCard::Label() const { | 330 const string16 CreditCard::Label() const { |
| 332 return label_; | 331 return label_; |
| 333 } | 332 } |
| 334 | 333 |
| 335 void CreditCard::SetInfoForMonthInputType(const string16& value) { | 334 void CreditCard::SetInfoForMonthInputType(const string16& value) { |
| 336 // Check if |text| is "yyyy-mm" format first, and check normal month format. | 335 // Check if |text| is "yyyy-mm" format first, and check normal month format. |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 | 404 |
| 406 int CreditCard::Compare(const CreditCard& credit_card) const { | 405 int CreditCard::Compare(const CreditCard& credit_card) const { |
| 407 // The following CreditCard field types are the only types we store in the | 406 // The following CreditCard field types are the only types we store in the |
| 408 // WebDB so far, so we're only concerned with matching these types in the | 407 // WebDB so far, so we're only concerned with matching these types in the |
| 409 // credit card. | 408 // credit card. |
| 410 const AutofillFieldType types[] = { CREDIT_CARD_NAME, | 409 const AutofillFieldType types[] = { CREDIT_CARD_NAME, |
| 411 CREDIT_CARD_NUMBER, | 410 CREDIT_CARD_NUMBER, |
| 412 CREDIT_CARD_EXP_MONTH, | 411 CREDIT_CARD_EXP_MONTH, |
| 413 CREDIT_CARD_EXP_4_DIGIT_YEAR }; | 412 CREDIT_CARD_EXP_4_DIGIT_YEAR }; |
| 414 for (size_t index = 0; index < arraysize(types); ++index) { | 413 for (size_t index = 0; index < arraysize(types); ++index) { |
| 415 int comparison = GetFieldText(AutofillType(types[index])).compare( | 414 int comparison = GetFieldText(types[index]).compare( |
| 416 credit_card.GetFieldText(AutofillType(types[index]))); | 415 credit_card.GetFieldText(types[index])); |
| 417 if (comparison != 0) | 416 if (comparison != 0) |
| 418 return comparison; | 417 return comparison; |
| 419 } | 418 } |
| 420 | 419 |
| 421 return 0; | 420 return 0; |
| 422 } | 421 } |
| 423 | 422 |
| 424 bool CreditCard::operator==(const CreditCard& credit_card) const { | 423 bool CreditCard::operator==(const CreditCard& credit_card) const { |
| 425 if (label_ != credit_card.label_ || guid_ != credit_card.guid_) | 424 if (label_ != credit_card.label_ || guid_ != credit_card.guid_) |
| 426 return false; | 425 return false; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 | 521 |
| 523 void CreditCard::set_expiration_year(int expiration_year) { | 522 void CreditCard::set_expiration_year(int expiration_year) { |
| 524 if (expiration_year != 0 && | 523 if (expiration_year != 0 && |
| 525 (expiration_year < 2006 || expiration_year > 10000)) { | 524 (expiration_year < 2006 || expiration_year > 10000)) { |
| 526 return; | 525 return; |
| 527 } | 526 } |
| 528 | 527 |
| 529 expiration_year_ = expiration_year; | 528 expiration_year_ = expiration_year; |
| 530 } | 529 } |
| 531 | 530 |
| 532 bool CreditCard::FindInfoMatchesHelper(const AutofillFieldType& field_type, | 531 bool CreditCard::FindInfoMatchesHelper(AutofillFieldType field_type, |
| 533 const string16& info, | 532 const string16& info, |
| 534 string16* match) const { | 533 string16* match) const { |
| 535 DCHECK(match); | 534 DCHECK(match); |
| 536 | 535 |
| 537 match->clear(); | 536 match->clear(); |
| 538 switch (field_type) { | 537 switch (field_type) { |
| 539 case CREDIT_CARD_NAME: { | 538 case CREDIT_CARD_NAME: { |
| 540 if (StartsWith(name_on_card(), info, false)) | 539 if (StartsWith(name_on_card(), info, false)) |
| 541 *match = name_on_card(); | 540 *match = name_on_card(); |
| 542 break; | 541 break; |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 635 return true; | 634 return true; |
| 636 } | 635 } |
| 637 | 636 |
| 638 // So we can compare CreditCards with EXPECT_EQ(). | 637 // So we can compare CreditCards with EXPECT_EQ(). |
| 639 std::ostream& operator<<(std::ostream& os, const CreditCard& credit_card) { | 638 std::ostream& operator<<(std::ostream& os, const CreditCard& credit_card) { |
| 640 return os | 639 return os |
| 641 << UTF16ToUTF8(credit_card.Label()) | 640 << UTF16ToUTF8(credit_card.Label()) |
| 642 << " " | 641 << " " |
| 643 << credit_card.guid() | 642 << credit_card.guid() |
| 644 << " " | 643 << " " |
| 645 << UTF16ToUTF8(credit_card.GetFieldText(AutofillType(CREDIT_CARD_NAME))) | 644 << UTF16ToUTF8(credit_card.GetFieldText(CREDIT_CARD_NAME)) |
| 646 << " " | 645 << " " |
| 647 << UTF16ToUTF8(credit_card.GetFieldText(AutofillType(CREDIT_CARD_TYPE))) | 646 << UTF16ToUTF8(credit_card.GetFieldText(CREDIT_CARD_TYPE)) |
| 648 << " " | 647 << " " |
| 649 << UTF16ToUTF8(credit_card.GetFieldText(AutofillType(CREDIT_CARD_NUMBER))) | 648 << UTF16ToUTF8(credit_card.GetFieldText(CREDIT_CARD_NUMBER)) |
| 650 << " " | 649 << " " |
| 651 << UTF16ToUTF8(credit_card.GetFieldText( | 650 << UTF16ToUTF8(credit_card.GetFieldText(CREDIT_CARD_EXP_MONTH)) |
| 652 AutofillType(CREDIT_CARD_EXP_MONTH))) | |
| 653 << " " | 651 << " " |
| 654 << UTF16ToUTF8(credit_card.GetFieldText( | 652 << UTF16ToUTF8(credit_card.GetFieldText(CREDIT_CARD_EXP_4_DIGIT_YEAR)); |
| 655 AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR))); | |
| 656 } | 653 } |
| 657 | 654 |
| 658 // These values must match the values in WebKitClientImpl in webkit/glue. We | 655 // These values must match the values in WebKitClientImpl in webkit/glue. We |
| 659 // send these strings to WK, which then asks WebKitClientImpl to load the image | 656 // send these strings to WK, which then asks WebKitClientImpl to load the image |
| 660 // data. | 657 // data. |
| 661 const char* const kAmericanExpressCard = "americanExpressCC"; | 658 const char* const kAmericanExpressCard = "americanExpressCC"; |
| 662 const char* const kDinersCard = "dinersCC"; | 659 const char* const kDinersCard = "dinersCC"; |
| 663 const char* const kDiscoverCard = "discoverCC"; | 660 const char* const kDiscoverCard = "discoverCC"; |
| 664 const char* const kGenericCard = "genericCC"; | 661 const char* const kGenericCard = "genericCC"; |
| 665 const char* const kJCBCard = "jcbCC"; | 662 const char* const kJCBCard = "jcbCC"; |
| 666 const char* const kMasterCard = "masterCardCC"; | 663 const char* const kMasterCard = "masterCardCC"; |
| 667 const char* const kSoloCard = "soloCC"; | 664 const char* const kSoloCard = "soloCC"; |
| 668 const char* const kVisaCard = "visaCC"; | 665 const char* const kVisaCard = "visaCC"; |
| OLD | NEW |