Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2839)

Unified Diff: chrome/renderer/autofill/form_manager_browsertest.cc

Issue 7602006: Add preliminary Autofill support for the 'autocompletetype' attribute. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Prevent DOS Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/autofill/form_manager_browsertest.cc
diff --git a/chrome/renderer/autofill/form_manager_browsertest.cc b/chrome/renderer/autofill/form_manager_browsertest.cc
index f39f050fe0e350776f9e8d2f45ee8e160013d052..856cdbaa8694a35e1fbe7fb7671494aab14fd645 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\"/>"

Powered by Google App Engine
This is Rietveld 408576698