content/test/unit/test_nodelist.js

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

mercurial