diff options
author | benquan@chromium.org <benquan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-31 06:48:44 +0000 |
---|---|---|
committer | benquan@chromium.org <benquan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-31 06:48:44 +0000 |
commit | fe21c155e04010ba917b58633b6237ebca002b28 (patch) | |
tree | 841d61a70865a756676d6233abc063df1bf0efa7 /components/autofill | |
parent | 28129a8b69ef2f45cd58fb7f0e4be796f5ec8a56 (diff) | |
download | chromium_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')
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, |