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 a2ad411eb6103c197bbb6e6959d6b707bbe00c39..ae3e2773a0c2ea5d47c5e33612654ae843e5564a 100644 |
--- a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc |
+++ b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc |
@@ -106,6 +106,10 @@ bool DetailInputMatchesField(const DetailInput& input, |
return InputTypeMatchesFieldType(input, field) && right_section; |
} |
+bool IsCreditCardType(AutofillFieldType type) { |
+ return AutofillType(type).group() == AutofillType::CREDIT_CARD; |
+} |
+ |
// Returns true if |input| should be used to fill a site-requested |field| which |
// is notated with a "shipping" tag, for use when the user has decided to use |
// the billing address as the shipping address. |
@@ -166,14 +170,14 @@ void GetBillingInfoFromOutputs(const DetailOutputMap& output, |
// Special case CVC as CreditCard just swallows it. |
if (it->first->type == CREDIT_CARD_VERIFICATION_CODE) { |
- *cvc = trimmed; |
+ cvc->assign(trimmed); |
} else { |
// Copy the credit card name to |profile| in addition to |card| as |
// wallet::Instrument requires a recipient name for its billing address. |
if (it->first->type == CREDIT_CARD_NAME) |
profile->SetRawInfo(NAME_FULL, trimmed); |
- if (AutofillType(it->first->type).group() == AutofillType::CREDIT_CARD) |
+ if (IsCreditCardType(it->first->type)) |
card->SetRawInfo(it->first->type, trimmed); |
else |
profile->SetRawInfo(it->first->type, trimmed); |
@@ -595,16 +599,24 @@ scoped_ptr<DataModelWrapper> AutofillDialogControllerImpl::CreateWrapper( |
return wrapper.Pass(); |
if (IsPayingWithWallet()) { |
- int index; |
- bool success = base::StringToInt(item_key, &index); |
- DCHECK(success); |
- |
- if (section == SECTION_CC_BILLING) { |
- wrapper.reset( |
- new WalletInstrumentWrapper(wallet_items_->instruments()[index])); |
+ // Use |full_wallet_| if it exists as it has unmasked data. |
+ if (full_wallet_.get()) { |
+ if (section == SECTION_CC_BILLING) |
+ wrapper.reset(new FullWalletBillingWrapper(full_wallet_.get())); |
+ else |
+ wrapper.reset(new FullWalletShippingWrapper(full_wallet_.get())); |
} else { |
- wrapper.reset( |
- new WalletAddressWrapper(wallet_items_->addresses()[index])); |
+ int index; |
+ bool success = base::StringToInt(item_key, &index); |
+ DCHECK(success); |
+ |
+ if (section == SECTION_CC_BILLING) { |
+ wrapper.reset( |
+ new WalletInstrumentWrapper(wallet_items_->instruments()[index])); |
+ } else { |
+ wrapper.reset( |
+ new WalletAddressWrapper(wallet_items_->addresses()[index])); |
+ } |
} |
} else if (section == SECTION_CC) { |
CreditCard* card = GetManager()->GetCreditCardByGUID(item_key); |
@@ -1070,19 +1082,10 @@ void AutofillDialogControllerImpl::OnDidGetFullWallet( |
// TODO(dbeam): handle more required actions. |
full_wallet_ = full_wallet.Pass(); |
- if (!full_wallet_->HasRequiredAction(wallet::VERIFY_CVV)) { |
+ if (full_wallet_->HasRequiredAction(wallet::VERIFY_CVV)) |
+ DisableWallet(); |
+ else |
FinishSubmit(); |
- return; |
- } |
- |
- // TODO(dbeam): pause this flow to ask for a CVC from the user? |
- DetailOutputMap output; |
- view_->GetUserInput(SECTION_CC_BILLING, &output); |
- |
- wallet_client_.AuthenticateInstrument( |
- active_instrument_id_, |
- UTF16ToUTF8(GetValueForType(output, CREDIT_CARD_VERIFICATION_CODE)), |
- wallet_items_->obfuscated_gaia_id()); |
} |
void AutofillDialogControllerImpl::OnDidGetWalletItems( |
@@ -1183,10 +1186,8 @@ bool AutofillDialogControllerImpl::RequestingCreditCardInfo() const { |
DCHECK_GT(form_structure_.field_count(), 0U); |
for (size_t i = 0; i < form_structure_.field_count(); ++i) { |
- if (AutofillType(form_structure_.field(i)->type()).group() == |
- AutofillType::CREDIT_CARD) { |
+ if (IsCreditCardType(form_structure_.field(i)->type())) |
return true; |
- } |
} |
return false; |
@@ -1329,52 +1330,47 @@ void AutofillDialogControllerImpl::FillOutputForSectionWithComparator( |
if (!SectionIsActive(section)) |
return; |
- if (!IsManuallyEditingSection(section)) { |
- if (section == SECTION_CC_BILLING) { |
- // TODO(dbeam): implement. |
- } else { |
- scoped_ptr<DataModelWrapper> model = CreateWrapper(section); |
- // Only fill in data that is associated with this section. |
- const DetailInputs& inputs = RequestedFieldsForSection(section); |
- model->FillFormStructure(inputs, compare, &form_structure_); |
- |
- // CVC needs special-casing because the CreditCard class doesn't store |
- // or handle them. |
- if (section == SECTION_CC) |
- SetCvcResult(view_->GetCvc()); |
- } |
+ // Fill the combined credit card and billing section from |full_wallet_| (via |
+ // |CreateWrapper()|) as card number and CVC are auto-generated. |
+ if (!IsManuallyEditingSection(section) || section == SECTION_CC_BILLING) { |
+ scoped_ptr<DataModelWrapper> model = CreateWrapper(section); |
+ // Only fill in data that is associated with this section. |
+ const DetailInputs& inputs = RequestedFieldsForSection(section); |
+ model->FillFormStructure(inputs, compare, &form_structure_); |
+ |
+ // CVC needs special-casing because the CreditCard class doesn't store or |
+ // handle them. This isn't necessary when filling the combined CC and |
+ // billing section as CVC comes from |full_wallet_| in this case. |
+ if (section == SECTION_CC) |
+ SetCvcResult(view_->GetCvc()); |
} else { |
- // The user manually input data. |
+ // The user manually input data. If using Autofill, save the info as new or |
+ // edited data. Always fill local data into |form_structure_|. |
DetailOutputMap output; |
view_->GetUserInput(section, &output); |
- if (IsPayingWithWallet()) { |
- // TODO(dbeam): implement. |
- } else { |
- // Save the info as new or edited data and fill it into |form_structure_|. |
- if (section == SECTION_CC) { |
- CreditCard card; |
- FillFormGroupFromOutputs(output, &card); |
+ if (section == SECTION_CC) { |
+ CreditCard card; |
+ FillFormGroupFromOutputs(output, &card); |
- if (view_->SaveDetailsLocally()) |
- GetManager()->SaveImportedCreditCard(card); |
+ if (ShouldSaveDetailsLocally()) |
+ GetManager()->SaveImportedCreditCard(card); |
- FillFormStructureForSection(card, 0, section, compare); |
+ FillFormStructureForSection(card, 0, section, compare); |
- // Again, CVC needs special-casing. Fill it in directly from |output|. |
- SetCvcResult(GetValueForType(output, CREDIT_CARD_VERIFICATION_CODE)); |
- } else { |
- AutofillProfile profile; |
- FillFormGroupFromOutputs(output, &profile); |
+ // Again, CVC needs special-casing. Fill it in directly from |output|. |
+ SetCvcResult(GetValueForType(output, CREDIT_CARD_VERIFICATION_CODE)); |
+ } else { |
+ AutofillProfile profile; |
+ FillFormGroupFromOutputs(output, &profile); |
- // TODO(estade): we should probably edit the existing profile in the |
- // cases where the input data is based on an existing profile (user |
- // clicked "Edit" or autofill popup filled in the form). |
- if (view_->SaveDetailsLocally()) |
- GetManager()->SaveImportedProfile(profile); |
+ // TODO(estade): we should probably edit the existing profile in the |
+ // cases where the input data is based on an existing profile (user |
+ // clicked "Edit" or autofill popup filled in the form). |
+ if (ShouldSaveDetailsLocally()) |
+ GetManager()->SaveImportedProfile(profile); |
- FillFormStructureForSection(profile, 0, section, compare); |
- } |
+ FillFormStructureForSection(profile, 0, section, compare); |
} |
} |
} |
@@ -1498,7 +1494,7 @@ bool AutofillDialogControllerImpl::IsManuallyEditingSection( |
GetItemKeyForCheckedItem().empty(); |
} |
-bool AutofillDialogControllerImpl::UseBillingForShipping() { |
+bool AutofillDialogControllerImpl::ShouldUseBillingForShipping() { |
// If the user is editing or inputting data, ask the view. |
if (IsManuallyEditingSection(SECTION_SHIPPING)) |
return view_->UseBillingForShipping(); |
@@ -1508,6 +1504,13 @@ bool AutofillDialogControllerImpl::UseBillingForShipping() { |
return false; |
} |
+bool AutofillDialogControllerImpl::ShouldSaveDetailsLocally() { |
+ // It's possible that the user checked [X] Save details locally before |
+ // switching payment methods, so only ask the view whether to save details |
+ // locally if that checkbox is showing (currently if not paying with wallet). |
+ return !IsPayingWithWallet() && view_->SaveDetailsLocally(); |
+} |
+ |
void AutofillDialogControllerImpl::SubmitWithWallet() { |
// TODO(dbeam): disallow interacting with the dialog while submitting. |
@@ -1525,7 +1528,7 @@ void AutofillDialogControllerImpl::SubmitWithWallet() { |
active_instrument_id_ = active_instrument->object_id(); |
// TODO(dbeam): does re-using instrument address IDs work? |
- if (UseBillingForShipping()) |
+ if (ShouldUseBillingForShipping()) |
active_address_id_ = active_instrument->address().object_id(); |
} |
} |
@@ -1566,7 +1569,7 @@ void AutofillDialogControllerImpl::SubmitWithWallet() { |
scoped_ptr<wallet::Address> new_address; |
if (active_address_id_.empty()) { |
- if (UseBillingForShipping() && new_instrument.get()) { |
+ if (ShouldUseBillingForShipping() && new_instrument.get()) { |
new_address.reset(new wallet::Address(new_instrument->address())); |
} else { |
DetailOutputMap output; |
@@ -1617,7 +1620,7 @@ void AutofillDialogControllerImpl::FinishSubmit() { |
FillOutputForSection(SECTION_CC); |
FillOutputForSection(SECTION_BILLING); |
FillOutputForSection(SECTION_CC_BILLING); |
- if (UseBillingForShipping()) { |
+ if (ShouldUseBillingForShipping()) { |
FillOutputForSectionWithComparator( |
SECTION_BILLING, |
base::Bind(DetailInputMatchesShippingField)); |