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_field.h" | 5 #include "components/autofill/core/browser/credit_card_field.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 expiration_year_ = scanner->Cursor(); | 418 expiration_year_ = scanner->Cursor(); |
419 scanner->Advance(); | 419 scanner->Advance(); |
420 return true; | 420 return true; |
421 } | 421 } |
422 expiration_month_ = nullptr; | 422 expiration_month_ = nullptr; |
423 expiration_year_ = nullptr; | 423 expiration_year_ = nullptr; |
424 } | 424 } |
425 | 425 |
426 // If that fails, do a general regex search. | 426 // If that fails, do a general regex search. |
427 scanner->RewindTo(month_year_saved_cursor); | 427 scanner->RewindTo(month_year_saved_cursor); |
428 const int kMatchTelAndSelect = MATCH_DEFAULT | MATCH_TELEPHONE | MATCH_SELECT; | 428 const int kMatchNumAndTelAndSelect = |
429 if (ParseFieldSpecifics(scanner, | 429 MATCH_DEFAULT | MATCH_NUMBER | MATCH_TELEPHONE | MATCH_SELECT; |
430 base::UTF8ToUTF16(kExpirationMonthRe), | 430 if (ParseFieldSpecifics(scanner, base::UTF8ToUTF16(kExpirationMonthRe), |
431 kMatchTelAndSelect, | 431 kMatchNumAndTelAndSelect, &expiration_month_) && |
432 &expiration_month_) && | 432 ParseFieldSpecifics(scanner, base::UTF8ToUTF16(kExpirationYearRe), |
433 ParseFieldSpecifics(scanner, | 433 kMatchNumAndTelAndSelect, &expiration_year_)) { |
434 base::UTF8ToUTF16(kExpirationYearRe), | |
435 kMatchTelAndSelect, | |
436 &expiration_year_)) { | |
437 return true; | 434 return true; |
438 } | 435 } |
439 | 436 |
440 // If that fails, look for just MM and/or YY(YY). | 437 // If that fails, look for just MM and/or YY(YY). |
441 scanner->RewindTo(month_year_saved_cursor); | 438 scanner->RewindTo(month_year_saved_cursor); |
442 if (ParseFieldSpecifics(scanner, | 439 if (ParseFieldSpecifics(scanner, base::ASCIIToUTF16("^mm$"), |
443 base::ASCIIToUTF16("^mm$"), | 440 kMatchNumAndTelAndSelect, &expiration_month_) && |
444 kMatchTelAndSelect, | 441 ParseFieldSpecifics(scanner, base::ASCIIToUTF16("^(yy|yyyy)$"), |
445 &expiration_month_) && | 442 kMatchNumAndTelAndSelect, &expiration_year_)) { |
446 ParseFieldSpecifics(scanner, | |
447 base::ASCIIToUTF16("^(yy|yyyy)$"), | |
448 kMatchTelAndSelect, | |
449 &expiration_year_)) { | |
450 return true; | 443 return true; |
451 } | 444 } |
452 | 445 |
453 // If that fails, try to parse a combined expiration field. | 446 // If that fails, try to parse a combined expiration field. |
454 // We allow <select> fields, because they're used e.g. on qvc.com. | 447 // We allow <select> fields, because they're used e.g. on qvc.com. |
455 scanner->RewindTo(month_year_saved_cursor); | 448 scanner->RewindTo(month_year_saved_cursor); |
456 | 449 |
457 // Bail out if the field cannot fit a 2-digit year expiration date. | 450 // Bail out if the field cannot fit a 2-digit year expiration date. |
458 const int current_field_max_length = scanner->Cursor()->max_length; | 451 const int current_field_max_length = scanner->Cursor()->max_length; |
459 if (!FieldCanFitDataForFieldType(current_field_max_length, | 452 if (!FieldCanFitDataForFieldType(current_field_max_length, |
460 CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR)) { | 453 CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR)) |
461 return false; | 454 return false; |
462 } | |
463 | 455 |
464 // Try to look for a 2-digit year expiration date. | 456 // Try to look for a 2-digit year expiration date. |
465 if (ParseFieldSpecifics(scanner, | 457 if (ParseFieldSpecifics(scanner, |
466 base::UTF8ToUTF16(kExpirationDate2DigitYearRe), | 458 base::UTF8ToUTF16(kExpirationDate2DigitYearRe), |
467 kMatchTelAndSelect, | 459 kMatchNumAndTelAndSelect, &expiration_date_)) { |
468 &expiration_date_)) { | |
469 exp_year_type_ = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR; | 460 exp_year_type_ = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR; |
470 expiration_month_ = nullptr; | 461 expiration_month_ = nullptr; |
471 return true; | 462 return true; |
472 } | 463 } |
473 | 464 |
474 // Try to look for a generic expiration date field. (2 or 4 digit year) | 465 // Try to look for a generic expiration date field. (2 or 4 digit year) |
475 if (ParseFieldSpecifics(scanner, | 466 if (ParseFieldSpecifics(scanner, base::UTF8ToUTF16(kExpirationDateRe), |
476 base::UTF8ToUTF16(kExpirationDateRe), | 467 kMatchNumAndTelAndSelect, &expiration_date_)) { |
477 kMatchTelAndSelect, | |
478 &expiration_date_)) { | |
479 // If such a field exists, but it cannot fit a 4-digit year expiration | 468 // If such a field exists, but it cannot fit a 4-digit year expiration |
480 // date, then the likely possibility is that it is a 2-digit year expiration | 469 // date, then the likely possibility is that it is a 2-digit year expiration |
481 // date. | 470 // date. |
482 if (!FieldCanFitDataForFieldType(current_field_max_length, | 471 if (!FieldCanFitDataForFieldType(current_field_max_length, |
483 CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR)) { | 472 CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR)) { |
484 exp_year_type_ = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR; | 473 exp_year_type_ = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR; |
485 } | 474 } |
486 expiration_month_ = nullptr; | 475 expiration_month_ = nullptr; |
487 return true; | 476 return true; |
488 } | 477 } |
489 | 478 |
490 // Try to look for a 4-digit year expiration date. | 479 // Try to look for a 4-digit year expiration date. |
491 if (FieldCanFitDataForFieldType(current_field_max_length, | 480 if (FieldCanFitDataForFieldType(current_field_max_length, |
492 CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR) && | 481 CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR) && |
493 ParseFieldSpecifics(scanner, | 482 ParseFieldSpecifics(scanner, |
494 base::UTF8ToUTF16(kExpirationDate4DigitYearRe), | 483 base::UTF8ToUTF16(kExpirationDate4DigitYearRe), |
495 kMatchTelAndSelect, | 484 kMatchNumAndTelAndSelect, &expiration_date_)) { |
496 &expiration_date_)) { | |
497 expiration_month_ = nullptr; | 485 expiration_month_ = nullptr; |
498 return true; | 486 return true; |
499 } | 487 } |
500 | 488 |
501 return false; | 489 return false; |
502 } | 490 } |
503 | 491 |
504 ServerFieldType CreditCardField::GetExpirationYearType() const { | 492 ServerFieldType CreditCardField::GetExpirationYearType() const { |
505 return (expiration_date_ | 493 return (expiration_date_ |
506 ? exp_year_type_ | 494 ? exp_year_type_ |
507 : ((expiration_year_ && expiration_year_->max_length == 2) | 495 : ((expiration_year_ && expiration_year_->max_length == 2) |
508 ? CREDIT_CARD_EXP_2_DIGIT_YEAR | 496 ? CREDIT_CARD_EXP_2_DIGIT_YEAR |
509 : CREDIT_CARD_EXP_4_DIGIT_YEAR)); | 497 : CREDIT_CARD_EXP_4_DIGIT_YEAR)); |
510 } | 498 } |
511 | 499 |
512 bool CreditCardField::HasExpiration() const { | 500 bool CreditCardField::HasExpiration() const { |
513 return expiration_date_ || (expiration_month_ && expiration_year_); | 501 return expiration_date_ || (expiration_month_ && expiration_year_); |
514 } | 502 } |
515 | 503 |
516 } // namespace autofill | 504 } // namespace autofill |
OLD | NEW |