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..6cdb104509b0a15cd9599761f3c27258c4d7c1d5 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,114 +317,73 @@ 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()); |
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>(); |
- FormFieldData result1; |
- WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result1); |
+ struct TestCase { |
+ const std::string element_id; |
+ const std::string form_control_type; |
+ const std::string autocomplete_attribute; |
+ }; |
+ TestCase test_cases[] = { |
+ // An absent attribute is equivalent to an empty one. |
+ { "absent", "text", "" }, |
+ // Make sure there are no issues parsing an empty attribute. |
+ { "empty", "text", "" }, |
+ // Make sure there are no issues parsing an attribute value that isn't a |
+ // type hint. |
+ { "off", "text", "off" }, |
+ // Common case: exactly one type specified. |
+ { "regular", "text", "email" }, |
+ // Verify that we correctly extract multiple tokens as well. |
+ { "multi-valued", "text", "billing email" }, |
+ // 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. |
+ { "experimental", "text", "" }, |
+ // <select> elements should behave no differently from text fields here. |
+ { "select", "select-one", "state" }, |
+ // Very long attribute values should be replaced by a default string, to |
+ // prevent malicious websites from DOSing the browser process. |
+ { "malicious", "text", "x-max-data-length-exceeded" }, |
+ }; |
Dan Beam
2012/10/19 04:25:41
this looks way better!
|
+ |
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { |
+ WebElement web_element = frame->document().getElementById( |
+ ASCIIToUTF16(test_cases[i].element_id)); |
+ WebFormControlElement element = web_element.to<WebFormControlElement>(); |
+ FormFieldData result; |
+ WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result); |
- 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); |
- |
- 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); |
- |
- // 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); |
- |
- // 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); |
- |
- // 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); |
- |
- // 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); |
- |
- // <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); |
- |
- // 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); |
+ FormFieldData expected; |
+ expected.name = ASCIIToUTF16(test_cases[i].element_id); |
+ expected.form_control_type = ASCIIToUTF16(test_cases[i].form_control_type); |
+ expected.autocomplete_attribute = |
+ ASCIIToUTF16(test_cases[i].autocomplete_attribute); |
+ if (test_cases[i].form_control_type == "text") |
+ expected.max_length = WebInputElement::defaultMaxLength(); |
Dan Beam
2012/10/19 04:25:41
nit: ternary IMO, if it doesn't look gross
Ilya Sherman
2012/10/19 04:54:11
Using a ternary operator results in wrapped lines
|
+ else |
+ expected.max_length = 0; |
+ |
+ SCOPED_TRACE(test_cases[i].element_id); |
+ EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); |
+ } |
} |
TEST_F(FormAutofillTest, WebFormElementToFormData) { |
@@ -746,10 +706,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 +2458,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. |