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

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

Issue 11198048: [Autofill] Update the autocomplete types implementation to match the current HTML spec. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 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_autofill_browsertest.cc
diff --git a/chrome/renderer/autofill/form_autofill_browsertest.cc b/chrome/renderer/autofill/form_autofill_browsertest.cc
index 15ab038e008ff14f34d95cb372bc77cfbc03830e..4a12120b9b03187ede622c49008671d561ff036c 100644
--- a/chrome/renderer/autofill/form_autofill_browsertest.cc
+++ b/chrome/renderer/autofill/form_autofill_browsertest.cc
@@ -164,6 +164,7 @@ TEST_F(FormAutofillTest, WebFormControlElementToFormFieldAutocompleteOff) {
expected.name = ASCIIToUTF16("element");
expected.value = ASCIIToUTF16("value");
expected.form_control_type = ASCIIToUTF16("text");
+ expected.autocomplete_attribute = ASCIIToUTF16("off");
expected.max_length = WebInputElement::defaultMaxLength();
EXPECT_FORM_FIELD_DATA_EQUALS(expected, result);
}
@@ -316,18 +317,18 @@ TEST_F(FormAutofillTest, WebFormControlElementToFormFieldInvalidType) {
TEST_F(FormAutofillTest, 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=\"empty\" autocomplete=\"\"/>"
+ "<INPUT type=\"text\" id=\"off\" autocomplete=\"off\"/>"
+ "<INPUT type=\"text\" id=\"regular\" autocomplete=\"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\"/>"
+ " autocomplete=\"billing email\"/>"
+ "<INPUT type=\"text\" id=\"experimental\" x-autocompletetype=\"email\"/>"
+ "<SELECT id=\"select\" autocomplete=\"state\"/>"
" <OPTION value=\"CA\">California</OPTION>"
" <OPTION value=\"TX\">Texas</OPTION>"
"</SELECT>";
html +=
- "<INPUT type=\"text\" id=\"malicious\" x-autocompletetype=\"" +
+ "<INPUT type=\"text\" id=\"malicious\" autocomplete=\"" +
std::string(10000, 'x') + "\"/>";
LoadHTML(html.c_str());
@@ -335,95 +336,130 @@ TEST_F(FormAutofillTest, WebFormControlElementToFormFieldAutocompletetype) {
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>();
- FormFieldData result1;
- WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result1);
+ {
+ WebElement web_element = frame->document().getElementById("absent");
+ WebFormControlElement element = web_element.to<WebFormControlElement>();
+ FormFieldData result;
+ WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result);
Dan Beam 2012/10/19 00:12:44 nit: these tests overall could probably be a bit l
Ilya Sherman 2012/10/19 04:19:32 Didn't extract a function, but I consolidated a lo
- FormFieldData expected;
- expected.name = ASCIIToUTF16("absent");
- expected.form_control_type = ASCIIToUTF16("text");
- expected.autocomplete_type = string16();
- expected.max_length = WebInputElement::defaultMaxLength();
- EXPECT_FORM_FIELD_DATA_EQUALS(expected, result1);
+ FormFieldData expected;
+ expected.name = ASCIIToUTF16("absent");
+ expected.form_control_type = ASCIIToUTF16("text");
+ expected.autocomplete_attribute = string16();
+ expected.max_length = WebInputElement::defaultMaxLength();
+ EXPECT_FORM_FIELD_DATA_EQUALS(expected, result);
+ }
- web_element = frame->document().getElementById("empty");
- element = web_element.to<WebFormControlElement>();
- FormFieldData result2;
- WebFormControlElementToFormField(element, autofill::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_DATA_EQUALS(expected, result2);
+ // Make sure there are no issues parsing an empty attribute.
+ {
+ WebElement web_element = frame->document().getElementById("empty");
+ WebFormControlElement element = web_element.to<WebFormControlElement>();
+ FormFieldData result;
+ WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result);
- // The renderer should trim whitespace.
- web_element = frame->document().getElementById("whitespace");
- element = web_element.to<WebFormControlElement>();
- FormFieldData result3;
- WebFormControlElementToFormField(element, autofill::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_DATA_EQUALS(expected, result3);
+ FormFieldData expected;
+ expected.name = ASCIIToUTF16("empty");
+ expected.form_control_type = ASCIIToUTF16("text");
+ expected.autocomplete_attribute = string16();
+ expected.max_length = WebInputElement::defaultMaxLength();
+ EXPECT_FORM_FIELD_DATA_EQUALS(expected, result);
+ }
+
+ // Make sure there are no issues parsing an attribute value that isn't a type
+ // hint.
+ {
+ WebElement web_element = frame->document().getElementById("off");
+ WebFormControlElement element = web_element.to<WebFormControlElement>();
+ FormFieldData result;
+ WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result);
+
+ FormFieldData expected;
+ expected.name = ASCIIToUTF16("off");
+ expected.form_control_type = ASCIIToUTF16("text");
+ expected.autocomplete_attribute = ASCIIToUTF16("off");
+ expected.max_length = WebInputElement::defaultMaxLength();
+ EXPECT_FORM_FIELD_DATA_EQUALS(expected, result);
+ }
// Common case: exactly one type specified.
- web_element = frame->document().getElementById("regular");
- element = web_element.to<WebFormControlElement>();
- FormFieldData result4;
- WebFormControlElementToFormField(element, autofill::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_DATA_EQUALS(expected, result4);
+ {
+ WebElement web_element = frame->document().getElementById("regular");
+ WebFormControlElement element = web_element.to<WebFormControlElement>();
+ FormFieldData result;
+ WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result);
- // Verify that we correctly extract fallback types as well.
- web_element = frame->document().getElementById("multi-valued");
- element = web_element.to<WebFormControlElement>();
- FormFieldData result5;
- WebFormControlElementToFormField(element, autofill::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_DATA_EQUALS(expected, result5);
+ FormFieldData expected;
+ expected.name = ASCIIToUTF16("regular");
+ expected.form_control_type = ASCIIToUTF16("text");
+ expected.autocomplete_attribute = ASCIIToUTF16("email");
+ expected.max_length = WebInputElement::defaultMaxLength();
+ EXPECT_FORM_FIELD_DATA_EQUALS(expected, result);
+ }
- // 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>();
- FormFieldData result6;
- WebFormControlElementToFormField(element, autofill::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_DATA_EQUALS(expected, result6);
+ // Verify that we correctly extract multiple tokens as well.
+ {
+ WebElement web_element = frame->document().getElementById("multi-valued");
+ WebFormControlElement element = web_element.to<WebFormControlElement>();
+ FormFieldData result;
+ WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result);
+
+ FormFieldData expected;
+ expected.name = ASCIIToUTF16("multi-valued");
+ expected.form_control_type = ASCIIToUTF16("text");
+ expected.autocomplete_attribute = ASCIIToUTF16("billing email");
+ expected.max_length = WebInputElement::defaultMaxLength();
+ EXPECT_FORM_FIELD_DATA_EQUALS(expected, result);
+ }
+
+ // We previously extracted this data from the experimental
+ // 'x-autocompletetype' attribute. Now that the field type hints are part of
+ // the spec under the autocomplete attribute, we no longer support the
+ // experimental version.
+ {
+ WebElement web_element = frame->document().getElementById("experimental");
+ WebFormControlElement element = web_element.to<WebFormControlElement>();
+ FormFieldData result;
+ WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result);
+
+ FormFieldData expected;
+ expected.name = ASCIIToUTF16("experimental");
+ expected.form_control_type = ASCIIToUTF16("text");
+ expected.autocomplete_attribute = string16();
+ expected.max_length = WebInputElement::defaultMaxLength();
+ EXPECT_FORM_FIELD_DATA_EQUALS(expected, result);
+ }
// <select> elements should behave no differently from text fields here.
- web_element = frame->document().getElementById("select");
- element = web_element.to<WebFormControlElement>();
- FormFieldData result7;
- WebFormControlElementToFormField(element, autofill::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_DATA_EQUALS(expected, result7);
+ {
+ WebElement web_element = frame->document().getElementById("select");
+ WebFormControlElement element = web_element.to<WebFormControlElement>();
+ FormFieldData result;
+ WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result);
+
+ FormFieldData expected;
+ expected.name = ASCIIToUTF16("select");
+ expected.form_control_type = ASCIIToUTF16("select-one");
+ expected.autocomplete_attribute = ASCIIToUTF16("state");
+ expected.max_length = 0;
+ EXPECT_FORM_FIELD_DATA_EQUALS(expected, result);
+ }
// 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>();
- FormFieldData result8;
- WebFormControlElementToFormField(element, autofill::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_DATA_EQUALS(expected, result8);
+ {
+ WebElement web_element = frame->document().getElementById("malicious");
+ WebFormControlElement element = web_element.to<WebFormControlElement>();
+ FormFieldData result;
+ WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result);
+
+ FormFieldData expected;
+ expected.name = ASCIIToUTF16("malicious");
+ expected.form_control_type = ASCIIToUTF16("text");
+ expected.autocomplete_attribute =
+ ASCIIToUTF16("x-max-data-length-exceeded");
+ expected.max_length = WebInputElement::defaultMaxLength();
+ EXPECT_FORM_FIELD_DATA_EQUALS(expected, result);
+ }
}
TEST_F(FormAutofillTest, WebFormElementToFormData) {
@@ -746,10 +782,12 @@ TEST_F(FormAutofillTest, FindForm) {
expected.name = ASCIIToUTF16("email");
expected.value = ASCIIToUTF16("john@example.com");
+ expected.autocomplete_attribute = ASCIIToUTF16("off");
EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]);
expected.name = ASCIIToUTF16("phone");
expected.value = ASCIIToUTF16("1.800.555.1234");
+ expected.autocomplete_attribute = string16();
EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]);
// Try again, but require autocomplete.
@@ -2496,10 +2534,12 @@ TEST_F(FormAutofillTest, ClearFormWithNode) {
expected.name = ASCIIToUTF16("noAC");
expected.value = string16();
+ expected.autocomplete_attribute = ASCIIToUTF16("off");
EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]);
expected.name = ASCIIToUTF16("notenabled");
expected.value = ASCIIToUTF16("no clear");
+ expected.autocomplete_attribute = string16();
EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[3]);
// Verify that the cursor position has been updated.

Powered by Google App Engine
This is Rietveld 408576698