Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(149)

Side by Side Diff: components/autofill/core/browser/credit_card_field.cc

Issue 2892813003: Add MATCH_NUMBER to match types when parsing expiration date form field. (Closed)
Patch Set: adds unit-test. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | components/autofill/core/browser/credit_card_field_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « no previous file | components/autofill/core/browser/credit_card_field_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698