blob: 7e24fd946436314944b7866aff69ef5c062e598c [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description('Tests for valid autocomplete tokens on input, select, and textarea elements.');
var input = document.createElement('input');
var textarea = document.createElement('textarea');
var select = document.createElement('select');
var button = document.createElement('button');
var keygen = document.createElement('keygen');
var autocompleteableControls = [ input, textarea, select ];
var keywords = [ "name", "honorific-prefix", "given-name", "additional-name", "family-name", "honorific-suffix", "nickname", "organization-title", "username", "new-password", "current-password", "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" ];
var modeTokens = [ "billing", "shipping" ];
debug('Valid keywords:');
keywords.forEach(keyword => {
input.autocomplete = keyword;
shouldBeEqualToString('input.autocomplete', keyword);
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(input)', keyword);
});
debug('');
debug('Contact scope:');
var contactTokens = [ "tel", "tel-country-code", "tel-national", "tel-area-code", "tel-local", "tel-local-prefix", "tel-local-suffix", "tel-extension", "email", "impp" ];
var contactScopeTokens = [ "home", "work", "mobile", "fax", "pager" ];
contactScopeTokens.forEach(scopeToken => {
contactTokens.forEach(contactToken => {
input.autocomplete = scopeToken + " " + contactToken;
shouldBeEqualToString('input.autocomplete', scopeToken + " " + contactToken);
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(input)', contactToken);
})
});
debug('');
debug('Mode:');
var addressTokens = [ "street-address", "address-line1", "address-line2", "address-line3", "address-level4", "address-level3", "address-level2", "address-level1", "country", "country-name", "postal-code" ];
var modeTokens = [ "shipping", "billing" ];
modeTokens.forEach(modeToken => {
addressTokens.forEach(addressToken => {
input.autocomplete = modeToken + " " + addressToken;
shouldBeEqualToString('input.autocomplete', modeToken + " " + addressToken);
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(input)', addressToken);
})
});
debug('');
debug('Section:');
keywords.forEach(keyword => {
var value = "section-parent " + keyword;
input.autocomplete = value;
shouldBeEqualToString('input.autocomplete', value);
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(input)', keyword);
});
debug('');
debug('Invalid combinations:');
autocompleteableControls.forEach(control => {
control.autocomplete = 'invalid';
shouldBeEmptyString('input.autocomplete');
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(input)', "on");
});
// Two normal tokens
input.autocomplete = "name name";
shouldBeEmptyString('input.autocomplete');
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(input)', "on");
input.autocomplete = "name bday";
shouldBeEmptyString('input.autocomplete');
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(input)', "on");
// Contact scope token + non-contact token.
input.autocomplete = "pager bday";
shouldBeEmptyString('input.autocomplete');
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(input)', "on");
// Two contact scope tokens.
input.autocomplete = "home work tel";
shouldBeEmptyString('input.autocomplete');
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(input)', "on");
// Two mode tokens.
input.autocomplete = "shipping billing tel";
shouldBeEmptyString('input.autocomplete');
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(input)', "on");
// Two section tokens.
input.autocomplete = "section-a section-b tel";
shouldBeEmptyString('input.autocomplete');
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(input)', "on");
// Anything + on/off.
input.autocomplete = "tel on";
shouldBeEmptyString('input.autocomplete');
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(input)', "on");
input.autocomplete = "tel off";
shouldBeEmptyString('input.autocomplete');
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(input)', "on");
// Test dynamically changing the form owner's autocomplete attribute
// to ensure the field name correctly reflects it.
var form = document.createElement("form");
var inputInAutocompleteOffForm = document.createElement("input");
form.appendChild(inputInAutocompleteOffForm);
document.body.appendChild(form);
form.autocomplete = "off";
inputInAutocompleteOffForm.autocomplete = "";
shouldBeEmptyString('inputInAutocompleteOffForm.autocomplete');
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(inputInAutocompleteOffForm)', "off");
form.autocomplete = "on";
shouldBeEmptyString('inputInAutocompleteOffForm.autocomplete');
if (window.internals)
shouldBeEqualToString('window.internals.autofillFieldName(inputInAutocompleteOffForm)', "on");
debug('');
debug('Non-autocompleteable controls:');
// Buttons and keygens are not autocompleteable, so their autocomplete attribute is not sanitized.
button.autocomplete = 'invalid';
shouldBeEqualToString('button.autocomplete', 'invalid');
keygen.autocomplete = 'invalid';
shouldBeEqualToString('keygen.autocomplete', 'invalid');
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>