Chromium Code Reviews| 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. |