summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorramankk@chromium.org <ramankk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-04 05:37:02 +0000
committerramankk@chromium.org <ramankk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-04 05:37:02 +0000
commit14696913ff86cfbc533bc0db15a134c1627a2d58 (patch)
treeba5013a3d9403094c35dc49185068ffeb8812394
parentfc652c0df8646b9485d0bfb671b84771ef3279d1 (diff)
downloadchromium_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.cc16
-rw-r--r--chrome/renderer/autofill/autofill_agent.h3
-rw-r--r--chrome/renderer/autofill/form_cache.cc17
-rw-r--r--chrome/renderer/autofill/form_cache.h9
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);