summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-10 05:38:45 +0000
committerisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-10 05:38:45 +0000
commit1b5f69a1bc11fe1670f994c80a2ae32247c8e549 (patch)
tree3939ba8519f83b4cabd6cef81bad92f309ce9078 /chrome/renderer
parentd8cef10c18dd5378ada0acc799c754ae39c06bd0 (diff)
downloadchromium_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.cc8
-rw-r--r--chrome/renderer/autofill/form_manager_browsertest.cc130
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\"/>"