diff options
Diffstat (limited to 'chrome/renderer/autofill')
-rw-r--r-- | chrome/renderer/autofill/autofill_agent.cc | 16 | ||||
-rw-r--r-- | chrome/renderer/autofill/autofill_agent.h | 3 | ||||
-rw-r--r-- | chrome/renderer/autofill/form_cache.cc | 17 | ||||
-rw-r--r-- | chrome/renderer/autofill/form_cache.h | 9 |
4 files changed, 39 insertions, 6 deletions
diff --git a/chrome/renderer/autofill/autofill_agent.cc b/chrome/renderer/autofill/autofill_agent.cc index 0e104fc7..f5c3bc8 100644 --- a/chrome/renderer/autofill/autofill_agent.cc +++ b/chrome/renderer/autofill/autofill_agent.cc @@ -180,10 +180,14 @@ void AutofillAgent::DidFinishDocumentLoad(WebFrame* frame) { // The document has now been fully loaded. Scan for forms to be sent up to // the browser. std::vector<FormData> forms; - form_cache_.ExtractForms(*frame, &forms); - if (!frame->parent()) + if (!frame->parent()) { topmost_frame_ = frame; + form_elements_.clear(); + form_cache_.ExtractFormsAndFormElements(*frame, &forms, &form_elements_); + } else { + form_cache_.ExtractForms(*frame, &forms); + } if (!forms.empty()) { Send(new AutofillHostMsg_FormsSeen(routing_id(), forms, @@ -657,9 +661,13 @@ void AutofillAgent::OnRequestAutocompleteResult( } void AutofillAgent::OnFillFormsAndClick( - const std::vector<FormData>& form_data, + const std::vector<FormData>& forms, const WebElementDescriptor& click_element_descriptor) { - // TODO(ramankk): Implement form filling. + DCHECK_EQ(forms.size(), form_elements_.size()); + + // Fill the form. + for (size_t i = 0; i < forms.size(); ++i) + FillFormIncludingNonFocusableElements(forms[i], form_elements_[i]); // It's possible that clicking the element to proceed in an Autocheckout // flow will not actually proceed to the next step in the flow, e.g. there diff --git a/chrome/renderer/autofill/autofill_agent.h b/chrome/renderer/autofill/autofill_agent.h index 2f44289..14c098a 100644 --- a/chrome/renderer/autofill/autofill_agent.h +++ b/chrome/renderer/autofill/autofill_agent.h @@ -212,6 +212,9 @@ class AutofillAgent : public content::RenderViewObserver, // The form element currently requesting an interactive autocomplete. WebKit::WebFormElement in_flight_request_form_; + // All the form elements seen in the top frame. + std::vector<WebKit::WebFormElement> form_elements_; + // The action to take when receiving Autofill data from the AutofillManager. AutofillAction autofill_action_; diff --git a/chrome/renderer/autofill/form_cache.cc b/chrome/renderer/autofill/form_cache.cc index ea92a42..d5f1381 100644 --- a/chrome/renderer/autofill/form_cache.cc +++ b/chrome/renderer/autofill/form_cache.cc @@ -77,6 +77,13 @@ FormCache::~FormCache() { void FormCache::ExtractForms(const WebFrame& frame, std::vector<FormData>* forms) { + ExtractFormsAndFormElements(frame, forms, NULL); +} + +void FormCache::ExtractFormsAndFormElements( + const WebFrame& frame, + std::vector<FormData>* forms, + std::vector<WebFormElement>* web_form_elements) { // Reset the cache for this frame. ResetFrame(frame); @@ -122,8 +129,11 @@ void FormCache::ExtractForms(const WebFrame& frame, continue; FormData form; + ExtractMask extract_mask = + static_cast<ExtractMask>(EXTRACT_VALUE | EXTRACT_OPTIONS); + if (!WebFormElementToFormData(form_element, WebFormControlElement(), - REQUIRE_NONE, EXTRACT_VALUE, &form, NULL)) { + REQUIRE_NONE, extract_mask, &form, NULL)) { continue; } @@ -131,8 +141,11 @@ void FormCache::ExtractForms(const WebFrame& frame, if (num_fields_seen > kMaxParseableFields) break; - if (form.fields.size() >= kRequiredAutofillFields) + if (form.fields.size() >= kRequiredAutofillFields) { forms->push_back(form); + if (web_form_elements) + web_form_elements->push_back(form_element); + } } } diff --git a/chrome/renderer/autofill/form_cache.h b/chrome/renderer/autofill/form_cache.h index 2906224..b235d21 100644 --- a/chrome/renderer/autofill/form_cache.h +++ b/chrome/renderer/autofill/form_cache.h @@ -16,6 +16,7 @@ struct FormDataPredictions; namespace WebKit { class WebDocument; +class WebFormElement; class WebFrame; class WebInputElement; class WebSelectElement; @@ -34,6 +35,14 @@ class FormCache { void ExtractForms(const WebKit::WebFrame& frame, std::vector<FormData>* forms); + // Scans the DOM in |frame| extracting and storing forms. + // Returns a vector of the extracted forms and vector of associated web + // form elements. + void ExtractFormsAndFormElements( + const WebKit::WebFrame& frame, + std::vector<FormData>* forms, + std::vector<WebKit::WebFormElement>* web_form_elements); + // Resets the forms for the specified |frame|. void ResetFrame(const WebKit::WebFrame& frame); |