blob: 7243706db27a544e14e3f6bf14e262520cf1714f [file] [log] [blame]
<!DOCTYPE html>
<head>
<title>document.all</title>
<body>
<p>Tests document.all</p>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
let validNamedElementTags = ['a', 'button', 'embed', 'form', 'frame', 'frameset', 'iframe', 'img', 'input', 'map', 'meta', 'object', 'select', 'textarea'];
let invalidNamedElementTags = ['div', 'span', 'applet'];
let validAnInvalidNamedElementTags = validNamedElementTags.concat(invalidNamedElementTags);
let playground = document.createElement('div');
document.body.append(playground);
test(function() {
assert_equals(document.all[0], document.documentElement);
assert_equals(document.all[1], document.head);
assert_equals(document.all[2], document.head.firstElementChild);
}, "document.all's index getter returns all the elements in document order");
test(function() {
assert_equals(document.all[document.all.length + 1], undefined);
}, "document.all's index getter returns undefined for indexes greater than length");
test(function() {
assert_equals(document.all[-1], undefined);
}, "document.all's index getter returns undefined for indexes less than zero");
for (let elementTag of validNamedElementTags) {
test(function() {
let element = document.createElement(elementTag);
element.setAttribute("name", "testName");
playground.append(element);
assert_equals(document.all.namedItem('testName'), element);
assert_equals(document.all['testName'], element);
assert_equals(document.all.item('testName'), element);
assert_equals(document.all('testName'), element);
element.remove();
}, "document.all's name attribute accessing works for " + elementTag);
}
for (let elementTag of invalidNamedElementTags) {
test(function() {
let element = document.createElement(elementTag);
element.setAttribute("name", "testName");
playground.append(element);
assert_equals(document.all.namedItem('testName'), null);
assert_equals(document.all['testName'], undefined);
assert_equals(document.all.item('testName'), null);
assert_equals(document.all('testName'), null);
element.remove();
}, "document.all's name attribute accessing doesn't work for " + elementTag);
}
for (let elementTag of validAnInvalidNamedElementTags) {
test(function() {
let element = document.createElement(elementTag);
element.setAttribute("id", "testId");
playground.append(element);
assert_equals(document.all.namedItem('testId'), element);
assert_equals(document.all['testId'], element);
assert_equals(document.all.item('testId'), element);
assert_equals(document.all('testId'), element);
element.remove();
}, "document.all's id attribute accessing works for " + elementTag);
}
test(function() {
let element1 = document.createElement('button');
element1.setAttribute("name", "test");
playground.append(element1);
let element2 = document.createElement('span');
element2.setAttribute("id", "test");
playground.append(element2);
assert_equals(document.all.namedItem('test').length, 2);
assert_equals(document.all['test'].length, 2);
assert_equals(document.all.item('test').length, 2);
assert_equals(document.all('test').length, 2);
assert_class_string(document.all.namedItem('test'), "HTMLCollection");
assert_class_string(document.all['test'], "HTMLCollection");
assert_class_string(document.all.item('test'), "HTMLCollection");
assert_class_string(document.all('test'), "HTMLCollection");
element1.remove();
element2.remove();
}, "document.all will return a sub-collection if the name/id is found more than once");
test(function() {
let element1 = document.createElement('button');
element1.setAttribute("name", "test");
playground.append(element1);
let element2 = document.createElement('span');
element2.setAttribute("id", "test");
playground.append(element2);
let element3 = document.createElement('span');
element3.setAttribute("name", "test");
playground.append(element2);
assert_equals(document.all.namedItem('test').length, 2);
assert_equals(document.all['test'].length, 2);
assert_equals(document.all.item('test').length, 2);
assert_equals(document.all('test').length, 2);
assert_equals(document.all.namedItem('test')[0], element1);
assert_equals(document.all.namedItem('test')[1], element2);
assert_equals(document.all['test'][0], element1);
assert_equals(document.all['test'][1], element2);
assert_equals(document.all.item('test')[0], element1);
assert_equals(document.all.item('test')[1], element2);
assert_equals(document.all('test')[0], element1);
assert_equals(document.all('test')[1], element2);
element1.remove();
element2.remove();
element3.remove();
}, "document.all will return a sub-collection if the name/id is found more than once, but still adheres to the rules about what tags can have names");
test(function() {
let element1 = document.createElement('button');
element1.setAttribute("name", "test");
playground.append(element1);
let element2 = document.createElement('span');
element2.setAttribute("id", "test");
playground.append(element2);
let collection = document.all.namedItem('test');
assert_equals(collection.length, 2);
let element3 = document.createElement('img');
element3.setAttribute("name", "test");
playground.append(element3);
assert_equals(collection.length, 3);
element1.remove();
element2.remove();
assert_equals(collection.length, 1);
element3.remove();
}, "document.all will return a sub-collection if the name/id is found more than once, that is live");
test(function() {
assert_throws_js(TypeError, function() { document.all.namedItem() });
}, "document.all's namedItem function requires passing an argument");
test(function() {
assert_equals(document.all.item(), null);
assert_equals(document.all(), null);
}, "document.all's item function and legacy caller functionality allow passing no arguments");
test(function() {
let element = document.createElement('button');
element.setAttribute("name", "0");
playground.append(element);
assert_equals(document.all.item('0'), document.documentElement);
assert_equals(document.all('0'), document.documentElement);
assert_equals(document.all.namedItem('0'), element);
element.remove();
}, "document.all's item function and legacy caller functionality will try to convert their DOMString argument to an index before name lookup");
playground.remove();
</script>
</body>