1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/test/unit/test_nodelist.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,394 @@ 1.4 +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +function run_test() 1.6 +{ 1.7 + 1.8 + /** 1.9 + * NOTE: [i] is not allowed in this test, since it's done via classinfo and 1.10 + * we don't have that in xpcshell. 1.11 + */ 1.12 + 1.13 + test_getElementsByTagName(); 1.14 + test_getElementsByTagNameNS(); 1.15 + test_getElementsByAttribute(); 1.16 + test_getElementsByAttributeNS(); 1.17 + 1.18 + // What else should we test? 1.19 + // XXXbz we need more tests here to test liveness! 1.20 + 1.21 +} 1.22 + 1.23 +function test_getElementsByTagName() 1.24 +{ 1.25 + var doc = ParseFile("nodelist_data_1.xml"); 1.26 + var root = doc.documentElement; 1.27 + 1.28 + // Check that getElementsByTagName returns a nodelist. 1.29 + do_check_true(doc.getElementsByTagName("*") instanceof nsIDOMNodeList); 1.30 + do_check_true(root.getElementsByTagName("*") instanceof nsIDOMNodeList); 1.31 + 1.32 + // Check that getElementsByTagName excludes the element it's called on. 1.33 + do_check_eq(doc.getElementsByTagName("*").length, 1.34 + root.getElementsByTagName("*").length + 1); 1.35 + do_check_eq(doc.getElementById("test2").getElementsByTagName("*").length, 1.36 + 8); 1.37 + do_check_eq(doc.getElementById("test2").getElementsByTagName("test").length, 1.38 + 3); 1.39 + 1.40 + // Check that the first element of getElementsByTagName on the document is 1.41 + // the right thing. 1.42 + do_check_eq(doc.getElementsByTagName("*").item(0), root); 1.43 + 1.44 + // Check that we get the right things in the right order 1.45 + var numTests = doc.getElementsByTagName("test").length; 1.46 + do_check_eq(numTests, 5); 1.47 + 1.48 + for (var i = 1; i <= numTests; ++i) { 1.49 + do_check_true(doc.getElementById("test" + i) instanceof nsIDOMElement); 1.50 + do_check_eq(doc.getElementById("test" + i), 1.51 + doc.getElementsByTagName("test").item(i-1)); 1.52 + } 1.53 + 1.54 + // Check that we handle tagnames containing ':' correctly 1.55 + do_check_true(doc.getElementsByTagName("foo:test") 1.56 + instanceof nsIDOMNodeList); 1.57 + do_check_eq(doc.getElementsByTagName("foo:test").length, 2); 1.58 + 1.59 + do_check_true(doc.getElementsByTagName("foo2:test") 1.60 + instanceof nsIDOMNodeList); 1.61 + do_check_eq(doc.getElementsByTagName("foo2:test").length, 3); 1.62 + 1.63 + do_check_true(doc.getElementsByTagName("bar:test") 1.64 + instanceof nsIDOMNodeList); 1.65 + do_check_eq(doc.getElementsByTagName("bar:test").length, 4); 1.66 +} 1.67 + 1.68 +function test_getElementsByTagNameNS() 1.69 +{ 1.70 + var doc = ParseFile("nodelist_data_1.xml"); 1.71 + var root = doc.documentElement; 1.72 + 1.73 + // Check that getElementsByTagNameNS returns a nodelist. 1.74 + do_check_true(doc.getElementsByTagNameNS("*", "*") instanceof nsIDOMNodeList); 1.75 + do_check_true(root.getElementsByTagNameNS("*", "*") instanceof nsIDOMNodeList); 1.76 + 1.77 + // Check that passing "" and null for the namespace URI gives the same result 1.78 + var list1 = doc.getElementsByTagNameNS("", "test"); 1.79 + var list2 = doc.getElementsByTagNameNS(null, "test"); 1.80 + do_check_eq(list1.length, list2.length); 1.81 + for (var i = 0; i < list1.length; ++i) { 1.82 + do_check_eq(list1.item(i), list2.item(i)); 1.83 + } 1.84 + 1.85 + // Check that getElementsByTagNameNS excludes the element it's called on. 1.86 + do_check_eq(doc.getElementsByTagNameNS("*", "*").length, 1.87 + root.getElementsByTagNameNS("*", "*").length + 1); 1.88 + do_check_eq(doc.getElementById("test2") 1.89 + .getElementsByTagNameNS("*", "*").length, 1.90 + 8); 1.91 + do_check_eq(doc.getElementById("test2") 1.92 + .getElementsByTagNameNS("", "test").length, 1.93 + 1); 1.94 + do_check_eq(doc.getElementById("test2") 1.95 + .getElementsByTagNameNS("*", "test").length, 1.96 + 7); 1.97 + 1.98 + // Check that the first element of getElementsByTagNameNS on the document is 1.99 + // the right thing. 1.100 + do_check_eq(doc.getElementsByTagNameNS("*", "*").item(0), root); 1.101 + do_check_eq(doc.getElementsByTagNameNS(null, "*").item(0), root); 1.102 + 1.103 + // Check that we get the right things in the right order 1.104 + 1.105 + 1.106 + var numTests = doc.getElementsByTagNameNS("*", "test").length; 1.107 + do_check_eq(numTests, 14); 1.108 + 1.109 + for (var i = 1; i <= numTests; ++i) { 1.110 + do_check_true(doc.getElementById("test" + i) instanceof nsIDOMElement); 1.111 + do_check_eq(doc.getElementById("test" + i), 1.112 + doc.getElementsByTagNameNS("*", "test").item(i-1)); 1.113 + } 1.114 + 1.115 + // Check general proper functioning of having a non-wildcard namespace. 1.116 + var test2 = doc.getElementById("test2"); 1.117 + do_check_eq(doc.getElementsByTagNameNS("", "test").length, 1.118 + 3); 1.119 + do_check_eq(test2.getElementsByTagNameNS("", "test").length, 1.120 + 1); 1.121 + do_check_eq(doc.getElementsByTagNameNS("foo", "test").length, 1.122 + 7); 1.123 + do_check_eq(test2.getElementsByTagNameNS("foo", "test").length, 1.124 + 4); 1.125 + do_check_eq(doc.getElementsByTagNameNS("foo2", "test").length, 1.126 + 0); 1.127 + do_check_eq(test2.getElementsByTagNameNS("foo2", "test").length, 1.128 + 0); 1.129 + do_check_eq(doc.getElementsByTagNameNS("bar", "test").length, 1.130 + 4); 1.131 + do_check_eq(test2.getElementsByTagNameNS("bar", "test").length, 1.132 + 2); 1.133 + 1.134 + // Check that we handle tagnames containing ':' correctly 1.135 + do_check_true(doc.getElementsByTagNameNS(null, "foo:test") 1.136 + instanceof nsIDOMNodeList); 1.137 + do_check_eq(doc.getElementsByTagNameNS(null, "foo:test").length, 0); 1.138 + do_check_eq(doc.getElementsByTagNameNS("foo", "foo:test").length, 0); 1.139 + do_check_eq(doc.getElementsByTagNameNS("bar", "foo:test").length, 0); 1.140 + do_check_eq(doc.getElementsByTagNameNS("*", "foo:test").length, 0); 1.141 + 1.142 + do_check_true(doc.getElementsByTagNameNS(null, "foo2:test") 1.143 + instanceof nsIDOMNodeList); 1.144 + do_check_eq(doc.getElementsByTagNameNS(null, "foo2:test").length, 0); 1.145 + do_check_eq(doc.getElementsByTagNameNS("foo2", "foo2:test").length, 0); 1.146 + do_check_eq(doc.getElementsByTagNameNS("bar", "foo2:test").length, 0); 1.147 + do_check_eq(doc.getElementsByTagNameNS("*", "foo2:test").length, 0); 1.148 + 1.149 + do_check_true(doc.getElementsByTagNameNS(null, "bar:test") 1.150 + instanceof nsIDOMNodeList); 1.151 + do_check_eq(doc.getElementsByTagNameNS(null, "bar:test").length, 0); 1.152 + do_check_eq(doc.getElementsByTagNameNS("bar", "bar:test").length, 0); 1.153 + do_check_eq(doc.getElementsByTagNameNS("*", "bar:test").length, 0); 1.154 + 1.155 + // Check that previously-unknown namespaces are handled right. Note that we 1.156 + // can just hardcode the strings, since we're running only once in XPCshell. 1.157 + // If someone wants to run these in a browser, some use of Math.random() may 1.158 + // be in order. 1.159 + list1 = doc.getElementsByTagNameNS("random-bogus-namespace", "foo"); 1.160 + list2 = doc.documentElement.getElementsByTagNameNS("random-bogus-namespace2", 1.161 + "foo"); 1.162 + do_check_neq(list1, list2); 1.163 + do_check_eq(list1.length, 0); 1.164 + do_check_eq(list2.length, 0); 1.165 + var newNode = doc.createElementNS("random-bogus-namespace", "foo"); 1.166 + doc.documentElement.appendChild(newNode); 1.167 + var newNode = doc.createElementNS("random-bogus-namespace2", "foo"); 1.168 + doc.documentElement.appendChild(newNode); 1.169 + do_check_eq(list1.length, 1); 1.170 + do_check_eq(list2.length, 1); 1.171 +} 1.172 + 1.173 +function test_getElementsByAttribute() 1.174 +{ 1.175 + var doc = ParseFile("nodelist_data_2.xul"); 1.176 + var root = doc.documentElement; 1.177 + 1.178 + // Sadly, DOMParser can't create XULDocument objects. But at least we have a 1.179 + // XULElement! 1.180 + 1.181 + do_check_true(root instanceof nsIDOMXULElement); 1.182 + 1.183 + do_check_true(root.getElementsByAttribute("foo", "foo") instanceof 1.184 + nsIDOMNodeList); 1.185 + 1.186 + var master1 = doc.getElementById("master1"); 1.187 + var master2 = doc.getElementById("master2"); 1.188 + var master3 = doc.getElementById("master3"); 1.189 + var external = doc.getElementById("external"); 1.190 + 1.191 + do_check_true(master1 instanceof nsIDOMXULElement); 1.192 + do_check_true(master2 instanceof nsIDOMXULElement); 1.193 + do_check_true(master3 instanceof nsIDOMXULElement); 1.194 + do_check_true(external instanceof nsIDOMXULElement); 1.195 + 1.196 + // Basic tests 1.197 + do_check_eq(root.getElementsByAttribute("foo", "foo").length, 1.198 + 14); 1.199 + do_check_eq(master1.getElementsByAttribute("foo", "foo").length, 1.200 + 4); 1.201 + 1.202 + do_check_eq(root.getElementsByAttribute("foo", "bar").length, 1.203 + 7); 1.204 + do_check_eq(master1.getElementsByAttribute("foo", "bar").length, 1.205 + 2); 1.206 + 1.207 + do_check_eq(root.getElementsByAttribute("bar", "bar").length, 1.208 + 7); 1.209 + do_check_eq(master1.getElementsByAttribute("bar", "bar").length, 1.210 + 2); 1.211 + 1.212 + do_check_eq(root.getElementsByAttribute("foo", "*").length, 1.213 + 21); 1.214 + do_check_eq(master1.getElementsByAttribute("foo", "*").length, 1.215 + 6); 1.216 + 1.217 + // Test the various combinations of attributes with colons in the name 1.218 + do_check_eq(root.getElementsByAttribute("foo:foo", "foo").length, 1.219 + 16); 1.220 + do_check_eq(master1.getElementsByAttribute("foo:foo", "foo").length, 1.221 + 5); 1.222 + do_check_eq(master2.getElementsByAttribute("foo:foo", "foo").length, 1.223 + 4); 1.224 + do_check_eq(master3.getElementsByAttribute("foo:foo", "foo").length, 1.225 + 4); 1.226 + do_check_eq(external.getElementsByAttribute("foo:foo", "foo").length, 1.227 + 2); 1.228 + 1.229 + do_check_eq(root.getElementsByAttribute("foo:foo", "bar").length, 1.230 + 9); 1.231 + do_check_eq(master1.getElementsByAttribute("foo:foo", "bar").length, 1.232 + 2); 1.233 + do_check_eq(master2.getElementsByAttribute("foo:foo", "bar").length, 1.234 + 3); 1.235 + do_check_eq(master3.getElementsByAttribute("foo:foo", "bar").length, 1.236 + 2); 1.237 + do_check_eq(external.getElementsByAttribute("foo:foo", "bar").length, 1.238 + 1); 1.239 + 1.240 + do_check_eq(root.getElementsByAttribute("foo:bar", "foo").length, 1.241 + 7); 1.242 + do_check_eq(master1.getElementsByAttribute("foo:bar", "foo").length, 1.243 + 2); 1.244 + do_check_eq(master2.getElementsByAttribute("foo:bar", "foo").length, 1.245 + 2); 1.246 + do_check_eq(master3.getElementsByAttribute("foo:bar", "foo").length, 1.247 + 2); 1.248 + do_check_eq(external.getElementsByAttribute("foo:bar", "foo").length, 1.249 + 1); 1.250 + 1.251 + do_check_eq(root.getElementsByAttribute("foo:bar", "bar").length, 1.252 + 14); 1.253 + do_check_eq(master1.getElementsByAttribute("foo:bar", "bar").length, 1.254 + 4); 1.255 + do_check_eq(master2.getElementsByAttribute("foo:bar", "bar").length, 1.256 + 4); 1.257 + do_check_eq(master3.getElementsByAttribute("foo:bar", "bar").length, 1.258 + 4); 1.259 + do_check_eq(external.getElementsByAttribute("foo:bar", "bar").length, 1.260 + 2); 1.261 + 1.262 + do_check_eq(root.getElementsByAttribute("foo2:foo", "foo").length, 1.263 + 8); 1.264 + do_check_eq(master1.getElementsByAttribute("foo2:foo", "foo").length, 1.265 + 2); 1.266 + do_check_eq(master2.getElementsByAttribute("foo2:foo", "foo").length, 1.267 + 2); 1.268 + do_check_eq(master3.getElementsByAttribute("foo2:foo", "foo").length, 1.269 + 3); 1.270 + do_check_eq(external.getElementsByAttribute("foo2:foo", "foo").length, 1.271 + 1); 1.272 + 1.273 + do_check_eq(root.getElementsByAttribute("foo:foo", "*").length, 1.274 + 25); 1.275 + do_check_eq(master1.getElementsByAttribute("foo:foo", "*").length, 1.276 + 7); 1.277 + do_check_eq(master2.getElementsByAttribute("foo:foo", "*").length, 1.278 + 7); 1.279 + do_check_eq(master3.getElementsByAttribute("foo:foo", "*").length, 1.280 + 6); 1.281 + do_check_eq(external.getElementsByAttribute("foo:foo", "*").length, 1.282 + 3); 1.283 + 1.284 + do_check_eq(root.getElementsByAttribute("foo2:foo", "bar").length, 1.285 + 0); 1.286 + do_check_eq(root.getElementsByAttribute("foo:foo", "baz").length, 1.287 + 0); 1.288 +} 1.289 + 1.290 +function test_getElementsByAttributeNS() 1.291 +{ 1.292 + var doc = ParseFile("nodelist_data_2.xul"); 1.293 + var root = doc.documentElement; 1.294 + 1.295 + // Sadly, DOMParser can't create XULDocument objects. But at least we have a 1.296 + // XULElement! 1.297 + 1.298 + do_check_true(root instanceof nsIDOMXULElement); 1.299 + 1.300 + // Check that getElementsByAttributeNS returns a nodelist. 1.301 + do_check_true(root.getElementsByAttributeNS("*", "*", "*") instanceof 1.302 + nsIDOMNodeList); 1.303 + 1.304 + var master1 = doc.getElementById("master1"); 1.305 + var master2 = doc.getElementById("master2"); 1.306 + var master3 = doc.getElementById("master3"); 1.307 + var external = doc.getElementById("external"); 1.308 + 1.309 + do_check_true(master1 instanceof nsIDOMXULElement); 1.310 + do_check_true(master2 instanceof nsIDOMXULElement); 1.311 + do_check_true(master3 instanceof nsIDOMXULElement); 1.312 + do_check_true(external instanceof nsIDOMXULElement); 1.313 + 1.314 + // Test wildcard namespace 1.315 + do_check_eq(root.getElementsByAttributeNS("*", "foo", "foo").length, 1.316 + 38); 1.317 + do_check_eq(master1.getElementsByAttributeNS("*", "foo", "foo").length, 1.318 + 11); 1.319 + do_check_eq(master2.getElementsByAttributeNS("*", "foo", "foo").length, 1.320 + 10); 1.321 + do_check_eq(master3.getElementsByAttributeNS("*", "foo", "foo").length, 1.322 + 11); 1.323 + 1.324 + do_check_eq(root.getElementsByAttributeNS("*", "foo", "bar").length, 1.325 + 16); 1.326 + do_check_eq(master1.getElementsByAttributeNS("*", "foo", "bar").length, 1.327 + 4); 1.328 + do_check_eq(master2.getElementsByAttributeNS("*", "foo", "bar").length, 1.329 + 5); 1.330 + do_check_eq(master3.getElementsByAttributeNS("*", "foo", "bar").length, 1.331 + 4); 1.332 + 1.333 + do_check_eq(root.getElementsByAttributeNS("*", "bar", "bar").length, 1.334 + 21); 1.335 + do_check_eq(master1.getElementsByAttributeNS("*", "bar", "bar").length, 1.336 + 6); 1.337 + do_check_eq(master2.getElementsByAttributeNS("*", "bar", "bar").length, 1.338 + 6); 1.339 + do_check_eq(master3.getElementsByAttributeNS("*", "bar", "bar").length, 1.340 + 6); 1.341 + 1.342 + do_check_eq(root.getElementsByAttributeNS("*", "foo", "*").length, 1.343 + 54); 1.344 + do_check_eq(master1.getElementsByAttributeNS("*", "foo", "*").length, 1.345 + 15); 1.346 + do_check_eq(master2.getElementsByAttributeNS("*", "foo", "*").length, 1.347 + 15); 1.348 + do_check_eq(master3.getElementsByAttributeNS("*", "foo", "*").length, 1.349 + 15); 1.350 + 1.351 + // Test null namespace. This should be the same as getElementsByAttribute. 1.352 + do_check_eq(root.getElementsByAttributeNS("", "foo", "foo").length, 1.353 + root.getElementsByAttribute("foo", "foo").length); 1.354 + do_check_eq(master1.getElementsByAttributeNS("", "foo", "foo").length, 1.355 + master1.getElementsByAttribute("foo", "foo").length); 1.356 + do_check_eq(master2.getElementsByAttributeNS("", "foo", "foo").length, 1.357 + master2.getElementsByAttribute("foo", "foo").length); 1.358 + do_check_eq(master3.getElementsByAttributeNS("", "foo", "foo").length, 1.359 + master3.getElementsByAttribute("foo", "foo").length); 1.360 + 1.361 + // Test namespace "foo" 1.362 + do_check_eq(root.getElementsByAttributeNS("foo", "foo", "foo").length, 1.363 + 24); 1.364 + do_check_eq(master1.getElementsByAttributeNS("foo", "foo", "foo").length, 1.365 + 7); 1.366 + do_check_eq(master2.getElementsByAttributeNS("foo", "foo", "foo").length, 1.367 + 6); 1.368 + do_check_eq(master3.getElementsByAttributeNS("foo", "foo", "foo").length, 1.369 + 7); 1.370 + 1.371 + do_check_eq(root.getElementsByAttributeNS("foo", "foo", "bar").length, 1.372 + 9); 1.373 + do_check_eq(master1.getElementsByAttributeNS("foo", "foo", "bar").length, 1.374 + 2); 1.375 + do_check_eq(master2.getElementsByAttributeNS("foo", "foo", "bar").length, 1.376 + 3); 1.377 + do_check_eq(master3.getElementsByAttributeNS("foo", "foo", "bar").length, 1.378 + 2); 1.379 + 1.380 + do_check_eq(root.getElementsByAttributeNS("foo", "bar", "foo").length, 1.381 + 7); 1.382 + do_check_eq(master1.getElementsByAttributeNS("foo", "bar", "foo").length, 1.383 + 2); 1.384 + do_check_eq(master2.getElementsByAttributeNS("foo", "bar", "foo").length, 1.385 + 2); 1.386 + do_check_eq(master3.getElementsByAttributeNS("foo", "bar", "foo").length, 1.387 + 2); 1.388 + 1.389 + do_check_eq(root.getElementsByAttributeNS("foo", "bar", "bar").length, 1.390 + 14); 1.391 + do_check_eq(master1.getElementsByAttributeNS("foo", "bar", "bar").length, 1.392 + 4); 1.393 + do_check_eq(master2.getElementsByAttributeNS("foo", "bar", "bar").length, 1.394 + 4); 1.395 + do_check_eq(master3.getElementsByAttributeNS("foo", "bar", "bar").length, 1.396 + 4); 1.397 +}