[Autofill] Credit Card validation for rAc.
Validate all things credit card. (Number, CSC, Expiration)
BUG=170467
Review URL: https://chromiumcodereview.appspot.com/12213077
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@181861 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/autofill/validation.cc b/chrome/browser/autofill/validation.cc
index ad34b312..a0072111 100644
--- a/chrome/browser/autofill/validation.cc
+++ b/chrome/browser/autofill/validation.cc
@@ -45,4 +45,17 @@
return (sum % 10) == 0;
}
+bool IsValidCreditCardSecurityCode(const string16& text) {
+ if (text.size() < 3U || text.size() > 4U)
+ return false;
+
+ for (string16::const_iterator iter = text.begin();
+ iter != text.end();
+ ++iter) {
+ if (!IsAsciiDigit(*iter))
+ return false;
+ }
+ return true;
+}
+
} // namespace autofill
diff --git a/chrome/browser/autofill/validation.h b/chrome/browser/autofill/validation.h
index f8e923b..93557b7 100644
--- a/chrome/browser/autofill/validation.h
+++ b/chrome/browser/autofill/validation.h
@@ -13,6 +13,9 @@
// Uses the Luhn formula to validate the number.
bool IsValidCreditCardNumber(const string16& text);
+// Returns true if |text| looks like a valid credit card security code.
+bool IsValidCreditCardSecurityCode(const string16& text);
+
} // namespace autofill
#endif // CHROME_BROWSER_AUTOFILL_VALIDATION_H_
diff --git a/chrome/browser/autofill/validation_unittest.cc b/chrome/browser/autofill/validation_unittest.cc
index bb94a0f..6e67b861 100644
--- a/chrome/browser/autofill/validation_unittest.cc
+++ b/chrome/browser/autofill/validation_unittest.cc
@@ -34,7 +34,15 @@
"4111-1111-1111-1110", /* wrong Luhn checksum */
"3056 9309 0259 04aa", /* non-digit characters */
};
-
+const char* const kValidCreditCardSecurityCode[] = {
+ "323", // 3-digit CSC.
+ "3234", // 4-digit CSC.
+};
+const char* const kInvalidCreditCardSecurityCode[] = {
+ "32", // CSC too short.
+ "12345", // CSC too long.
+ "asd", // non-numeric CSC.
+};
} // namespace
TEST(AutofillValidation, IsValidCreditCardNumber) {
@@ -49,3 +57,19 @@
autofill::IsValidCreditCardNumber(ASCIIToUTF16(kInvalidNumbers[i])));
}
}
+
+TEST(AutofillValidation, IsValidCreditCardSecurityCode) {
+ for (size_t i = 0; i < arraysize(kValidCreditCardSecurityCode); ++i) {
+ SCOPED_TRACE(kValidCreditCardSecurityCode[i]);
+ EXPECT_TRUE(
+ autofill::IsValidCreditCardSecurityCode(
+ ASCIIToUTF16(kValidCreditCardSecurityCode[i])));
+ }
+ for (size_t i = 0; i < arraysize(kInvalidCreditCardSecurityCode); ++i) {
+ SCOPED_TRACE(kInvalidCreditCardSecurityCode[i]);
+ EXPECT_FALSE(
+ autofill::IsValidCreditCardSecurityCode(
+ ASCIIToUTF16(kInvalidCreditCardSecurityCode[i])));
+ }
+}
+
diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
index a6e86b0e..041df4c0 100644
--- a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
+++ b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
@@ -423,11 +423,33 @@
bool AutofillDialogControllerImpl::InputIsValid(AutofillFieldType type,
const string16& value) {
- // TODO(groby): Add the missing checks.
switch (type) {
+ case EMAIL_ADDRESS:
+ // TODO(groby): Add the missing check.
+ break;
+
case CREDIT_CARD_NUMBER:
return autofill::IsValidCreditCardNumber(value);
+ case CREDIT_CARD_NAME:
+ break;
+ case CREDIT_CARD_EXP_MONTH:
+ case CREDIT_CARD_EXP_4_DIGIT_YEAR:
+ NOTREACHED(); // Validation is not called for <select>
+ break;
+ case CREDIT_CARD_VERIFICATION_CODE:
+ return autofill::IsValidCreditCardSecurityCode(value);
+
+ case ADDRESS_HOME_LINE1:
+ break;
+ case ADDRESS_HOME_LINE2:
+ return true; // Line 2 is optional - always valid.
+ case ADDRESS_HOME_CITY:
+ case ADDRESS_HOME_STATE:
+ case ADDRESS_HOME_ZIP:
+ break;
+
default:
+ NOTREACHED(); // Trying to validate unknown field.
break;
}