summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-31 05:49:12 +0000
committerjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-31 05:49:12 +0000
commit1255b5d9b20f8c23a1980ef270c09bbb07683418 (patch)
tree37e5a97e6502f7a5d8f3bd3202c4952a5a117929 /chrome
parent545baea014e3d9b51f6b25b5d6d7f9a429545677 (diff)
downloadchromium_src-1255b5d9b20f8c23a1980ef270c09bbb07683418.zip
chromium_src-1255b5d9b20f8c23a1980ef270c09bbb07683418.tar.gz
chromium_src-1255b5d9b20f8c23a1980ef270c09bbb07683418.tar.bz2
AutoFill: Send the forms cached in the FormManager to the AutoFillManager on
page load instead of duplicating this parsing in RenderView. BUG=38325 TEST=none Review URL: http://codereview.chromium.org/1530011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@43181 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/renderer/form_manager.cc114
-rw-r--r--chrome/renderer/form_manager.h24
-rw-r--r--chrome/renderer/render_view.cc43
3 files changed, 134 insertions, 47 deletions
diff --git a/chrome/renderer/form_manager.cc b/chrome/renderer/form_manager.cc
index 5413963..4377b1b 100644
--- a/chrome/renderer/form_manager.cc
+++ b/chrome/renderer/form_manager.cc
@@ -32,6 +32,7 @@ using WebKit::WebString;
using WebKit::WebVector;
using webkit_glue::FormData;
using webkit_glue::FormField;
+using webkit_glue::FormFieldValues;
FormManager::FormManager() {
}
@@ -40,7 +41,9 @@ FormManager::~FormManager() {
Reset();
}
-void FormManager::ExtractForms(WebFrame* frame) {
+void FormManager::ExtractForms(const WebFrame* frame) {
+ DCHECK(frame);
+
// Reset the vector of FormElements for this frame.
ResetFrame(frame);
@@ -68,10 +71,12 @@ void FormManager::ExtractForms(WebFrame* frame) {
void FormManager::GetForms(std::vector<FormData>* forms,
RequirementsMask requirements) {
+ DCHECK(forms);
+
// Frame loop.
for (WebFrameFormElementMap::iterator iter = form_elements_map_.begin();
iter != form_elements_map_.end(); ++iter) {
- WebFrame* frame = iter->first;
+ const WebFrame* frame = iter->first;
// Form loop.
for (std::vector<FormElement*>::iterator form_iter = iter->second.begin();
@@ -89,12 +94,40 @@ void FormManager::GetForms(std::vector<FormData>* forms,
}
}
+void FormManager::GetFormsInFrame(const WebFrame* frame,
+ RequirementsMask requirements,
+ std::vector<FormData>* forms) {
+ DCHECK(frame);
+ DCHECK(forms);
+
+ WebFrameFormElementMap::iterator iter = form_elements_map_.find(frame);
+ if (iter == form_elements_map_.end())
+ return;
+
+ const std::vector<FormElement*>& form_elements = iter->second;
+ for (std::vector<FormElement*>::const_iterator form_iter =
+ form_elements.begin();
+ form_iter != form_elements.end(); ++form_iter) {
+ FormElement* form_element = *form_iter;
+
+ if (requirements & REQUIRE_AUTOCOMPLETE &&
+ !form_element->form_element.autoComplete())
+ continue;
+
+ FormData form;
+ FormElementToFormData(frame, form_element, requirements, &form);
+ forms->push_back(form);
+ }
+}
+
bool FormManager::FindForm(const WebFormControlElement& element,
FormData* form) {
+ DCHECK(form);
+
// Frame loop.
for (WebFrameFormElementMap::iterator iter = form_elements_map_.begin();
iter != form_elements_map_.end(); ++iter) {
- WebFrame* frame = iter->first;
+ const WebFrame* frame = iter->first;
// Form loop.
for (std::vector<FormElement*>::iterator form_iter = iter->second.begin();
@@ -173,7 +206,54 @@ void FormManager::Reset() {
form_elements_map_.clear();
}
-void FormManager::ResetFrame(WebFrame* frame) {
+// static
+void FormManager::FormDataToFormFieldValues(
+ const std::vector<FormData>& forms,
+ std::vector<FormFieldValues>* form_field_values) {
+ DCHECK(form_field_values);
+
+ for (std::vector<FormData>::const_iterator iter = forms.begin();
+ iter != forms.end(); ++iter) {
+ FormFieldValues form;
+ form.form_name = iter->name;
+ // TODO(jhawkins): Store the method in FormData.
+ form.method = ASCIIToUTF16("post");
+ form.source_url = iter->origin;
+ form.target_url = iter->action;
+ form.elements = iter->fields;
+ form_field_values->push_back(form);
+ }
+}
+
+// static
+void FormManager::WebFormControlElementToFormField(
+ const WebFormControlElement& element,
+ webkit_glue::FormField* field) {
+ DCHECK(field);
+ field->set_label(LabelForElement(element));
+ field->set_name(element.nameForAutofill());
+ field->set_form_control_type(element.formControlType());
+
+ // TODO(jhawkins): In WebKit, move value() and setValue() to
+ // WebFormControlElement.
+ string16 value;
+ if (element.formControlType() == ASCIIToUTF16("text")) {
+ const WebInputElement& input_element =
+ element.toConstElement<WebInputElement>();
+ value = input_element.value();
+ } else if (element.formControlType() == ASCIIToUTF16("select-one")) {
+ // TODO(jhawkins): This is ugly. WebSelectElement::value() is a non-const
+ // method. Look into fixing this on the WebKit side.
+ WebFormControlElement& e = const_cast<WebFormControlElement&>(element);
+ WebSelectElement select_element = e.toElement<WebSelectElement>();
+ value = select_element.value();
+ }
+ field->set_value(value);
+}
+
+void FormManager::ResetFrame(const WebFrame* frame) {
+ DCHECK(frame);
+
WebFrameFormElementMap::iterator iter = form_elements_map_.find(frame);
if (iter != form_elements_map_.end()) {
STLDeleteElements(&iter->second);
@@ -181,10 +261,14 @@ void FormManager::ResetFrame(WebFrame* frame) {
}
}
-void FormManager::FormElementToFormData(WebFrame* frame,
+void FormManager::FormElementToFormData(const WebFrame* frame,
const FormElement* form_element,
RequirementsMask requirements,
FormData* form) {
+ DCHECK(frame);
+ DCHECK(form_element);
+ DCHECK(form);
+
form->name = form_element->form_element.name();
form->origin = frame->url();
form->action = frame->completeURL(form_element->form_element.action());
@@ -211,23 +295,9 @@ void FormManager::FormElementToFormData(WebFrame* frame,
if (requirements & REQUIRE_ELEMENTS_ENABLED && !control_element.isEnabled())
continue;
- string16 label = LabelForElement(control_element);
- string16 name = control_element.nameForAutofill();
-
- string16 value;
- if (control_element.formControlType() == ASCIIToUTF16("text")) {
- const WebInputElement& input_element =
- control_element.toConstElement<WebInputElement>();
- value = input_element.value();
- } else if (control_element.formControlType() ==
- ASCIIToUTF16("select-one")) {
- WebSelectElement select_element =
- control_element.toElement<WebSelectElement>();
- value = select_element.value();
- }
-
- string16 form_control_type = control_element.formControlType();
- form->fields.push_back(FormField(label, name, value, form_control_type));
+ FormField field;
+ WebFormControlElementToFormField(control_element, &field);
+ form->fields.push_back(field);
}
}
diff --git a/chrome/renderer/form_manager.h b/chrome/renderer/form_manager.h
index 5445a4f..cc19bd8 100644
--- a/chrome/renderer/form_manager.h
+++ b/chrome/renderer/form_manager.h
@@ -12,6 +12,7 @@
#include "third_party/WebKit/WebKit/chromium/public/WebFormControlElement.h"
#include "third_party/WebKit/WebKit/chromium/public/WebFormElement.h"
#include "webkit/glue/form_data.h"
+#include "webkit/glue/form_field_values.h"
namespace WebKit {
class WebFrame;
@@ -31,12 +32,17 @@ class FormManager {
virtual ~FormManager();
// Scans the DOM in |frame| extracting and storing forms.
- void ExtractForms(WebKit::WebFrame* frame);
+ void ExtractForms(const WebKit::WebFrame* frame);
// Returns a vector of forms that match |requirements|.
void GetForms(std::vector<webkit_glue::FormData>* forms,
RequirementsMask requirements);
+ // Returns a vector of forms in |frame| that match |requirements|.
+ void GetFormsInFrame(const WebKit::WebFrame* frame,
+ RequirementsMask requirements,
+ std::vector<webkit_glue::FormData>* forms);
+
// Finds the form that contains |element| and returns it in |form|. Returns
// false if the form is not found.
bool FindForm(const WebKit::WebFormControlElement& element,
@@ -52,6 +58,16 @@ class FormManager {
// Resets the stored set of forms.
void Reset();
+ // TODO(jhawkins): Remove this method once AutoFillManager uses FormData.
+ static void FormDataToFormFieldValues(
+ const std::vector<webkit_glue::FormData>& forms,
+ std::vector<webkit_glue::FormFieldValues>* form_field_values);
+
+ // Creates a FormField object from a given WebFormControlElement.
+ static void WebFormControlElementToFormField(
+ const WebKit::WebFormControlElement& element,
+ webkit_glue::FormField* field);
+
private:
// A map of WebFormControlElements keyed by each element's name.
typedef std::map<string16, WebKit::WebFormControlElement>
@@ -66,15 +82,15 @@ class FormManager {
// A map of vectors of FormElements keyed by the WebFrame containing each
// form.
- typedef std::map<WebKit::WebFrame*, std::vector<FormElement*> >
+ typedef std::map<const WebKit::WebFrame*, std::vector<FormElement*> >
WebFrameFormElementMap;
// Resets the forms for the specified |frame|.
- void ResetFrame(WebKit::WebFrame* frame);
+ void ResetFrame(const WebKit::WebFrame* frame);
// Converts a FormElement to FormData storage.
// TODO(jhawkins): Modify FormElement so we don't need |frame|.
- void FormElementToFormData(WebKit::WebFrame* frame,
+ void FormElementToFormData(const WebKit::WebFrame* frame,
const FormElement* form_element,
RequirementsMask requirements,
webkit_glue::FormData* form);
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 5b9a4ba..d8506c3 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -79,11 +79,11 @@
#include "third_party/WebKit/WebKit/chromium/public/WebDocument.h"
#include "third_party/WebKit/WebKit/chromium/public/WebDragData.h"
#include "third_party/WebKit/WebKit/chromium/public/WebFileChooserParams.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebFormControlElement.h"
#include "third_party/WebKit/WebKit/chromium/public/WebFormElement.h"
#include "third_party/WebKit/WebKit/chromium/public/WebFrame.h"
#include "third_party/WebKit/WebKit/chromium/public/WebHistoryItem.h"
#include "third_party/WebKit/WebKit/chromium/public/WebImage.h"
-#include "third_party/WebKit/WebKit/chromium/public/WebInputElement.h"
#include "third_party/WebKit/WebKit/chromium/public/WebNode.h"
#include "third_party/WebKit/WebKit/chromium/public/WebNodeList.h"
#include "third_party/WebKit/WebKit/chromium/public/WebPageSerializer.h"
@@ -106,6 +106,7 @@
#include "webkit/appcache/web_application_cache_host_impl.h"
#include "webkit/default_plugin/default_plugin_shared.h"
#include "webkit/glue/dom_operations.h"
+#include "webkit/glue/form_data.h"
#include "webkit/glue/form_field.h"
#include "webkit/glue/form_field_values.h"
#include "webkit/glue/glue_serialize.h"
@@ -134,6 +135,7 @@ using appcache::WebApplicationCacheHostImpl;
using base::Time;
using base::TimeDelta;
using webkit_glue::AltErrorPageResourceFetcher;
+using webkit_glue::FormData;
using webkit_glue::FormField;
using webkit_glue::FormFieldValues;
using webkit_glue::ImageResourceFetcher;
@@ -157,11 +159,11 @@ using WebKit::WebDragOperationsMask;
using WebKit::WebEditingAction;
using WebKit::WebFileChooserCompletion;
using WebKit::WebFindOptions;
+using WebKit::WebFormControlElement;
using WebKit::WebFormElement;
using WebKit::WebFrame;
using WebKit::WebHistoryItem;
using WebKit::WebImage;
-using WebKit::WebInputElement;
using WebKit::WebMediaPlayer;
using WebKit::WebMediaPlayerAction;
using WebKit::WebMediaPlayerClient;
@@ -1950,10 +1952,12 @@ void RenderView::queryAutofillSuggestions(const WebNode& node,
static int query_counter = 0;
autofill_query_id_ = query_counter++;
autofill_query_node_ = node;
- const WebKit::WebInputElement input_element =
- node.toConstElement<WebInputElement>();
+ const WebKit::WebFormControlElement element =
+ node.toConstElement<WebFormControlElement>();
+ FormField field;
+ FormManager::WebFormControlElementToFormField(element, &field);
Send(new ViewHostMsg_QueryFormFieldAutofill(
- routing_id_, autofill_query_id_, FormField(input_element)));
+ routing_id_, autofill_query_id_, field));
}
void RenderView::removeAutofillSuggestions(const WebString& name,
@@ -1969,7 +1973,8 @@ void RenderView::didAcceptAutoFillSuggestion(
autofill_query_id_ = query_counter++;
webkit_glue::FormData form;
- const WebInputElement element = node.toConstElement<WebInputElement>();
+ const WebFormControlElement element =
+ node.toConstElement<WebFormControlElement>();
if (!form_manager_.FindForm(element, &form))
return;
@@ -4638,22 +4643,18 @@ void RenderView::focusAccessibilityObject(
}
void RenderView::SendForms(WebFrame* frame) {
- WebVector<WebFormElement> web_forms;
- frame->forms(web_forms);
-
- std::vector<FormFieldValues> forms;
- for (size_t i = 0; i < web_forms.size(); ++i) {
- const WebFormElement& web_form = web_forms[i];
-
- if (web_form.autoComplete()) {
- scoped_ptr<FormFieldValues> form(FormFieldValues::Create(web_form));
- if (form.get())
- forms.push_back(*form);
- }
+ std::vector<FormData> forms;
+ FormManager::RequirementsMask requirements =
+ static_cast<FormManager::RequirementsMask>(
+ FormManager::REQUIRE_AUTOCOMPLETE |
+ FormManager::REQUIRE_ELEMENTS_ENABLED);
+ form_manager_.GetFormsInFrame(frame, requirements, &forms);
+ if (!forms.empty()) {
+ // TODO(jhawkins): Remove this call once AutoFillManager uses FormData.
+ std::vector<FormFieldValues> form_field_values;
+ FormManager::FormDataToFormFieldValues(forms, &form_field_values);
+ Send(new ViewHostMsg_FormsSeen(routing_id_, form_field_values));
}
-
- if (!forms.empty())
- Send(new ViewHostMsg_FormsSeen(routing_id_, forms));
}
void RenderView::didChangeAccessibilityObjectState(