summaryrefslogtreecommitdiffstats
path: root/components/autofill
diff options
context:
space:
mode:
authorbenquan@chromium.org <benquan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-31 06:48:44 +0000
committerbenquan@chromium.org <benquan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-31 06:48:44 +0000
commitfe21c155e04010ba917b58633b6237ebca002b28 (patch)
tree841d61a70865a756676d6233abc063df1bf0efa7 /components/autofill
parent28129a8b69ef2f45cd58fb7f0e4be796f5ec8a56 (diff)
downloadchromium_src-fe21c155e04010ba917b58633b6237ebca002b28.zip
chromium_src-fe21c155e04010ba917b58633b6237ebca002b28.tar.gz
chromium_src-fe21c155e04010ba917b58633b6237ebca002b28.tar.bz2
Add filter mask to autofill functions to filter fields that we do not want to fill.
BUG=263575 Review URL: https://chromiumcodereview.appspot.com/20643003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@214597 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components/autofill')
-rw-r--r--components/autofill/content/renderer/autofill_agent.cc2
-rw-r--r--components/autofill/content/renderer/form_autofill_util.cc41
-rw-r--r--components/autofill/content/renderer/form_autofill_util.h6
3 files changed, 41 insertions, 8 deletions
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc
index a48f573..9434971 100644
--- a/components/autofill/content/renderer/autofill_agent.cc
+++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -581,7 +581,7 @@ void AutofillAgent::OnFillFormsAndClick(
// Fill the form.
for (size_t i = 0; i < forms.size(); ++i)
- FillFormIncludingNonFocusableElements(forms[i], form_elements_[i]);
+ FillFormForAllElements(forms[i], form_elements_[i]);
// Click elements in click_elements_after_form_fill.
for (size_t i = 0; i < click_elements_after_form_fill.size(); ++i) {
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc
index 4c36547..55f3a03 100644
--- a/components/autofill/content/renderer/form_autofill_util.cc
+++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -52,6 +52,17 @@ namespace {
// The maximum length allowed for form data.
const size_t kMaxDataLength = 1024;
+// A bit field mask for FillForm functions to not fill some fields.
+enum FieldFilterMask {
+ FILTER_NONE = 0,
+ FILTER_DISABLED_ELEMENTS = 1 << 0,
+ FILTER_READONLY_ELEMENTS = 1 << 1,
+ FILTER_NON_FOCUSABLE_ELEMENTS = 1 << 2,
+ FILTER_ALL_NON_EDITIABLE_ELEMENTS = FILTER_DISABLED_ELEMENTS |
+ FILTER_READONLY_ELEMENTS |
+ FILTER_NON_FOCUSABLE_ELEMENTS,
+};
+
bool IsOptionElement(const WebElement& element) {
CR_DEFINE_STATIC_LOCAL(WebString, kOption, ("option"));
return element.hasTagName(kOption);
@@ -463,7 +474,7 @@ typedef void (*Callback)(const FormFieldData&,
void ForEachMatchingFormField(const WebFormElement& form_element,
const WebElement& initiating_element,
const FormData& data,
- bool only_focusable_elements,
+ FieldFilterMask filters,
bool force_override,
Callback callback) {
std::vector<WebFormControlElement> control_elements;
@@ -504,8 +515,9 @@ void ForEachMatchingFormField(const WebFormElement& form_element,
!is_initiating_element && !input_element->value().isEmpty())
continue;
- if (!element->isEnabled() || element->isReadOnly() ||
- (only_focusable_elements && !element->isFocusable()))
+ if (((filters & FILTER_DISABLED_ELEMENTS) && !element->isEnabled()) ||
+ ((filters & FILTER_READONLY_ELEMENTS) && element->isReadOnly()) ||
+ ((filters & FILTER_NON_FOCUSABLE_ELEMENTS) && !element->isFocusable()))
continue;
callback(data.fields[i], is_initiating_element, element);
@@ -930,20 +942,35 @@ void FillForm(const FormData& form, const WebInputElement& element) {
ForEachMatchingFormField(form_element,
element,
form,
- true, /* only_focusable_elements */
+ FILTER_ALL_NON_EDITIABLE_ELEMENTS,
false, /* dont force override */
&FillFormField);
}
void FillFormIncludingNonFocusableElements(const FormData& form_data,
- const WebFormElement& form_element) {
+ const WebFormElement& form_element) {
+ if (form_element.isNull())
+ return;
+
+ FieldFilterMask filter_mask = static_cast<FieldFilterMask>(
+ FILTER_DISABLED_ELEMENTS | FILTER_READONLY_ELEMENTS);
+ ForEachMatchingFormField(form_element,
+ WebInputElement(),
+ form_data,
+ filter_mask,
+ true, /* force override */
+ &FillFormField);
+}
+
+void FillFormForAllElements(const FormData& form_data,
+ const WebFormElement& form_element) {
if (form_element.isNull())
return;
ForEachMatchingFormField(form_element,
WebInputElement(),
form_data,
- false, /* only_focusable_elements */
+ FILTER_NONE,
true, /* force override */
&FillFormField);
}
@@ -956,7 +983,7 @@ void PreviewForm(const FormData& form, const WebInputElement& element) {
ForEachMatchingFormField(form_element,
element,
form,
- true, /* only_focusable_elements */
+ FILTER_ALL_NON_EDITIABLE_ELEMENTS,
false, /* dont force override */
&PreviewFormField);
}
diff --git a/components/autofill/content/renderer/form_autofill_util.h b/components/autofill/content/renderer/form_autofill_util.h
index aec0614..5a12418 100644
--- a/components/autofill/content/renderer/form_autofill_util.h
+++ b/components/autofill/content/renderer/form_autofill_util.h
@@ -118,6 +118,12 @@ void FillFormIncludingNonFocusableElements(
const FormData& form_data,
const WebKit::WebFormElement& form_element);
+// Fills all (including disabled, read-only and non-focusable) form control
+// elements within |form_element| with field data from |form_data|.
+void FillFormForAllElements(
+ const FormData& form_data,
+ const WebKit::WebFormElement& form_element);
+
// Previews the form represented by |form|. |element| is the input element that
// initiated the preview process.
void PreviewForm(const FormData& form,