Index: chrome/browser/ui/autofill/autofill_dialog_controller.cc |
diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller.cc b/chrome/browser/ui/autofill/autofill_dialog_controller.cc |
index 0aa8aa8132421e2ea0bfde025963b7a4e0f1bc5b..be941480a5ea3ade6b8de06d9e8bde555903d0a7 100644 |
--- a/chrome/browser/ui/autofill/autofill_dialog_controller.cc |
+++ b/chrome/browser/ui/autofill/autofill_dialog_controller.cc |
@@ -320,9 +320,11 @@ void AutofillDialogController::ViewClosed(DialogAction action) { |
} else { |
FillOutputForSection(SECTION_SHIPPING); |
} |
+ callback_.Run(&form_structure_); |
+ } else { |
+ callback_.Run(NULL); |
Dan Beam
2012/12/04 03:31:51
this part lgtm :)
|
} |
- callback_.Run(&form_structure_); |
delete this; |
} |
@@ -389,47 +391,41 @@ void AutofillDialogController::FillOutputForSectionWithComparator( |
if (!form_group) |
return; |
- for (size_t i = 0; i < form_structure_.field_count(); ++i) { |
- AutofillField* field = form_structure_.field(i); |
- // Only fill in data that is associated with this section. |
- const DetailInputs& inputs = RequestedFieldsForSection(section); |
- for (size_t j = 0; j < inputs.size(); ++j) { |
- if (compare.Run(inputs[j], *field)) { |
- form_group->FillFormField(*field, 0, field); |
- break; |
- } |
- } |
- } |
+ FillFormStructureForSection(*form_group, section, compare); |
} else { |
// The user manually input data. |
DetailOutputMap output; |
view_->GetUserInput(section, &output); |
- // First fill in |form_structure_| to return to the page. |
- for (size_t i = 0; i < form_structure_.field_count(); ++i) { |
- AutofillField* field = form_structure_.field(i); |
- for (DetailOutputMap::iterator iter = output.begin(); |
- iter != output.end(); ++iter) { |
- if (!iter->second.empty() && compare.Run(*iter->first, *field)) { |
- // TODO(estade): handle select controls and such. Also, canonicalize |
- // the entered data. |
- field->value = iter->second; |
- break; |
- } |
- } |
- } |
- |
- // Next, save the info as new or edited data. |
+ // Save the info as new or edited data, then fill it into |form_structure_|. |
PersonalDataManager* manager = |
PersonalDataManagerFactory::GetForProfile(profile_); |
if (section == SECTION_CC) { |
CreditCard card; |
FillFormGroupFromOutputs(output, &card); |
manager->SaveImportedCreditCard(card); |
+ FillFormStructureForSection(card, section, compare); |
+ |
+ // CVC needs special-casing because the CreditCard class doesn't store |
+ // or handle them. Fill it in directly from |output|. |
+ for (size_t i = 0; i < form_structure_.field_count(); ++i) { |
+ AutofillField* field = form_structure_.field(i); |
+ if (field->type() != CREDIT_CARD_VERIFICATION_CODE) |
+ continue; |
+ |
+ for (DetailOutputMap::iterator iter = output.begin(); |
+ iter != output.end(); ++iter) { |
+ if (!iter->second.empty() && compare.Run(*iter->first, *field)) { |
+ field->value = iter->second; |
+ break; |
+ } |
+ } |
+ } |
} else { |
AutofillProfile profile; |
FillFormGroupFromOutputs(output, &profile); |
manager->SaveImportedProfile(profile); |
+ FillFormStructureForSection(profile, section, compare); |
} |
} |
} |
@@ -439,6 +435,23 @@ void AutofillDialogController::FillOutputForSection(DialogSection section) { |
base::Bind(DetailInputMatchesField)); |
} |
+void AutofillDialogController::FillFormStructureForSection( |
+ const FormGroup& form_group, |
+ DialogSection section, |
+ const InputFieldComparator& compare) { |
+ for (size_t i = 0; i < form_structure_.field_count(); ++i) { |
+ AutofillField* field = form_structure_.field(i); |
+ // Only fill in data that is associated with this section. |
+ const DetailInputs& inputs = RequestedFieldsForSection(section); |
+ for (size_t j = 0; j < inputs.size(); ++j) { |
+ if (compare.Run(inputs[j], *field)) { |
+ form_group.FillFormField(*field, 0, field); |
+ break; |
+ } |
+ } |
+ } |
+} |
+ |
SuggestionsComboboxModel* AutofillDialogController::SuggestionsModelForSection( |
DialogSection section) { |
switch (section) { |