Chromium Code Reviews| Index: chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc |
| diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc |
| index 1d301d479fbc024da7f74e66bdc2fa86467bb1b1..c9578751da3d958f756115077bf8e6f28f16b36c 100644 |
| --- a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc |
| +++ b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc |
| @@ -1226,9 +1226,11 @@ ValidityData AutofillDialogControllerImpl::InputsAreValid( |
| std::map<AutofillFieldType, string16> field_values; |
| for (DetailOutputMap::const_iterator iter = inputs.begin(); |
| iter != inputs.end(); ++iter) { |
| - // Skip empty fields in edit mode. |
| - if (validation_type == VALIDATE_EDIT && iter->second.empty()) |
| + // Skip empty fields in edit mode or when selecting a suggestion. |
| + if ((validation_type == VALIDATE_EDIT || |
| + validation_type == VALIDATE_SUGGESTION) && iter->second.empty()) { |
|
Evan Stade
2013/06/01 00:39:19
I thought you suggested we could get rid of this
Dan Beam
2013/06/01 01:15:04
Done.
|
| continue; |
| + } |
| const AutofillFieldType type = iter->first->type; |
| string16 message = InputValidityMessage(type, iter->second); |
| @@ -1240,30 +1242,26 @@ ValidityData AutofillDialogControllerImpl::InputsAreValid( |
| // Validate the date formed by month and year field. (Autofill dialog is |
| // never supposed to have 2-digit years, so not checked). |
| - if (field_values.count(CREDIT_CARD_EXP_MONTH) && |
| - field_values.count(CREDIT_CARD_EXP_4_DIGIT_YEAR)) { |
| - if (!autofill::IsValidCreditCardExpirationDate( |
| - field_values[CREDIT_CARD_EXP_4_DIGIT_YEAR], |
| - field_values[CREDIT_CARD_EXP_MONTH], |
| - base::Time::Now())) { |
| - invalid_messages[CREDIT_CARD_EXP_MONTH] = |
| - ASCIIToUTF16("more complicated message"); |
| - invalid_messages[CREDIT_CARD_EXP_4_DIGIT_YEAR] = |
| - ASCIIToUTF16("more complicated message"); |
| - } |
| + if (field_values.count(CREDIT_CARD_EXP_4_DIGIT_YEAR) && |
| + field_values.count(CREDIT_CARD_EXP_MONTH) && |
| + !IsCCExpirationValid(field_values[CREDIT_CARD_EXP_4_DIGIT_YEAR], |
| + field_values[CREDIT_CARD_EXP_MONTH])) { |
| + invalid_messages[CREDIT_CARD_EXP_4_DIGIT_YEAR] = |
| + ASCIIToUTF16("more complicated message"); |
| + invalid_messages[CREDIT_CARD_EXP_MONTH] = |
| + ASCIIToUTF16("more complicated message"); |
| } |
| // If there is a credit card number and a CVC, validate them together. |
| if (field_values.count(CREDIT_CARD_NUMBER) && |
| field_values.count(CREDIT_CARD_VERIFICATION_CODE) && |
| InputValidityMessage(CREDIT_CARD_NUMBER, |
| - field_values[CREDIT_CARD_NUMBER]).empty()) { |
| - if (!autofill::IsValidCreditCardSecurityCode( |
| - field_values[CREDIT_CARD_VERIFICATION_CODE], |
| - field_values[CREDIT_CARD_NUMBER])) { |
| - invalid_messages[CREDIT_CARD_VERIFICATION_CODE] = |
| - ASCIIToUTF16("CVC doesn't match card type!"); |
| - } |
| + field_values[CREDIT_CARD_NUMBER]).empty() && |
| + !autofill::IsValidCreditCardSecurityCode( |
| + field_values[CREDIT_CARD_VERIFICATION_CODE], |
| + field_values[CREDIT_CARD_NUMBER])) { |
| + invalid_messages[CREDIT_CARD_VERIFICATION_CODE] = |
| + ASCIIToUTF16("CVC doesn't match card type!"); |
| } |
| // Validate the phone number against the country code of the address. |
| @@ -2418,6 +2416,35 @@ bool AutofillDialogControllerImpl::SectionIsValid( |
| return InputsAreValid(detail_outputs, VALIDATE_EDIT).empty(); |
| } |
| +bool AutofillDialogControllerImpl::IsCCExpirationValid( |
|
Dan Beam
2013/06/01 00:25:56
whoops, return values are inverted, fixing
Evan Stade
2013/06/01 00:39:19
nit: IsCreditCardExpirationValid (preferred) or Is
|
| + const base::string16& year, |
| + const base::string16& month) const { |
| + // If the expiration is in the past as per the local clock, it's invalid. |
| + base::Time now = base::Time::Now(); |
| + if (!autofill::IsValidCreditCardExpirationDate(year, month, now)) |
| + return true; |
| + |
| + if (IsPayingWithWallet() && IsEditingExistingData(SECTION_CC_BILLING)) { |
| + const SuggestionsMenuModel* model = |
| + SuggestionsMenuModelForSection(SECTION_CC_BILLING); |
| + int instrument_index = -1; |
| + base::StringToInt(model->GetItemKeyForCheckedItem(), &instrument_index); |
|
Evan Stade
2013/06/01 00:39:19
I see a lot of uses of StringToInt in this file fo
|
| + const wallet::WalletItems::MaskedInstrument* instrument = |
| + wallet_items_->instruments()[instrument_index]; |
| + const std::string& locale = g_browser_process->GetApplicationLocale(); |
| + if (instrument->status() == |
| + wallet::WalletItems::MaskedInstrument::EXPIRED && |
| + year == instrument->GetInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, locale) && |
| + month == instrument->GetInfo(CREDIT_CARD_EXP_MONTH, locale)) { |
| + // Otherwise, if the user is editing an instrument that's deemed expired |
| + // by the Online Wallet server, mark it invalid on selection. |
| + return true; |
| + } |
| + } |
| + |
| + return false; |
| +} |
| + |
| bool AutofillDialogControllerImpl::ShouldUseBillingForShipping() { |
| return suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey; |
| } |