| 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" },
|
| + };
|
| +
|
| + 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();
|
| + 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.
|
|
|