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

Unified Diff: chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc

Issue 12815002: requestAutocomplete: Fill |form_structure_| from Online Wallet data (including (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 9 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 side-by-side diff with in-line comments
Download patch
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..bfa545024510c9c9023bac86549dcd0f94f76b09 100644
--- a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
+++ b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
@@ -106,6 +106,20 @@ bool DetailInputMatchesField(const DetailInput& input,
return InputTypeMatchesFieldType(input, field) && right_section;
}
+bool CreditCardType(AutofillFieldType type) {
Ilya Sherman 2013/03/14 21:59:08 nit: IsCreditCardType
Dan Beam 2013/03/14 23:49:35 Done.
+ return AutofillType(type).group() == AutofillType::CREDIT_CARD;
+}
+
+bool DetailInputMatchesCreditCard(const DetailInput& input,
+ const AutofillField& field) {
+ return DetailInputMatchesField(input, field) && CreditCardType(input.type);
+}
+
+bool DetailInputMatchesBilling(const DetailInput& input,
+ const AutofillField& field) {
+ return DetailInputMatchesField(input, field) && !CreditCardType(input.type);
+}
+
// 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.
@@ -159,6 +173,10 @@ void GetBillingInfoFromOutputs(const DetailOutputMap& output,
CreditCard* card,
string16* cvc,
AutofillProfile* profile) {
+ DCHECK(card);
+ DCHECK(cvc);
+ DCHECK(profile);
Ilya Sherman 2013/03/14 21:59:08 These don't seem very helpful, since you dereferen
Dan Beam 2013/03/14 23:49:35 Done.
+
for (DetailOutputMap::const_iterator it = output.begin();
it != output.end(); ++it) {
string16 trimmed;
@@ -166,14 +184,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);
Ilya Sherman 2013/03/14 21:59:08 Just curious, why did you change this?
Dan Beam 2013/03/14 23:49:35 seemed like this is the intended API, akin to sayi
} 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 (CreditCardType(it->first->type))
card->SetRawInfo(it->first->type, trimmed);
else
profile->SetRawInfo(it->first->type, trimmed);
@@ -595,16 +613,23 @@ 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]));
+ if (did_submit_ && 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]));
+ }
}
Ilya Sherman 2013/03/14 21:59:08 nit: Some docs for the code flow logic here would
Dan Beam 2013/03/14 23:49:35 Done.
} else if (section == SECTION_CC) {
CreditCard* card = GetManager()->GetCreditCardByGUID(item_key);
@@ -1183,10 +1208,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 (CreditCardType(form_structure_.field(i)->type()))
return true;
- }
}
return false;
@@ -1330,51 +1353,56 @@ void AutofillDialogControllerImpl::FillOutputForSectionWithComparator(
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());
- }
+ 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)
Ilya Sherman 2013/03/14 21:59:08 Should this apply to SECTION_CC_BILLING as well?
Dan Beam 2013/03/14 23:49:35 No, we need to get the CVC from |full_wallet_|; ad
+ 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.
+ if (section == SECTION_CC_BILLING) {
+ CreditCard card;
+ string16 cvc;
+ AutofillProfile profile;
+ GetBillingInfoFromOutputs(output, &card, &cvc, &profile);
+
+ // |card| and |profile| can't be asked for the wrong types without
+ // DCHECK()'ing, so we split the filling into CC and non-CC.
+ FillFormStructureForSection(card, 0, section,
+ base::Bind(DetailInputMatchesCreditCard));
+ FillFormStructureForSection(profile, 0, section,
+ base::Bind(DetailInputMatchesBilling));
+ SetCvcResult(cvc);
+ } else if (section == SECTION_CC) {
+ CreditCard card;
+ FillFormGroupFromOutputs(output, &card);
+
+ if (ShouldSaveDetailsLocally())
+ GetManager()->SaveImportedCreditCard(card);
+
+ FillFormStructureForSection(card, 0, section, compare);
+
+ // Again, CVC needs special-casing. Fill it in directly from |output|.
+ SetCvcResult(GetValueForType(output, CREDIT_CARD_VERIFICATION_CODE));
} else {
Ilya Sherman 2013/03/14 21:59:08 Can you DCHECK that the section is the one you exp
Dan Beam 2013/03/14 23:49:35 This hunk of the diff was reverted and now it'd be
- // Save the info as new or edited data and fill it into |form_structure_|.
- if (section == SECTION_CC) {
- CreditCard card;
- FillFormGroupFromOutputs(output, &card);
-
- if (view_->SaveDetailsLocally())
- GetManager()->SaveImportedCreditCard(card);
-
- 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);
+ 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 +1526,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 +1536,10 @@ bool AutofillDialogControllerImpl::UseBillingForShipping() {
return false;
}
+bool AutofillDialogControllerImpl::ShouldSaveDetailsLocally() {
+ return !IsPayingWithWallet() && view_->SaveDetailsLocally();
Ilya Sherman 2013/03/14 21:59:08 nit: Please include a comment explaining why we ne
Dan Beam 2013/03/14 23:49:35 Done.
+}
+
void AutofillDialogControllerImpl::SubmitWithWallet() {
// TODO(dbeam): disallow interacting with the dialog while submitting.
@@ -1525,7 +1557,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 +1598,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 +1649,7 @@ void AutofillDialogControllerImpl::FinishSubmit() {
FillOutputForSection(SECTION_CC);
FillOutputForSection(SECTION_BILLING);
FillOutputForSection(SECTION_CC_BILLING);
- if (UseBillingForShipping()) {
+ if (ShouldUseBillingForShipping()) {
FillOutputForSectionWithComparator(
SECTION_BILLING,
base::Bind(DetailInputMatchesShippingField));

Powered by Google App Engine
This is Rietveld 408576698