test_nodelist.js (14649B)
1 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ 2 function run_test() { 3 test_getElementsByTagName(); 4 test_getElementsByTagNameNS(); 5 test_getElementsByAttribute(); 6 test_getElementsByAttributeNS(); 7 8 // What else should we test? 9 // XXXbz we need more tests here to test liveness! 10 } 11 12 function test_getElementsByTagName() { 13 var doc = ParseFile("nodelist_data_1.xml"); 14 var root = doc.documentElement; 15 16 // Check that getElementsByTagName returns an HTMLCollection. 17 Assert.equal( 18 ChromeUtils.getClassName(doc.getElementsByTagName("*")), 19 "HTMLCollection" 20 ); 21 Assert.ok( 22 ChromeUtils.getClassName(root.getElementsByTagName("*")), 23 "HTMLCollection" 24 ); 25 26 // Check that getElementsByTagName excludes the element it's called on. 27 Assert.equal( 28 doc.getElementsByTagName("*").length, 29 root.getElementsByTagName("*").length + 1 30 ); 31 Assert.equal(doc.getElementById("test2").getElementsByTagName("*").length, 8); 32 Assert.equal( 33 doc.getElementById("test2").getElementsByTagName("test").length, 34 3 35 ); 36 37 // Check that the first element of getElementsByTagName on the document is 38 // the right thing. 39 Assert.equal(doc.getElementsByTagName("*").item(0), root); 40 41 // Check that we get the right things in the right order 42 var numTests = doc.getElementsByTagName("test").length; 43 Assert.equal(numTests, 5); 44 45 for (var i = 1; i <= numTests; ++i) { 46 Assert.ok(Element.isInstance(doc.getElementById("test" + i))); 47 Assert.equal( 48 doc.getElementById("test" + i), 49 doc.getElementsByTagName("test").item(i - 1) 50 ); 51 } 52 53 // Check that we handle tagnames containing ':' correctly 54 Assert.equal( 55 ChromeUtils.getClassName(doc.getElementsByTagName("foo:test")), 56 "HTMLCollection" 57 ); 58 Assert.equal(doc.getElementsByTagName("foo:test").length, 2); 59 60 Assert.equal( 61 ChromeUtils.getClassName(doc.getElementsByTagName("foo2:test")), 62 "HTMLCollection" 63 ); 64 Assert.equal(doc.getElementsByTagName("foo2:test").length, 3); 65 66 Assert.equal( 67 ChromeUtils.getClassName(doc.getElementsByTagName("bar:test")), 68 "HTMLCollection" 69 ); 70 Assert.equal(doc.getElementsByTagName("bar:test").length, 4); 71 } 72 73 function test_getElementsByTagNameNS() { 74 var doc = ParseFile("nodelist_data_1.xml"); 75 var root = doc.documentElement; 76 77 // Check that getElementsByTagNameNS returns an HTMLCollection. 78 Assert.equal( 79 ChromeUtils.getClassName(doc.getElementsByTagNameNS("*", "*")), 80 "HTMLCollection" 81 ); 82 Assert.equal( 83 ChromeUtils.getClassName(root.getElementsByTagNameNS("*", "*")), 84 "HTMLCollection" 85 ); 86 87 // Check that passing "" and null for the namespace URI gives the same result 88 var list1 = doc.getElementsByTagNameNS("", "test"); 89 var list2 = doc.getElementsByTagNameNS(null, "test"); 90 Assert.equal(list1.length, list2.length); 91 for (var i = 0; i < list1.length; ++i) { 92 Assert.equal(list1.item(i), list2.item(i)); 93 } 94 95 // Check that getElementsByTagNameNS excludes the element it's called on. 96 Assert.equal( 97 doc.getElementsByTagNameNS("*", "*").length, 98 root.getElementsByTagNameNS("*", "*").length + 1 99 ); 100 Assert.equal( 101 doc.getElementById("test2").getElementsByTagNameNS("*", "*").length, 102 8 103 ); 104 Assert.equal( 105 doc.getElementById("test2").getElementsByTagNameNS("", "test").length, 106 1 107 ); 108 Assert.equal( 109 doc.getElementById("test2").getElementsByTagNameNS("*", "test").length, 110 7 111 ); 112 113 // Check that the first element of getElementsByTagNameNS on the document is 114 // the right thing. 115 Assert.equal(doc.getElementsByTagNameNS("*", "*").item(0), root); 116 Assert.equal(doc.getElementsByTagNameNS(null, "*").item(0), root); 117 118 // Check that we get the right things in the right order 119 120 var numTests = doc.getElementsByTagNameNS("*", "test").length; 121 Assert.equal(numTests, 14); 122 123 for (i = 1; i <= numTests; ++i) { 124 Assert.ok(Element.isInstance(doc.getElementById("test" + i))); 125 Assert.equal( 126 doc.getElementById("test" + i), 127 doc.getElementsByTagNameNS("*", "test").item(i - 1) 128 ); 129 } 130 131 // Check general proper functioning of having a non-wildcard namespace. 132 var test2 = doc.getElementById("test2"); 133 Assert.equal(doc.getElementsByTagNameNS("", "test").length, 3); 134 Assert.equal(test2.getElementsByTagNameNS("", "test").length, 1); 135 Assert.equal(doc.getElementsByTagNameNS("foo", "test").length, 7); 136 Assert.equal(test2.getElementsByTagNameNS("foo", "test").length, 4); 137 Assert.equal(doc.getElementsByTagNameNS("foo2", "test").length, 0); 138 Assert.equal(test2.getElementsByTagNameNS("foo2", "test").length, 0); 139 Assert.equal(doc.getElementsByTagNameNS("bar", "test").length, 4); 140 Assert.equal(test2.getElementsByTagNameNS("bar", "test").length, 2); 141 142 // Check that we handle tagnames containing ':' correctly 143 Assert.equal( 144 ChromeUtils.getClassName(doc.getElementsByTagNameNS(null, "foo:test")), 145 "HTMLCollection" 146 ); 147 Assert.equal(doc.getElementsByTagNameNS(null, "foo:test").length, 0); 148 Assert.equal(doc.getElementsByTagNameNS("foo", "foo:test").length, 0); 149 Assert.equal(doc.getElementsByTagNameNS("bar", "foo:test").length, 0); 150 Assert.equal(doc.getElementsByTagNameNS("*", "foo:test").length, 0); 151 152 Assert.equal( 153 ChromeUtils.getClassName(doc.getElementsByTagNameNS(null, "foo2:test")), 154 "HTMLCollection" 155 ); 156 Assert.equal(doc.getElementsByTagNameNS(null, "foo2:test").length, 0); 157 Assert.equal(doc.getElementsByTagNameNS("foo2", "foo2:test").length, 0); 158 Assert.equal(doc.getElementsByTagNameNS("bar", "foo2:test").length, 0); 159 Assert.equal(doc.getElementsByTagNameNS("*", "foo2:test").length, 0); 160 161 Assert.equal( 162 ChromeUtils.getClassName(doc.getElementsByTagNameNS(null, "bar:test")), 163 "HTMLCollection" 164 ); 165 Assert.equal(doc.getElementsByTagNameNS(null, "bar:test").length, 0); 166 Assert.equal(doc.getElementsByTagNameNS("bar", "bar:test").length, 0); 167 Assert.equal(doc.getElementsByTagNameNS("*", "bar:test").length, 0); 168 169 // Check that previously-unknown namespaces are handled right. Note that we 170 // can just hardcode the strings, since we're running only once in XPCshell. 171 // If someone wants to run these in a browser, some use of Math.random() may 172 // be in order. 173 list1 = doc.getElementsByTagNameNS("random-bogus-namespace", "foo"); 174 list2 = doc.documentElement.getElementsByTagNameNS( 175 "random-bogus-namespace2", 176 "foo" 177 ); 178 Assert.notEqual(list1, list2); 179 Assert.equal(list1.length, 0); 180 Assert.equal(list2.length, 0); 181 var newNode = doc.createElementNS("random-bogus-namespace", "foo"); 182 doc.documentElement.appendChild(newNode); 183 newNode = doc.createElementNS("random-bogus-namespace2", "foo"); 184 doc.documentElement.appendChild(newNode); 185 Assert.equal(list1.length, 1); 186 Assert.equal(list2.length, 1); 187 } 188 189 function test_getElementsByAttribute() { 190 var doc = ParseFile("nodelist_data_2.xhtml"); 191 var root = doc.documentElement; 192 193 Assert.equal(ChromeUtils.getClassName(root), "XULElement"); 194 195 Assert.equal( 196 ChromeUtils.getClassName(root.getElementsByAttribute("foo", "foo")), 197 "HTMLCollection" 198 ); 199 200 var master1 = doc.getElementById("master1"); 201 var master2 = doc.getElementById("master2"); 202 var master3 = doc.getElementById("master3"); 203 var external = doc.getElementById("external"); 204 205 Assert.equal(ChromeUtils.getClassName(master1), "XULElement"); 206 Assert.equal(ChromeUtils.getClassName(master2), "XULElement"); 207 Assert.equal(ChromeUtils.getClassName(master3), "XULElement"); 208 Assert.equal(ChromeUtils.getClassName(external), "XULElement"); 209 210 // Basic tests 211 Assert.equal(root.getElementsByAttribute("foo", "foo").length, 14); 212 Assert.equal(master1.getElementsByAttribute("foo", "foo").length, 4); 213 214 Assert.equal(root.getElementsByAttribute("foo", "bar").length, 7); 215 Assert.equal(master1.getElementsByAttribute("foo", "bar").length, 2); 216 217 Assert.equal(root.getElementsByAttribute("bar", "bar").length, 7); 218 Assert.equal(master1.getElementsByAttribute("bar", "bar").length, 2); 219 220 Assert.equal(root.getElementsByAttribute("foo", "*").length, 21); 221 Assert.equal(master1.getElementsByAttribute("foo", "*").length, 6); 222 223 // Test the various combinations of attributes with colons in the name 224 Assert.equal(root.getElementsByAttribute("foo:foo", "foo").length, 16); 225 Assert.equal(master1.getElementsByAttribute("foo:foo", "foo").length, 5); 226 Assert.equal(master2.getElementsByAttribute("foo:foo", "foo").length, 4); 227 Assert.equal(master3.getElementsByAttribute("foo:foo", "foo").length, 4); 228 Assert.equal(external.getElementsByAttribute("foo:foo", "foo").length, 2); 229 230 Assert.equal(root.getElementsByAttribute("foo:foo", "bar").length, 9); 231 Assert.equal(master1.getElementsByAttribute("foo:foo", "bar").length, 2); 232 Assert.equal(master2.getElementsByAttribute("foo:foo", "bar").length, 3); 233 Assert.equal(master3.getElementsByAttribute("foo:foo", "bar").length, 2); 234 Assert.equal(external.getElementsByAttribute("foo:foo", "bar").length, 1); 235 236 Assert.equal(root.getElementsByAttribute("foo:bar", "foo").length, 7); 237 Assert.equal(master1.getElementsByAttribute("foo:bar", "foo").length, 2); 238 Assert.equal(master2.getElementsByAttribute("foo:bar", "foo").length, 2); 239 Assert.equal(master3.getElementsByAttribute("foo:bar", "foo").length, 2); 240 Assert.equal(external.getElementsByAttribute("foo:bar", "foo").length, 1); 241 242 Assert.equal(root.getElementsByAttribute("foo:bar", "bar").length, 14); 243 Assert.equal(master1.getElementsByAttribute("foo:bar", "bar").length, 4); 244 Assert.equal(master2.getElementsByAttribute("foo:bar", "bar").length, 4); 245 Assert.equal(master3.getElementsByAttribute("foo:bar", "bar").length, 4); 246 Assert.equal(external.getElementsByAttribute("foo:bar", "bar").length, 2); 247 248 Assert.equal(root.getElementsByAttribute("foo2:foo", "foo").length, 8); 249 Assert.equal(master1.getElementsByAttribute("foo2:foo", "foo").length, 2); 250 Assert.equal(master2.getElementsByAttribute("foo2:foo", "foo").length, 2); 251 Assert.equal(master3.getElementsByAttribute("foo2:foo", "foo").length, 3); 252 Assert.equal(external.getElementsByAttribute("foo2:foo", "foo").length, 1); 253 254 Assert.equal(root.getElementsByAttribute("foo:foo", "*").length, 25); 255 Assert.equal(master1.getElementsByAttribute("foo:foo", "*").length, 7); 256 Assert.equal(master2.getElementsByAttribute("foo:foo", "*").length, 7); 257 Assert.equal(master3.getElementsByAttribute("foo:foo", "*").length, 6); 258 Assert.equal(external.getElementsByAttribute("foo:foo", "*").length, 3); 259 260 Assert.equal(root.getElementsByAttribute("foo2:foo", "bar").length, 0); 261 Assert.equal(root.getElementsByAttribute("foo:foo", "baz").length, 0); 262 } 263 264 function test_getElementsByAttributeNS() { 265 var doc = ParseFile("nodelist_data_2.xhtml"); 266 var root = doc.documentElement; 267 268 Assert.equal(ChromeUtils.getClassName(root), "XULElement"); 269 270 // Check that getElementsByAttributeNS returns an HTMLCollection. 271 Assert.equal( 272 ChromeUtils.getClassName(root.getElementsByAttributeNS("*", "*", "*")), 273 "HTMLCollection" 274 ); 275 276 var master1 = doc.getElementById("master1"); 277 var master2 = doc.getElementById("master2"); 278 var master3 = doc.getElementById("master3"); 279 var external = doc.getElementById("external"); 280 281 Assert.equal(ChromeUtils.getClassName(master1), "XULElement"); 282 Assert.equal(ChromeUtils.getClassName(master2), "XULElement"); 283 Assert.equal(ChromeUtils.getClassName(master3), "XULElement"); 284 Assert.equal(ChromeUtils.getClassName(external), "XULElement"); 285 286 // Test wildcard namespace 287 Assert.equal(root.getElementsByAttributeNS("*", "foo", "foo").length, 38); 288 Assert.equal(master1.getElementsByAttributeNS("*", "foo", "foo").length, 11); 289 Assert.equal(master2.getElementsByAttributeNS("*", "foo", "foo").length, 10); 290 Assert.equal(master3.getElementsByAttributeNS("*", "foo", "foo").length, 11); 291 292 Assert.equal(root.getElementsByAttributeNS("*", "foo", "bar").length, 16); 293 Assert.equal(master1.getElementsByAttributeNS("*", "foo", "bar").length, 4); 294 Assert.equal(master2.getElementsByAttributeNS("*", "foo", "bar").length, 5); 295 Assert.equal(master3.getElementsByAttributeNS("*", "foo", "bar").length, 4); 296 297 Assert.equal(root.getElementsByAttributeNS("*", "bar", "bar").length, 21); 298 Assert.equal(master1.getElementsByAttributeNS("*", "bar", "bar").length, 6); 299 Assert.equal(master2.getElementsByAttributeNS("*", "bar", "bar").length, 6); 300 Assert.equal(master3.getElementsByAttributeNS("*", "bar", "bar").length, 6); 301 302 Assert.equal(root.getElementsByAttributeNS("*", "foo", "*").length, 54); 303 Assert.equal(master1.getElementsByAttributeNS("*", "foo", "*").length, 15); 304 Assert.equal(master2.getElementsByAttributeNS("*", "foo", "*").length, 15); 305 Assert.equal(master3.getElementsByAttributeNS("*", "foo", "*").length, 15); 306 307 // Test null namespace. This should be the same as getElementsByAttribute. 308 Assert.equal( 309 root.getElementsByAttributeNS("", "foo", "foo").length, 310 root.getElementsByAttribute("foo", "foo").length 311 ); 312 Assert.equal( 313 master1.getElementsByAttributeNS("", "foo", "foo").length, 314 master1.getElementsByAttribute("foo", "foo").length 315 ); 316 Assert.equal( 317 master2.getElementsByAttributeNS("", "foo", "foo").length, 318 master2.getElementsByAttribute("foo", "foo").length 319 ); 320 Assert.equal( 321 master3.getElementsByAttributeNS("", "foo", "foo").length, 322 master3.getElementsByAttribute("foo", "foo").length 323 ); 324 325 // Test namespace "foo" 326 Assert.equal(root.getElementsByAttributeNS("foo", "foo", "foo").length, 24); 327 Assert.equal(master1.getElementsByAttributeNS("foo", "foo", "foo").length, 7); 328 Assert.equal(master2.getElementsByAttributeNS("foo", "foo", "foo").length, 6); 329 Assert.equal(master3.getElementsByAttributeNS("foo", "foo", "foo").length, 7); 330 331 Assert.equal(root.getElementsByAttributeNS("foo", "foo", "bar").length, 9); 332 Assert.equal(master1.getElementsByAttributeNS("foo", "foo", "bar").length, 2); 333 Assert.equal(master2.getElementsByAttributeNS("foo", "foo", "bar").length, 3); 334 Assert.equal(master3.getElementsByAttributeNS("foo", "foo", "bar").length, 2); 335 336 Assert.equal(root.getElementsByAttributeNS("foo", "bar", "foo").length, 7); 337 Assert.equal(master1.getElementsByAttributeNS("foo", "bar", "foo").length, 2); 338 Assert.equal(master2.getElementsByAttributeNS("foo", "bar", "foo").length, 2); 339 Assert.equal(master3.getElementsByAttributeNS("foo", "bar", "foo").length, 2); 340 341 Assert.equal(root.getElementsByAttributeNS("foo", "bar", "bar").length, 14); 342 Assert.equal(master1.getElementsByAttributeNS("foo", "bar", "bar").length, 4); 343 Assert.equal(master2.getElementsByAttributeNS("foo", "bar", "bar").length, 4); 344 Assert.equal(master3.getElementsByAttributeNS("foo", "bar", "bar").length, 4); 345 }