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. |