Commit b570fd45 authored by estade@chromium.org's avatar estade@chromium.org

[imperative autofill] handle filling in <select>

also, differentiate cancel from success in AutofillDialogController.

BUG=157270

Review URL: https://codereview.chromium.org/11299323

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@171062 0039d316-1c4b-4281-b951-d872f2087c98
parent d0991d94
...@@ -330,9 +330,11 @@ void AutofillDialogController::ViewClosed(DialogAction action) { ...@@ -330,9 +330,11 @@ void AutofillDialogController::ViewClosed(DialogAction action) {
} else { } else {
FillOutputForSection(SECTION_SHIPPING); FillOutputForSection(SECTION_SHIPPING);
} }
callback_.Run(&form_structure_);
} else {
callback_.Run(NULL);
} }
callback_.Run(&form_structure_);
delete this; delete this;
} }
...@@ -399,47 +401,41 @@ void AutofillDialogController::FillOutputForSectionWithComparator( ...@@ -399,47 +401,41 @@ void AutofillDialogController::FillOutputForSectionWithComparator(
if (!form_group) if (!form_group)
return; return;
for (size_t i = 0; i < form_structure_.field_count(); ++i) { FillFormStructureForSection(*form_group, section, compare);
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;
}
}
}
} else { } else {
// The user manually input data. // The user manually input data.
DetailOutputMap output; DetailOutputMap output;
view_->GetUserInput(section, &output); view_->GetUserInput(section, &output);
// First fill in |form_structure_| to return to the page. // Save the info as new or edited data, then fill it into |form_structure_|.
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.
PersonalDataManager* manager = PersonalDataManager* manager =
PersonalDataManagerFactory::GetForProfile(profile_); PersonalDataManagerFactory::GetForProfile(profile_);
if (section == SECTION_CC) { if (section == SECTION_CC) {
CreditCard card; CreditCard card;
FillFormGroupFromOutputs(output, &card); FillFormGroupFromOutputs(output, &card);
manager->SaveImportedCreditCard(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 { } else {
AutofillProfile profile; AutofillProfile profile;
FillFormGroupFromOutputs(output, &profile); FillFormGroupFromOutputs(output, &profile);
manager->SaveImportedProfile(profile); manager->SaveImportedProfile(profile);
FillFormStructureForSection(profile, section, compare);
} }
} }
} }
...@@ -449,6 +445,23 @@ void AutofillDialogController::FillOutputForSection(DialogSection section) { ...@@ -449,6 +445,23 @@ void AutofillDialogController::FillOutputForSection(DialogSection section) {
base::Bind(DetailInputMatchesField)); 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( SuggestionsComboboxModel* AutofillDialogController::SuggestionsModelForSection(
DialogSection section) { DialogSection section) {
switch (section) { switch (section) {
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "chrome/browser/ui/autofill/autofill_dialog_comboboxes.h" #include "chrome/browser/ui/autofill/autofill_dialog_comboboxes.h"
#include "ui/base/models/combobox_model.h" #include "ui/base/models/combobox_model.h"
class FormGroup;
class Profile; class Profile;
namespace content { namespace content {
...@@ -121,6 +122,12 @@ class AutofillDialogController { ...@@ -121,6 +122,12 @@ class AutofillDialogController {
void FillOutputForSectionWithComparator(DialogSection section, void FillOutputForSectionWithComparator(DialogSection section,
const InputFieldComparator& compare); const InputFieldComparator& compare);
// Fills in |form_structure_| using |form_group|. Utility method for
// FillOutputForSection.
void FillFormStructureForSection(const FormGroup& form_group,
DialogSection section,
const InputFieldComparator& compare);
// Gets the SuggestionsComboboxModel for |section|. // Gets the SuggestionsComboboxModel for |section|.
SuggestionsComboboxModel* SuggestionsModelForSection(DialogSection section); SuggestionsComboboxModel* SuggestionsModelForSection(DialogSection section);
......
...@@ -220,7 +220,7 @@ void AutofillAgent::didRequestAutocomplete(WebKit::WebFrame* frame, ...@@ -220,7 +220,7 @@ void AutofillAgent::didRequestAutocomplete(WebKit::WebFrame* frame,
!WebFormElementToFormData(form, !WebFormElementToFormData(form,
WebFormControlElement(), WebFormControlElement(),
REQUIRE_AUTOCOMPLETE, REQUIRE_AUTOCOMPLETE,
EXTRACT_NONE, EXTRACT_OPTIONS,
&form_data, &form_data,
NULL)) { NULL)) {
WebFormElement(form).finishRequestAutocomplete( WebFormElement(form).finishRequestAutocomplete(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment