| <!DOCTYPE html> |
| <meta charset=utf-8> |
| <title>form autocomplete attribute</title> |
| <link rel="author" title="Denis Ah-Kang" href="mailto:denis@w3.org"> |
| <link rel=help href="https://html.spec.whatwg.org/multipage/#the-form-element"> |
| <link rel=help href="https://html.spec.whatwg.org/multipage/#attr-fe-autocomplete"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <div id="log"></div> |
| <form name="missing_attribute"> |
| <input> |
| <input autocomplete="on"> |
| <input autocomplete="off"> |
| <input autocomplete="foobar"> |
| </form> |
| <form name="autocomplete_on" autocomplete="on"> |
| <input> |
| <input autocomplete="on"> |
| <input autocomplete="off"> |
| <input autocomplete="foobar"> |
| </form> |
| <form name="autocomplete_off" autocomplete="off"> |
| <input> |
| <input autocomplete="on"> |
| <input autocomplete="off"> |
| <input autocomplete="foobar"> |
| </form> |
| <form name="autocomplete_invalid" autocomplete="foobar"> |
| <input> |
| <input autocomplete="on"> |
| <input autocomplete="off"> |
| <input autocomplete="foobar"> |
| </form> |
| <script> |
| function autocompletetest(form, expectedValues, desc) { |
| test(function(){ |
| assert_equals(form.autocomplete, expectedValues[0]); |
| assert_equals(form.elements[0].autocomplete, expectedValues[1]); |
| assert_equals(form.elements[1].autocomplete, expectedValues[2]); |
| assert_equals(form.elements[2].autocomplete, expectedValues[3]); |
| assert_equals(form.elements[3].autocomplete, expectedValues[4]); |
| }, desc); |
| } |
| |
| autocompletetest(document.forms.missing_attribute, ["on", "", "on", "off", ""], "form autocomplete attribute missing"); |
| autocompletetest(document.forms.autocomplete_on, ["on", "", "on", "off", ""], "form autocomplete attribute on"); |
| autocompletetest(document.forms.autocomplete_off, ["off", "", "on", "off", ""], "form autocomplete attribute off"); |
| autocompletetest(document.forms.autocomplete_invalid, ["on", "", "on", "off", ""], "form autocomplete attribute invalid"); |
| |
| var keywords = [ "on", "off", "name", "honorific-prefix", "given-name", "additional-name", "family-name", "honorific-suffix", "nickname", "username", "new-password", "current-password", "one-time-code", "organization-title", "organization", "street-address", "address-line1", "address-line2", "address-line3", "address-level4", "address-level3", "address-level2", "address-level1", "country", "country-name", "postal-code", "cc-name", "cc-given-name", "cc-additional-name", "cc-family-name", "cc-number", "cc-exp", "cc-exp-month", "cc-exp-year", "cc-csc", "cc-type", "transaction-currency", "transaction-amount", "language", "bday", "bday-day", "bday-month", "bday-year", "sex", "url", "photo", "tel", "tel-country-code", "tel-national", "tel-area-code", "tel-local", "tel-local-prefix", "tel-local-suffix", "tel-extension", "email", "impp" ]; |
| |
| keywords.forEach(function(keyword) { |
| test(function(){ |
| var input = document.createElement("input"); |
| // Include whitespace to test splitting tokens on whitespace. |
| // Convert to uppercase to ensure that the tokens are normalized to lowercase. |
| input.setAttribute("autocomplete", " " + keyword.toUpperCase() + "\t"); |
| assert_equals(input.autocomplete, keyword); |
| }, keyword + " is an allowed autocomplete field name"); |
| }); |
| |
| |
| test(() => { |
| const select = document.createElement("select"); |
| select.setAttribute("autocomplete", " \n"); |
| assert_equals(select.autocomplete, ""); |
| }, "Test whitespace-only attribute value"); |
| |
| test(() => { |
| const select = document.createElement("select"); |
| |
| select.setAttribute("autocomplete", "foo off"); |
| assert_equals(select.autocomplete, ""); |
| |
| // Normal category; max=3 |
| select.setAttribute("autocomplete", "foo section-foo billing name"); |
| assert_equals(select.autocomplete, ""); |
| |
| // Contact category; max=4 |
| select.setAttribute("autocomplete", "foo section-bar billing work name"); |
| assert_equals(select.autocomplete, ""); |
| }, "Test maximum number of tokens"); |
| |
| test(() => { |
| const textarea = document.createElement("textarea"); |
| |
| textarea.setAttribute("autocomplete", "call-sign"); |
| assert_equals(textarea.autocomplete, ""); |
| }, "Unknown field"); |
| |
| test(() => { |
| const hidden = document.createElement("input"); |
| hidden.type = "hidden"; |
| hidden.setAttribute("autocomplete", "on"); |
| assert_equals(hidden.autocomplete, ""); |
| hidden.setAttribute("autocomplete", "off"); |
| assert_equals(hidden.autocomplete, ""); |
| }, "Test 'wearing the autofill anchor mantle' with off/on"); |
| |
| test(() => { |
| const textarea = document.createElement("textarea"); |
| |
| textarea.setAttribute("autocomplete", " HOME\ntel"); |
| assert_equals(textarea.autocomplete, "home tel"); |
| |
| textarea.setAttribute("autocomplete", "shipping country"); |
| assert_equals(textarea.autocomplete, "shipping country"); |
| |
| textarea.setAttribute("autocomplete", "billing work email"); |
| assert_equals(textarea.autocomplete, "billing work email"); |
| |
| textarea.setAttribute("autocomplete", " section-FOO bday"); |
| assert_equals(textarea.autocomplete, "section-foo bday"); |
| }, "Serialize combinations of section, mode, contact, and field"); |
| |
| </script> |