| <!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> |