diff options
author | isherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-10 05:38:45 +0000 |
---|---|---|
committer | isherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-10 05:38:45 +0000 |
commit | 1b5f69a1bc11fe1670f994c80a2ae32247c8e549 (patch) | |
tree | 3939ba8519f83b4cabd6cef81bad92f309ce9078 /chrome/renderer | |
parent | d8cef10c18dd5378ada0acc799c754ae39c06bd0 (diff) | |
download | chromium_src-1b5f69a1bc11fe1670f994c80a2ae32247c8e549.zip chromium_src-1b5f69a1bc11fe1670f994c80a2ae32247c8e549.tar.gz chromium_src-1b5f69a1bc11fe1670f994c80a2ae32247c8e549.tar.bz2 |
Add preliminary Autofill support for the 'autocompletetype' attribute.
BUG=92121
TEST=unit_tests --gtest_filter=FormStructureTest.*Autocompletetype*; browser_tests --gtest_filter=FormManagerTest.WebFormControlElementToFormFieldAutocompletetype
Review URL: http://codereview.chromium.org/7602006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96131 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/autofill/form_manager.cc | 8 | ||||
-rw-r--r-- | chrome/renderer/autofill/form_manager_browsertest.cc | 130 |
2 files changed, 138 insertions, 0 deletions
diff --git a/chrome/renderer/autofill/form_manager.cc b/chrome/renderer/autofill/form_manager.cc index e33ef38..3465f93 100644 --- a/chrome/renderer/autofill/form_manager.cc +++ b/chrome/renderer/autofill/form_manager.cc @@ -598,6 +598,14 @@ void FormManager::WebFormControlElementToFormField( // WebFormElementToFormData. field->name = element.nameForAutofill(); field->form_control_type = element.formControlType(); + field->autocomplete_type = element.getAttribute("x-autocompletetype"); + TrimWhitespace(field->autocomplete_type, TRIM_ALL, &field->autocomplete_type); + if (field->autocomplete_type.size() > kMaxDataLength) { + // Discard overly long attribute values to avoid DOS-ing the browser + // process. However, send over a default string to indicate that the + // attribute was present. + field->autocomplete_type = ASCIIToUTF16("x-max-data-length-exceeded"); + } if (!IsAutofillableElement(element)) return; diff --git a/chrome/renderer/autofill/form_manager_browsertest.cc b/chrome/renderer/autofill/form_manager_browsertest.cc index f39f050..856cdba 100644 --- a/chrome/renderer/autofill/form_manager_browsertest.cc +++ b/chrome/renderer/autofill/form_manager_browsertest.cc @@ -331,6 +331,136 @@ TEST_F(FormManagerTest, WebFormControlElementToFormFieldInvalidType) { EXPECT_FORM_FIELD_EQUALS(expected, result); } +// We should be able to extract the autocompletetype attribute. +TEST_F(FormManagerTest, WebFormControlElementToFormFieldAutocompletetype) { + std::string html = + "<INPUT type=\"text\" id=\"absent\"/>" + "<INPUT type=\"text\" id=\"empty\" x-autocompletetype=\"\"/>" + "<INPUT type=\"text\" id=\"whitespace\" x-autocompletetype=\" \"/>" + "<INPUT type=\"text\" id=\"regular\" x-autocompletetype=\"email\"/>" + "<INPUT type=\"text\" id=\"multi-valued\" " + " x-autocompletetype=\"x-confirm-email email\"/>" + "<INPUT type=\"text\" id=\"unprefixed\" autocompletetype=\"email\"/>" + "<SELECT id=\"select\" x-autocompletetype=\"state\"/>" + " <OPTION value=\"CA\">California</OPTION>" + " <OPTION value=\"TX\">Texas</OPTION>" + "</SELECT>"; + html += + "<INPUT type=\"text\" id=\"malicious\" x-autocompletetype=\"" + + std::string(10000, 'x') + "\"/>"; + LoadHTML(html.c_str()); + + WebFrame* frame = GetMainFrame(); + ASSERT_NE(static_cast<WebFrame*>(NULL), frame); + + // An absent attribute is equivalent to an empty one. + WebElement web_element = frame->document().getElementById("absent"); + WebFormControlElement element = web_element.to<WebFormControlElement>(); + FormField result1; + FormManager::WebFormControlElementToFormField(element, + FormManager::EXTRACT_NONE, + &result1); + + FormField expected; + expected.name = ASCIIToUTF16("absent"); + expected.form_control_type = ASCIIToUTF16("text"); + expected.autocomplete_type = string16(); + expected.max_length = WebInputElement::defaultMaxLength(); + EXPECT_FORM_FIELD_EQUALS(expected, result1); + + web_element = frame->document().getElementById("empty"); + element = web_element.to<WebFormControlElement>(); + FormField result2; + FormManager::WebFormControlElementToFormField(element, + FormManager::EXTRACT_NONE, + &result2); + expected.name = ASCIIToUTF16("empty"); + expected.form_control_type = ASCIIToUTF16("text"); + expected.autocomplete_type = string16(); + expected.max_length = WebInputElement::defaultMaxLength(); + EXPECT_FORM_FIELD_EQUALS(expected, result2); + + // The renderer should trim whitespace. + web_element = frame->document().getElementById("whitespace"); + element = web_element.to<WebFormControlElement>(); + FormField result3; + FormManager::WebFormControlElementToFormField(element, + FormManager::EXTRACT_NONE, + &result3); + expected.name = ASCIIToUTF16("whitespace"); + expected.form_control_type = ASCIIToUTF16("text"); + expected.autocomplete_type = string16(); + expected.max_length = WebInputElement::defaultMaxLength(); + EXPECT_FORM_FIELD_EQUALS(expected, result3); + + // Common case: exactly one type specified. + web_element = frame->document().getElementById("regular"); + element = web_element.to<WebFormControlElement>(); + FormField result4; + FormManager::WebFormControlElementToFormField(element, + FormManager::EXTRACT_NONE, + &result4); + expected.name = ASCIIToUTF16("regular"); + expected.form_control_type = ASCIIToUTF16("text"); + expected.autocomplete_type = ASCIIToUTF16("email"); + expected.max_length = WebInputElement::defaultMaxLength(); + EXPECT_FORM_FIELD_EQUALS(expected, result4); + + // Verify that we correctly extract fallback types as well. + web_element = frame->document().getElementById("multi-valued"); + element = web_element.to<WebFormControlElement>(); + FormField result5; + FormManager::WebFormControlElementToFormField(element, + FormManager::EXTRACT_NONE, + &result5); + expected.name = ASCIIToUTF16("multi-valued"); + expected.form_control_type = ASCIIToUTF16("text"); + expected.autocomplete_type = ASCIIToUTF16("x-confirm-email email"); + expected.max_length = WebInputElement::defaultMaxLength(); + EXPECT_FORM_FIELD_EQUALS(expected, result5); + + // The attribute is not yet part of the HTML standard, so we only recognize + // the prefixed version -- 'x-autocompletetype' -- and not the unprefixed one. + web_element = frame->document().getElementById("unprefixed"); + element = web_element.to<WebFormControlElement>(); + FormField result6; + FormManager::WebFormControlElementToFormField(element, + FormManager::EXTRACT_NONE, + &result6); + expected.name = ASCIIToUTF16("unprefixed"); + expected.form_control_type = ASCIIToUTF16("text"); + expected.autocomplete_type = string16(); + expected.max_length = WebInputElement::defaultMaxLength(); + EXPECT_FORM_FIELD_EQUALS(expected, result6); + + // <select> elements should behave no differently from text fields here. + web_element = frame->document().getElementById("select"); + element = web_element.to<WebFormControlElement>(); + FormField result7; + FormManager::WebFormControlElementToFormField(element, + FormManager::EXTRACT_NONE, + &result7); + expected.name = ASCIIToUTF16("select"); + expected.form_control_type = ASCIIToUTF16("select-one"); + expected.autocomplete_type = ASCIIToUTF16("state"); + expected.max_length = 0; + EXPECT_FORM_FIELD_EQUALS(expected, result7); + + // Very long attribute values should be replaced by a default string, to + // prevent malicious websites from DOSing the browser process. + web_element = frame->document().getElementById("malicious"); + element = web_element.to<WebFormControlElement>(); + FormField result8; + FormManager::WebFormControlElementToFormField(element, + FormManager::EXTRACT_NONE, + &result8); + expected.name = ASCIIToUTF16("malicious"); + expected.form_control_type = ASCIIToUTF16("text"); + expected.autocomplete_type = ASCIIToUTF16("x-max-data-length-exceeded"); + expected.max_length = WebInputElement::defaultMaxLength(); + EXPECT_FORM_FIELD_EQUALS(expected, result8); +} + TEST_F(FormManagerTest, WebFormElementToFormData) { LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" |