diff options
author | ramankk@chromium.org <ramankk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-04 05:37:02 +0000 |
---|---|---|
committer | ramankk@chromium.org <ramankk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-04 05:37:02 +0000 |
commit | 14696913ff86cfbc533bc0db15a134c1627a2d58 (patch) | |
tree | ba5013a3d9403094c35dc49185068ffeb8812394 | |
parent | fc652c0df8646b9485d0bfb671b84771ef3279d1 (diff) | |
download | chromium_src-14696913ff86cfbc533bc0db15a134c1627a2d58.zip chromium_src-14696913ff86cfbc533bc0db15a134c1627a2d58.tar.gz chromium_src-14696913ff86cfbc533bc0db15a134c1627a2d58.tar.bz2 |
Renderer side changes to save the user supplied data and use it to autofill in multiple page in the flow. Primarily being used by Autocheckout. This is achived by
* Saving the context of all form elements in the top most frame seen
* Using filled form data from browser to fill form elements earlier seen
BUG=172632
Review URL: https://chromiumcodereview.appspot.com/12087122
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@180352 0039d316-1c4b-4281-b951-d872f2087c98
-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); |