htmlallcollection.html (11648B)
1 <!DOCTYPE HTML> 2 <html id="root"> 3 <head> 4 <title>HTMLAllCollection Tests</title> 5 <link rel="author" title="Dan Druta" href="mailto:dan.druta@att.com"/> 6 <link rel="author" title="Philip Jägenstedt" href="mailto:philip@foolip.org"/> 7 <link rel="help" href="https://html.spec.whatwg.org/multipage/infrastructure.html#the-htmlallcollection-interface"/> 8 <meta name="flags" content="TOKENS" /> 9 <meta name="assert" content="TEST ASSERTION"/> 10 <script src="/resources/testharness.js"></script> 11 <script src="/resources/testharnessreport.js"></script> 12 </head> 13 <body id="tags"> 14 <img src="../../../../images/green.png" name="picture"> 15 <a name="foo"></a> 16 <a name="foo"></a> 17 <span id="42"></span> 18 <span id="043"></span> 19 <div id="4294967294"></div> 20 <div id="4294967295"></div> 21 <div id="4294967296"></div> 22 <div id="undefined"></div> 23 <div id="null"></div> 24 <div name="divwithname"></div> 25 <div id="-0"></div> 26 <div id="log"></div> 27 <script> 28 var anchors = document.querySelectorAll("a"); 29 var divs = document.querySelectorAll("div"); 30 var scripts = document.querySelectorAll("script"); 31 var spans = document.querySelectorAll("span"); 32 33 test(function() { 34 assert_true(document.all instanceof HTMLAllCollection); 35 }, "document.all is an HTMLAllCollection"); 36 37 test(function() { 38 assert_equals(document.all.length, 25); 39 }, "length attribute"); 40 41 // indexed property getter 42 43 test(function() { 44 assert_equals(document.all[0], document.documentElement); 45 assert_equals(document.all[-0], document.documentElement); 46 assert_equals(document.all[24], scripts[2]); 47 }, "indexed property getter"); 48 49 test(function() { 50 assert_equals(document.all[-1], undefined); 51 assert_equals(document.all[25], undefined); 52 assert_equals(document.all[42], undefined); 53 assert_equals(document.all[43], undefined); 54 assert_equals(document.all[4294967294], undefined); 55 assert_equals(document.all[4294967295], divs[1]); 56 assert_equals(document.all[4294967296], divs[2]); 57 }, "indexed property getter out of range"); 58 59 // named property getter 60 61 test(function() { 62 assert_equals(document.all["root"], document.documentElement); 63 assert_equals(document.all["flags"].content, "TOKENS"); 64 assert_equals(document.all["picture"].tagName, "IMG"); 65 }, "named property getter"); 66 67 test(function() { 68 assert_equals(document.all.root, document.documentElement); 69 assert_equals(document.all.flags.content, "TOKENS"); 70 assert_equals(document.all.picture.tagName, "IMG"); 71 }, "named property getter with dot syntax"); 72 73 test(function() { 74 assert_equals(document.all[""], undefined); 75 assert_equals(document.all["noname"], undefined); 76 assert_equals(document.all.noname, undefined); 77 assert_equals(document.all["divwithname"], undefined); 78 assert_equals(document.all.divwithname, undefined); 79 }, "named property getter with invalid name"); 80 81 test(function() { 82 var collection = document.all["foo"]; 83 assert_equals(collection.length, 2); 84 assert_equals(collection[0], anchors[0]); 85 assert_equals(collection[1], anchors[1]); 86 }, "named property getter returning collection"); 87 88 test(function() { 89 assert_equals(document.all["0"], document.documentElement); 90 assert_equals(document.all["24"], document.scripts[2]); 91 assert_equals(document.all["25"], undefined); 92 assert_equals(document.all["42"], undefined); 93 assert_equals(document.all["43"], undefined); 94 }, "named property getter with \"array index property name\""); 95 96 test(function() { 97 assert_equals(document.all["00"], undefined); 98 assert_equals(document.all["042"], undefined); 99 assert_equals(document.all["043"], spans[1]); 100 assert_equals(document.all["4294967294"], undefined); 101 assert_equals(document.all["4294967295"], divs[1]); 102 assert_equals(document.all["4294967296"], divs[2]); 103 assert_equals(document.all["-0"], divs[6]); 104 }, "named property getter with invalid \"array index property name\""); 105 106 test(function() { 107 assert_equals(document.all[undefined], divs[3]); 108 }, "named property getter with undefined"); 109 110 test(function() { 111 assert_equals(document.all[null], divs[4]); 112 }, "named property getter with null"); 113 114 // namedItem method 115 116 test(function() { 117 assert_equals(document.all.namedItem("root"), document.documentElement); 118 assert_equals(document.all.namedItem("flags").content, "TOKENS"); 119 assert_equals(document.all.namedItem("picture").tagName, "IMG"); 120 }, "namedItem method"); 121 122 test(function() { 123 assert_equals(document.all.namedItem(""), null); 124 assert_equals(document.all.namedItem("noname"), null); 125 assert_equals(document.all.namedItem("divwithname"), null); 126 }, "namedItem method with invalid name"); 127 128 test(function() { 129 var collection = document.all.namedItem("foo"); 130 assert_equals(collection.length, 2); 131 assert_equals(collection[0], anchors[0]); 132 assert_equals(collection[1], anchors[1]); 133 }, "namedItem method returning collection"); 134 135 test(function() { 136 assert_equals(document.all.namedItem("0"), null); 137 assert_equals(document.all.namedItem("23"), null); 138 assert_equals(document.all.namedItem("24"), null); 139 assert_equals(document.all.namedItem("42"), spans[0]); 140 assert_equals(document.all.namedItem("43"), null); 141 }, "namedItem method with \"array index property name\""); 142 143 test(function() { 144 assert_equals(document.all.namedItem("00"), null); 145 assert_equals(document.all.namedItem("042"), null); 146 assert_equals(document.all.namedItem("043"), spans[1]); 147 assert_equals(document.all.namedItem("4294967294"), divs[0]); 148 assert_equals(document.all.namedItem("4294967295"), divs[1]); 149 assert_equals(document.all.namedItem("4294967296"), divs[2]); 150 assert_equals(document.all.namedItem("-0"), divs[6]); 151 }, "namedItem method with invalid \"array index property name\""); 152 153 test(function() { 154 assert_equals(document.all.namedItem(undefined), divs[3]); 155 }, "namedItem method with undefined"); 156 157 test(function() { 158 assert_equals(document.all.namedItem(null), divs[4]); 159 }, "namedItem method with null"); 160 161 test(function() { 162 assert_equals(document.all.namedItem.length, 1); 163 assert_throws_js(TypeError, function() { 164 document.all.namedItem(); 165 }); 166 }, "namedItem method with no argument"); 167 168 // legacy caller 169 170 test(function() { 171 assert_equals(document.all("root"), document.documentElement); 172 assert_equals(document.all("flags").content, "TOKENS"); 173 assert_equals(document.all("picture").tagName, "IMG"); 174 }, "legacy caller"); 175 176 test(function() { 177 assert_equals(document.all(""), null); 178 assert_equals(document.all("noname"), null); 179 assert_equals(document.all("divwithname"), null); 180 }, "legacy caller with invalid name"); 181 182 test(function() { 183 var collection = document.all("foo"); 184 assert_equals(collection.length, 2); 185 assert_equals(collection[0], anchors[0]); 186 assert_equals(collection[1], anchors[1]); 187 }, "legacy caller returning collection"); 188 189 test(function() { 190 assert_equals(document.all("0"), document.documentElement); 191 assert_equals(document.all("24"), document.scripts[2]); 192 assert_equals(document.all("25"), null); 193 assert_equals(document.all("42"), null); 194 assert_equals(document.all("43"), null); 195 }, "legacy caller with \"array index property name\""); 196 197 test(function() { 198 assert_equals(document.all(0), document.documentElement); 199 assert_equals(document.all(24), document.scripts[2]); 200 assert_equals(document.all(25), null); 201 assert_equals(document.all(42), null); 202 assert_equals(document.all(43), null); 203 }, "legacy caller with \"array index property name\" as number"); 204 205 test(function() { 206 assert_equals(document.all("00"), null); 207 assert_equals(document.all("042"), null); 208 assert_equals(document.all("043"), spans[1]); 209 assert_equals(document.all("4294967294"), null); 210 assert_equals(document.all("4294967295"), divs[1]); 211 assert_equals(document.all("4294967296"), divs[2]); 212 assert_equals(document.all("-0"), divs[6]); 213 }, "legacy caller with invalid \"array index property name\""); 214 215 test(function() { 216 assert_equals(document.all(undefined), null); 217 }, "legacy caller with undefined"); 218 219 test(function() { 220 assert_equals(document.all(null), divs[4]); 221 }, "legacy caller with null"); 222 223 test(function() { 224 assert_equals(document.all(), null); 225 }, "legacy caller with no argument"); 226 227 test(function() { 228 assert_throws_js(TypeError, function() { 229 new document.all("picture"); 230 }, "New should not work on document.all()"); 231 232 // https://esdiscuss.org/topic/isconstructor#content-11 233 assert_throws_js(TypeError, function() { 234 new (new Proxy(document.all, { 235 construct: function() { 236 return {}; 237 } 238 })); 239 }, "Proxies should treat document.all() as not-a-constructor"); 240 }, "legacy caller is not a constructor"); 241 242 test(function() { 243 [undefined, null, {}, document.body].forEach(function(thisValue) { 244 assert_equals(Function.prototype.call.call(document.all, thisValue, "043"), spans[1]); 245 }); 246 }, "legacy caller with arbitrary this value"); 247 248 // item method 249 250 test(function() { 251 assert_equals(document.all.item("root"), document.documentElement); 252 assert_equals(document.all.item("flags").content, "TOKENS"); 253 assert_equals(document.all.item("picture").tagName, "IMG"); 254 }, "item method"); 255 256 test(function() { 257 assert_equals(document.all.item(""), null); 258 assert_equals(document.all.item("noname"), null); 259 assert_equals(document.all.item("divwithname"), null); 260 }, "item method with invalid name"); 261 262 test(function() { 263 var collection = document.all.item("foo"); 264 assert_equals(collection.length, 2); 265 assert_equals(collection[0], anchors[0]); 266 assert_equals(collection[1], anchors[1]); 267 }, "item method returning collection"); 268 269 test(function() { 270 assert_equals(document.all.item("0"), document.documentElement); 271 assert_equals(document.all.item("24"), document.scripts[2]); 272 assert_equals(document.all.item("25"), null); 273 assert_equals(document.all.item("42"), null); 274 assert_equals(document.all.item("43"), null); 275 }, "item method with \"array index property name\""); 276 277 test(function() { 278 assert_equals(document.all.item(0), document.documentElement); 279 assert_equals(document.all.item(24), document.scripts[2]); 280 assert_equals(document.all.item(25), null); 281 assert_equals(document.all.item(42), null); 282 assert_equals(document.all.item(43), null); 283 }, "item method with \"array index property name\" as number"); 284 285 test(function() { 286 assert_equals(document.all.item("00"), null); 287 assert_equals(document.all.item("042"), null); 288 assert_equals(document.all.item("043"), spans[1]); 289 assert_equals(document.all.item("4294967294"), null); 290 assert_equals(document.all.item("4294967295"), divs[1]); 291 assert_equals(document.all.item("4294967296"), divs[2]); 292 assert_equals(document.all.item("-0"), divs[6]); 293 }, "item method with invalid \"array index property name\""); 294 295 test(function() { 296 assert_equals(document.all.item(undefined), null); 297 }, "item method with undefined"); 298 299 test(function() { 300 assert_equals(document.all.item(null), divs[4]); 301 }, "item method with null"); 302 303 test(function() { 304 assert_equals(document.all.item.length, 0); 305 assert_equals(document.all.item(), null); 306 }, "item method with no argument"); 307 308 // live HTMLCollection 309 310 test(function() { 311 var collections = [ 312 document.all["foo"], 313 document.all.namedItem("foo"), 314 document.all("foo"), 315 document.all.item("foo"), 316 ]; 317 // a new HTMLCollection is created for each call 318 for (var i = 0; i < collections.length; i++) { 319 assert_true(collections[i] instanceof HTMLCollection); 320 for (var j = i + 1; j < collections.length; j++) { 321 assert_not_equals(collections[i], collections[j]); 322 } 323 } 324 for (var c of collections) { 325 assert_equals(c.length, 2); 326 } 327 anchors[0].name = "bar"; 328 for (var c of collections) { 329 assert_equals(c.length, 1); 330 } 331 }, "collections are new live HTMLCollection instances"); 332 </script> 333 </body> 334 </html>