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 |