HTMLCollection-supported-property-names.html (4458B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <link rel=help href=https://dom.spec.whatwg.org/#interface-htmlcollection> 4 <script src=/resources/testharness.js></script> 5 <script src=/resources/testharnessreport.js></script> 6 7 <div id=log></div> 8 9 <!-- with no attribute --> 10 <span></span> 11 12 <!-- with `id` attribute --> 13 <span id=''></span> 14 <span id='some-id'></span> 15 <span id='some-id'></span><!-- to ensure no duplicates --> 16 17 <!-- with `name` attribute --> 18 <span name=''></span> 19 <span name='some-name'></span> 20 <span name='some-name'></span><!-- to ensure no duplicates --> 21 22 <!-- with `name` and `id` attribute --> 23 <span id='another-id' name='another-name'></span> 24 25 <script> 26 test(function () { 27 var elements = document.getElementsByTagName("span"); 28 assert_array_equals( 29 Object.getOwnPropertyNames(elements), 30 ['0', '1', '2', '3', '4', '5', '6', '7', 'some-id', 'some-name', 'another-id', 'another-name'] 31 ); 32 }, 'Object.getOwnPropertyNames on HTMLCollection'); 33 34 test(function () { 35 var elem = document.createElementNS('some-random-namespace', 'foo'); 36 this.add_cleanup(function () {elem.remove();}); 37 elem.setAttribute("name", "some-name"); 38 document.body.appendChild(elem); 39 40 var elements = document.getElementsByTagName("foo"); 41 assert_array_equals(Object.getOwnPropertyNames(elements), ['0']); 42 }, 'Object.getOwnPropertyNames on HTMLCollection with non-HTML namespace'); 43 44 test(function () { 45 var elem = document.createElement('foo'); 46 this.add_cleanup(function () {elem.remove();}); 47 document.body.appendChild(elem); 48 49 var elements = document.getElementsByTagName("foo"); 50 elements.someProperty = "some value"; 51 52 assert_array_equals(Object.getOwnPropertyNames(elements), ['0', 'someProperty']); 53 }, 'Object.getOwnPropertyNames on HTMLCollection with expando object'); 54 55 test(function() { 56 var elements = document.getElementsByTagName("span"); 57 var old_item = elements["some-id"]; 58 var old_desc = Object.getOwnPropertyDescriptor(elements, "some-id"); 59 assert_equals(old_desc.value, old_item); 60 assert_false(old_desc.enumerable); 61 assert_true(old_desc.configurable); 62 assert_false(old_desc.writable); 63 64 elements["some-id"] = 5; 65 assert_equals(elements["some-id"], old_item); 66 assert_throws_js(TypeError, function() { 67 "use strict"; 68 elements["some-id"] = 5; 69 }); 70 assert_throws_js(TypeError, function() { 71 Object.defineProperty(elements, "some-id", { value: 5 }); 72 }); 73 74 delete elements["some-id"]; 75 assert_equals(elements["some-id"], old_item); 76 77 assert_throws_js(TypeError, function() { 78 "use strict"; 79 delete elements["some-id"]; 80 }); 81 assert_equals(elements["some-id"], old_item); 82 83 }, 'Trying to set an expando that would shadow an already-existing named property'); 84 85 test(function() { 86 var elements = document.getElementsByTagName("span"); 87 var old_item = elements["new-id"]; 88 var old_desc = Object.getOwnPropertyDescriptor(elements, "new-id"); 89 assert_equals(old_item, undefined); 90 assert_equals(old_desc, undefined); 91 92 elements["new-id"] = 5; 93 assert_equals(elements["new-id"], 5); 94 95 var span = document.createElement("span"); 96 this.add_cleanup(function () {span.remove();}); 97 span.id = "new-id"; 98 document.body.appendChild(span); 99 100 assert_equals(elements.namedItem("new-id"), span); 101 assert_equals(elements["new-id"], 5); 102 103 delete elements["new-id"]; 104 assert_equals(elements["new-id"], span); 105 }, 'Trying to set an expando that shadows a named property that gets added later'); 106 107 test(function() { 108 var elements = document.getElementsByTagName("span"); 109 var old_item = elements["new-id2"]; 110 var old_desc = Object.getOwnPropertyDescriptor(elements, "new-id2"); 111 assert_equals(old_item, undefined); 112 assert_equals(old_desc, undefined); 113 114 Object.defineProperty(elements, "new-id2", { configurable: false, writable: 115 false, value: 5 }); 116 assert_equals(elements["new-id2"], 5); 117 118 var span = document.createElement("span"); 119 this.add_cleanup(function () {span.remove();}); 120 span.id = "new-id2"; 121 document.body.appendChild(span); 122 123 assert_equals(elements.namedItem("new-id2"), span); 124 assert_equals(elements["new-id2"], 5); 125 126 delete elements["new-id2"]; 127 assert_equals(elements["new-id2"], 5); 128 129 assert_throws_js(TypeError, function() { 130 "use strict"; 131 delete elements["new-id2"]; 132 }); 133 assert_equals(elements["new-id2"], 5); 134 }, 'Trying to set a non-configurable expando that shadows a named property that gets added later'); 135 </script>