| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/autofill/core/browser/credit_card.h" | 5 #include "components/autofill/core/browser/credit_card.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <ostream> | 9 #include <ostream> |
| 10 #include <string> | 10 #include <string> |
| 11 | 11 |
| 12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
| 13 #include "base/guid.h" | 13 #include "base/guid.h" |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/strings/string16.h" | 15 #include "base/strings/string16.h" |
| 16 #include "base/strings/string_number_conversions.h" | 16 #include "base/strings/string_number_conversions.h" |
| 17 #include "base/strings/string_split.h" | 17 #include "base/strings/string_split.h" |
| 18 #include "base/strings/string_util.h" | 18 #include "base/strings/string_util.h" |
| 19 #include "base/strings/utf_string_conversions.h" | 19 #include "base/strings/utf_string_conversions.h" |
| 20 #include "base/time/time.h" | 20 #include "base/time/time.h" |
| 21 #include "components/autofill/core/browser/autofill_field.h" | 21 #include "components/autofill/core/browser/autofill_field.h" |
| 22 #include "components/autofill/core/browser/autofill_regexes.h" | 22 #include "components/autofill/core/browser/autofill_regexes.h" |
| 23 #include "components/autofill/core/browser/autofill_type.h" | 23 #include "components/autofill/core/browser/autofill_type.h" |
| 24 #include "components/autofill/core/browser/field_types.h" | |
| 25 #include "components/autofill/core/browser/validation.h" | 24 #include "components/autofill/core/browser/validation.h" |
| 26 #include "components/autofill/core/common/form_field_data.h" | 25 #include "components/autofill/core/common/form_field_data.h" |
| 27 #include "grit/component_strings.h" | 26 #include "grit/component_strings.h" |
| 28 #include "grit/webkit_resources.h" | 27 #include "grit/webkit_resources.h" |
| 29 #include "third_party/icu/source/common/unicode/uloc.h" | 28 #include "third_party/icu/source/common/unicode/uloc.h" |
| 30 #include "third_party/icu/source/i18n/unicode/dtfmtsym.h" | 29 #include "third_party/icu/source/i18n/unicode/dtfmtsym.h" |
| 31 #include "ui/base/l10n/l10n_util.h" | 30 #include "ui/base/l10n/l10n_util.h" |
| 32 | 31 |
| 33 namespace autofill { | 32 namespace autofill { |
| 34 | 33 |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 | 268 |
| 270 if (first_four_digits >= 3528 && first_four_digits <= 3589) | 269 if (first_four_digits >= 3528 && first_four_digits <= 3589) |
| 271 return kJCBCard; | 270 return kJCBCard; |
| 272 | 271 |
| 273 if (first_four_digits == 6011) | 272 if (first_four_digits == 6011) |
| 274 return kDiscoverCard; | 273 return kDiscoverCard; |
| 275 | 274 |
| 276 return kGenericCard; | 275 return kGenericCard; |
| 277 } | 276 } |
| 278 | 277 |
| 279 base::string16 CreditCard::GetRawInfo(AutofillFieldType type) const { | 278 base::string16 CreditCard::GetRawInfo(ServerFieldType type) const { |
| 280 switch (type) { | 279 switch (type) { |
| 281 case CREDIT_CARD_NAME: | 280 case CREDIT_CARD_NAME: |
| 282 return name_on_card_; | 281 return name_on_card_; |
| 283 | 282 |
| 284 case CREDIT_CARD_EXP_MONTH: | 283 case CREDIT_CARD_EXP_MONTH: |
| 285 return ExpirationMonthAsString(); | 284 return ExpirationMonthAsString(); |
| 286 | 285 |
| 287 case CREDIT_CARD_EXP_2_DIGIT_YEAR: | 286 case CREDIT_CARD_EXP_2_DIGIT_YEAR: |
| 288 return Expiration2DigitYearAsString(); | 287 return Expiration2DigitYearAsString(); |
| 289 | 288 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 315 case CREDIT_CARD_VERIFICATION_CODE: | 314 case CREDIT_CARD_VERIFICATION_CODE: |
| 316 // Chrome doesn't store credit card verification codes. | 315 // Chrome doesn't store credit card verification codes. |
| 317 return base::string16(); | 316 return base::string16(); |
| 318 | 317 |
| 319 default: | 318 default: |
| 320 // ComputeDataPresentForArray will hit this repeatedly. | 319 // ComputeDataPresentForArray will hit this repeatedly. |
| 321 return base::string16(); | 320 return base::string16(); |
| 322 } | 321 } |
| 323 } | 322 } |
| 324 | 323 |
| 325 void CreditCard::SetRawInfo(AutofillFieldType type, | 324 void CreditCard::SetRawInfo(ServerFieldType type, |
| 326 const base::string16& value) { | 325 const base::string16& value) { |
| 327 switch (type) { | 326 switch (type) { |
| 328 case CREDIT_CARD_NAME: | 327 case CREDIT_CARD_NAME: |
| 329 name_on_card_ = value; | 328 name_on_card_ = value; |
| 330 break; | 329 break; |
| 331 | 330 |
| 332 case CREDIT_CARD_EXP_MONTH: | 331 case CREDIT_CARD_EXP_MONTH: |
| 333 SetExpirationMonthFromString(value, std::string()); | 332 SetExpirationMonthFromString(value, std::string()); |
| 334 break; | 333 break; |
| 335 | 334 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 363 case CREDIT_CARD_VERIFICATION_CODE: | 362 case CREDIT_CARD_VERIFICATION_CODE: |
| 364 // Chrome doesn't store the credit card verification code. | 363 // Chrome doesn't store the credit card verification code. |
| 365 break; | 364 break; |
| 366 | 365 |
| 367 default: | 366 default: |
| 368 NOTREACHED() << "Attempting to set unknown info-type " << type; | 367 NOTREACHED() << "Attempting to set unknown info-type " << type; |
| 369 break; | 368 break; |
| 370 } | 369 } |
| 371 } | 370 } |
| 372 | 371 |
| 373 base::string16 CreditCard::GetInfo(AutofillFieldType type, | 372 base::string16 CreditCard::GetInfo(const AutofillType& type, |
| 374 const std::string& app_locale) const { | 373 const std::string& app_locale) const { |
| 375 if (type == CREDIT_CARD_NUMBER) | 374 if (type.server_type() == CREDIT_CARD_NUMBER) |
| 376 return StripSeparators(number_); | 375 return StripSeparators(number_); |
| 377 | 376 |
| 378 return GetRawInfo(type); | 377 return GetRawInfo(type.server_type()); |
| 379 } | 378 } |
| 380 | 379 |
| 381 bool CreditCard::SetInfo(AutofillFieldType type, | 380 bool CreditCard::SetInfo(const AutofillType& type, |
| 382 const base::string16& value, | 381 const base::string16& value, |
| 383 const std::string& app_locale) { | 382 const std::string& app_locale) { |
| 384 if (type == CREDIT_CARD_NUMBER) | 383 ServerFieldType server_type = type.server_type(); |
| 385 SetRawInfo(type, StripSeparators(value)); | 384 if (server_type == CREDIT_CARD_NUMBER) |
| 386 else if (type == CREDIT_CARD_EXP_MONTH) | 385 SetRawInfo(server_type, StripSeparators(value)); |
| 386 else if (server_type == CREDIT_CARD_EXP_MONTH) |
| 387 SetExpirationMonthFromString(value, app_locale); | 387 SetExpirationMonthFromString(value, app_locale); |
| 388 else | 388 else |
| 389 SetRawInfo(type, value); | 389 SetRawInfo(server_type, value); |
| 390 | 390 |
| 391 return true; | 391 return true; |
| 392 } | 392 } |
| 393 | 393 |
| 394 void CreditCard::GetMatchingTypes(const base::string16& text, | 394 void CreditCard::GetMatchingTypes(const base::string16& text, |
| 395 const std::string& app_locale, | 395 const std::string& app_locale, |
| 396 FieldTypeSet* matching_types) const { | 396 ServerFieldTypeSet* matching_types) const { |
| 397 FormGroup::GetMatchingTypes(text, app_locale, matching_types); | 397 FormGroup::GetMatchingTypes(text, app_locale, matching_types); |
| 398 | 398 |
| 399 base::string16 card_number = GetInfo(CREDIT_CARD_NUMBER, app_locale); | 399 base::string16 card_number = |
| 400 GetInfo(AutofillType(CREDIT_CARD_NUMBER), app_locale); |
| 400 if (!card_number.empty() && StripSeparators(text) == card_number) | 401 if (!card_number.empty() && StripSeparators(text) == card_number) |
| 401 matching_types->insert(CREDIT_CARD_NUMBER); | 402 matching_types->insert(CREDIT_CARD_NUMBER); |
| 402 | 403 |
| 403 int month; | 404 int month; |
| 404 if (ConvertMonth(text, app_locale, &month) && month != 0 && | 405 if (ConvertMonth(text, app_locale, &month) && month != 0 && |
| 405 month == expiration_month_) { | 406 month == expiration_month_) { |
| 406 matching_types->insert(CREDIT_CARD_EXP_MONTH); | 407 matching_types->insert(CREDIT_CARD_EXP_MONTH); |
| 407 } | 408 } |
| 408 } | 409 } |
| 409 | 410 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 type_ = credit_card.type_; | 495 type_ = credit_card.type_; |
| 495 expiration_month_ = credit_card.expiration_month_; | 496 expiration_month_ = credit_card.expiration_month_; |
| 496 expiration_year_ = credit_card.expiration_year_; | 497 expiration_year_ = credit_card.expiration_year_; |
| 497 | 498 |
| 498 set_guid(credit_card.guid()); | 499 set_guid(credit_card.guid()); |
| 499 set_origin(credit_card.origin()); | 500 set_origin(credit_card.origin()); |
| 500 } | 501 } |
| 501 | 502 |
| 502 bool CreditCard::UpdateFromImportedCard(const CreditCard& imported_card, | 503 bool CreditCard::UpdateFromImportedCard(const CreditCard& imported_card, |
| 503 const std::string& app_locale) { | 504 const std::string& app_locale) { |
| 504 if (this->GetInfo(CREDIT_CARD_NUMBER, app_locale) != | 505 if (this->GetInfo(AutofillType(CREDIT_CARD_NUMBER), app_locale) != |
| 505 imported_card.GetInfo(CREDIT_CARD_NUMBER, app_locale)) { | 506 imported_card.GetInfo(AutofillType(CREDIT_CARD_NUMBER), app_locale)) { |
| 506 return false; | 507 return false; |
| 507 } | 508 } |
| 508 | 509 |
| 509 // Heuristically aggregated data should never overwrite verified data. | 510 // Heuristically aggregated data should never overwrite verified data. |
| 510 // Instead, discard any heuristically aggregated credit cards that disagree | 511 // Instead, discard any heuristically aggregated credit cards that disagree |
| 511 // with explicitly entered data, so that the UI is not cluttered with | 512 // with explicitly entered data, so that the UI is not cluttered with |
| 512 // duplicate cards. | 513 // duplicate cards. |
| 513 if (this->IsVerified() && !imported_card.IsVerified()) | 514 if (this->IsVerified() && !imported_card.IsVerified()) |
| 514 return true; | 515 return true; |
| 515 | 516 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 526 expiration_month_ = imported_card.expiration_month_; | 527 expiration_month_ = imported_card.expiration_month_; |
| 527 expiration_year_ = imported_card.expiration_year_; | 528 expiration_year_ = imported_card.expiration_year_; |
| 528 | 529 |
| 529 return true; | 530 return true; |
| 530 } | 531 } |
| 531 | 532 |
| 532 void CreditCard::FillFormField(const AutofillField& field, | 533 void CreditCard::FillFormField(const AutofillField& field, |
| 533 size_t /*variant*/, | 534 size_t /*variant*/, |
| 534 const std::string& app_locale, | 535 const std::string& app_locale, |
| 535 FormFieldData* field_data) const { | 536 FormFieldData* field_data) const { |
| 536 DCHECK_EQ(CREDIT_CARD, AutofillType(field.type()).group()); | 537 DCHECK_EQ(CREDIT_CARD, field.Type().group()); |
| 537 DCHECK(field_data); | 538 DCHECK(field_data); |
| 538 | 539 |
| 539 if (field_data->form_control_type == "select-one") { | 540 if (field_data->form_control_type == "select-one") { |
| 540 FillSelectControl(field.type(), app_locale, field_data); | 541 FillSelectControl(field.Type(), app_locale, field_data); |
| 541 } else if (field_data->form_control_type == "month") { | 542 } else if (field_data->form_control_type == "month") { |
| 542 // HTML5 input="month" consists of year-month. | 543 // HTML5 input="month" consists of year-month. |
| 543 base::string16 year = GetInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, app_locale); | 544 base::string16 year = |
| 544 base::string16 month = GetInfo(CREDIT_CARD_EXP_MONTH, app_locale); | 545 GetInfo(AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), app_locale); |
| 546 base::string16 month = |
| 547 GetInfo(AutofillType(CREDIT_CARD_EXP_MONTH), app_locale); |
| 545 if (!year.empty() && !month.empty()) { | 548 if (!year.empty() && !month.empty()) { |
| 546 // Fill the value only if |this| includes both year and month | 549 // Fill the value only if |this| includes both year and month |
| 547 // information. | 550 // information. |
| 548 field_data->value = year + ASCIIToUTF16("-") + month; | 551 field_data->value = year + ASCIIToUTF16("-") + month; |
| 549 } | 552 } |
| 550 } else { | 553 } else { |
| 551 field_data->value = GetInfo(field.type(), app_locale); | 554 field_data->value = GetInfo(field.Type(), app_locale); |
| 552 } | 555 } |
| 553 } | 556 } |
| 554 | 557 |
| 555 int CreditCard::Compare(const CreditCard& credit_card) const { | 558 int CreditCard::Compare(const CreditCard& credit_card) const { |
| 556 // The following CreditCard field types are the only types we store in the | 559 // The following CreditCard field types are the only types we store in the |
| 557 // WebDB so far, so we're only concerned with matching these types in the | 560 // WebDB so far, so we're only concerned with matching these types in the |
| 558 // credit card. | 561 // credit card. |
| 559 const AutofillFieldType types[] = { CREDIT_CARD_NAME, | 562 const ServerFieldType types[] = { CREDIT_CARD_NAME, |
| 560 CREDIT_CARD_NUMBER, | 563 CREDIT_CARD_NUMBER, |
| 561 CREDIT_CARD_EXP_MONTH, | 564 CREDIT_CARD_EXP_MONTH, |
| 562 CREDIT_CARD_EXP_4_DIGIT_YEAR }; | 565 CREDIT_CARD_EXP_4_DIGIT_YEAR }; |
| 563 for (size_t index = 0; index < arraysize(types); ++index) { | 566 for (size_t i = 0; i < arraysize(types); ++i) { |
| 564 int comparison = GetRawInfo(types[index]).compare( | 567 int comparison = |
| 565 credit_card.GetRawInfo(types[index])); | 568 GetRawInfo(types[i]).compare(credit_card.GetRawInfo(types[i])); |
| 566 if (comparison != 0) | 569 if (comparison != 0) |
| 567 return comparison; | 570 return comparison; |
| 568 } | 571 } |
| 569 | 572 |
| 570 return 0; | 573 return 0; |
| 571 } | 574 } |
| 572 | 575 |
| 573 bool CreditCard::operator==(const CreditCard& credit_card) const { | 576 bool CreditCard::operator==(const CreditCard& credit_card) const { |
| 574 return guid() == credit_card.guid() && | 577 return guid() == credit_card.guid() && |
| 575 origin() == credit_card.origin() && | 578 origin() == credit_card.origin() && |
| 576 Compare(credit_card) == 0; | 579 Compare(credit_card) == 0; |
| 577 } | 580 } |
| 578 | 581 |
| 579 bool CreditCard::operator!=(const CreditCard& credit_card) const { | 582 bool CreditCard::operator!=(const CreditCard& credit_card) const { |
| 580 return !operator==(credit_card); | 583 return !operator==(credit_card); |
| 581 } | 584 } |
| 582 | 585 |
| 583 bool CreditCard::IsEmpty(const std::string& app_locale) const { | 586 bool CreditCard::IsEmpty(const std::string& app_locale) const { |
| 584 FieldTypeSet types; | 587 ServerFieldTypeSet types; |
| 585 GetNonEmptyTypes(app_locale, &types); | 588 GetNonEmptyTypes(app_locale, &types); |
| 586 return types.empty(); | 589 return types.empty(); |
| 587 } | 590 } |
| 588 | 591 |
| 589 bool CreditCard::IsComplete() const { | 592 bool CreditCard::IsComplete() const { |
| 590 return | 593 return |
| 591 autofill::IsValidCreditCardNumber(number_) && | 594 autofill::IsValidCreditCardNumber(number_) && |
| 592 expiration_month_ != 0 && | 595 expiration_month_ != 0 && |
| 593 expiration_year_ != 0; | 596 expiration_year_ != 0; |
| 594 } | 597 } |
| 595 | 598 |
| 596 bool CreditCard::IsValid() const { | 599 bool CreditCard::IsValid() const { |
| 597 return autofill::IsValidCreditCardNumber(number_) && | 600 return autofill::IsValidCreditCardNumber(number_) && |
| 598 autofill::IsValidCreditCardExpirationDate( | 601 autofill::IsValidCreditCardExpirationDate( |
| 599 expiration_year_, expiration_month_, base::Time::Now()); | 602 expiration_year_, expiration_month_, base::Time::Now()); |
| 600 } | 603 } |
| 601 | 604 |
| 602 void CreditCard::GetSupportedTypes(FieldTypeSet* supported_types) const { | 605 void CreditCard::GetSupportedTypes(ServerFieldTypeSet* supported_types) const { |
| 603 supported_types->insert(CREDIT_CARD_NAME); | 606 supported_types->insert(CREDIT_CARD_NAME); |
| 604 supported_types->insert(CREDIT_CARD_NUMBER); | 607 supported_types->insert(CREDIT_CARD_NUMBER); |
| 605 supported_types->insert(CREDIT_CARD_TYPE); | 608 supported_types->insert(CREDIT_CARD_TYPE); |
| 606 supported_types->insert(CREDIT_CARD_EXP_MONTH); | 609 supported_types->insert(CREDIT_CARD_EXP_MONTH); |
| 607 supported_types->insert(CREDIT_CARD_EXP_2_DIGIT_YEAR); | 610 supported_types->insert(CREDIT_CARD_EXP_2_DIGIT_YEAR); |
| 608 supported_types->insert(CREDIT_CARD_EXP_4_DIGIT_YEAR); | 611 supported_types->insert(CREDIT_CARD_EXP_4_DIGIT_YEAR); |
| 609 supported_types->insert(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR); | 612 supported_types->insert(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR); |
| 610 supported_types->insert(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR); | 613 supported_types->insert(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR); |
| 611 } | 614 } |
| 612 | 615 |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 const char* const kAmericanExpressCard = "americanExpressCC"; | 704 const char* const kAmericanExpressCard = "americanExpressCC"; |
| 702 const char* const kDinersCard = "dinersCC"; | 705 const char* const kDinersCard = "dinersCC"; |
| 703 const char* const kDiscoverCard = "discoverCC"; | 706 const char* const kDiscoverCard = "discoverCC"; |
| 704 const char* const kGenericCard = "genericCC"; | 707 const char* const kGenericCard = "genericCC"; |
| 705 const char* const kJCBCard = "jcbCC"; | 708 const char* const kJCBCard = "jcbCC"; |
| 706 const char* const kMasterCard = "masterCardCC"; | 709 const char* const kMasterCard = "masterCardCC"; |
| 707 const char* const kUnionPay = "unionPayCC"; | 710 const char* const kUnionPay = "unionPayCC"; |
| 708 const char* const kVisaCard = "visaCC"; | 711 const char* const kVisaCard = "visaCC"; |
| 709 | 712 |
| 710 } // namespace autofill | 713 } // namespace autofill |
| OLD | NEW |