Chromium Code Reviews| Index: chrome/renderer/autofill/autofill_agent.cc |
| diff --git a/chrome/renderer/autofill/autofill_agent.cc b/chrome/renderer/autofill/autofill_agent.cc |
| index 69fd3ede8c5a02cb4a157d8105c24e55ad0d1cd8..d40e90d3e360f2eb35ba8774b15aa3dd5a0011f2 100644 |
| --- a/chrome/renderer/autofill/autofill_agent.cc |
| +++ b/chrome/renderer/autofill/autofill_agent.cc |
| @@ -158,8 +158,10 @@ bool AutofillAgent::OnMessageReceived(const IPC::Message& message) { |
| OnAcceptDataListSuggestion) |
| IPC_MESSAGE_HANDLER(AutofillMsg_AcceptPasswordAutofillSuggestion, |
| OnAcceptPasswordAutofillSuggestion) |
| - IPC_MESSAGE_HANDLER(AutofillMsg_RequestAutocompleteFinished, |
| - OnRequestAutocompleteFinished) |
| + IPC_MESSAGE_HANDLER(AutofillMsg_RequestAutocompleteSuccess, |
| + OnRequestAutocompleteSuccess) |
| + IPC_MESSAGE_HANDLER(AutofillMsg_RequestAutocompleteError, |
| + OnRequestAutocompleteError) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| return handled; |
| @@ -331,8 +333,8 @@ void AutofillAgent::textFieldDidEndEditing(const WebInputElement& element) { |
| void AutofillAgent::textFieldDidChange(const WebInputElement& element) { |
| if (did_set_node_text_) { |
| - did_set_node_text_ = false; |
| - return; |
| + did_set_node_text_ = false; |
| + return; |
| } |
| // We post a task for doing the Autofill as the caret position is not set |
| @@ -589,11 +591,42 @@ void AutofillAgent::OnAcceptPasswordAutofillSuggestion(const string16& value) { |
| DCHECK(handled); |
| } |
| -void AutofillAgent::OnRequestAutocompleteFinished( |
| - WebFormElement::AutocompleteResult result) { |
| +void AutofillAgent::OnRequestAutocompleteSuccess(const FormData& form_data) { |
| DCHECK(!in_flight_request_form_.isNull()); |
| - in_flight_request_form_.finishRequestAutocomplete(result); |
| + std::vector<WebKit::WebFormControlElement> elements; |
| + autofill::ExtractAutofillableElements(in_flight_request_form_, |
| + REQUIRE_AUTOCOMPLETE, |
| + &elements); |
| + |
| + for (size_t i = 0; i < form_data.fields.size(); ++i) { |
| + const FormFieldData field = form_data.fields[i]; |
| + |
| + // TODO(dbeam): change to DCHECK() if values must be non-empty to confirm. |
| + if (field.value.empty()) |
| + continue; |
| + |
| + const std::string field_attr_lower = |
| + StringToLowerASCII(field.autocomplete_attribute); |
| + for (size_t j = 0; j < elements.size(); ++j) { |
| + const std::string element_attr = |
| + UTF16ToASCII(elements[j].getAttribute("autocomplete")); |
| + if (field_attr_lower == StringToLowerASCII(element_attr)) { |
| + autofill::FillFormField(&elements[j], &field, false); |
| + break; |
| + } |
| + } |
| + } |
|
Ilya Sherman
2012/11/29 00:08:59
If we end up keeping this logic, I would recommend
|
| + |
| + in_flight_request_form_.finishRequestAutocomplete( |
| + WebFormElement::AutocompleteResultSuccess); |
| + in_flight_request_form_.reset(); |
| +} |
| + |
| +void AutofillAgent::OnRequestAutocompleteError() { |
| + DCHECK(!in_flight_request_form_.isNull()); |
| + in_flight_request_form_.finishRequestAutocomplete( |
| + WebFormElement::AutocompleteResultError); |
| in_flight_request_form_.reset(); |
| } |