michael@0: /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: function run_test() michael@0: { michael@0: michael@0: /** michael@0: * NOTE: [i] is not allowed in this test, since it's done via classinfo and michael@0: * we don't have that in xpcshell. michael@0: */ michael@0: michael@0: test_getElementsByTagName(); michael@0: test_getElementsByTagNameNS(); michael@0: test_getElementsByAttribute(); michael@0: test_getElementsByAttributeNS(); michael@0: michael@0: // What else should we test? michael@0: // XXXbz we need more tests here to test liveness! michael@0: michael@0: } michael@0: michael@0: function test_getElementsByTagName() michael@0: { michael@0: var doc = ParseFile("nodelist_data_1.xml"); michael@0: var root = doc.documentElement; michael@0: michael@0: // Check that getElementsByTagName returns a nodelist. michael@0: do_check_true(doc.getElementsByTagName("*") instanceof nsIDOMNodeList); michael@0: do_check_true(root.getElementsByTagName("*") instanceof nsIDOMNodeList); michael@0: michael@0: // Check that getElementsByTagName excludes the element it's called on. michael@0: do_check_eq(doc.getElementsByTagName("*").length, michael@0: root.getElementsByTagName("*").length + 1); michael@0: do_check_eq(doc.getElementById("test2").getElementsByTagName("*").length, michael@0: 8); michael@0: do_check_eq(doc.getElementById("test2").getElementsByTagName("test").length, michael@0: 3); michael@0: michael@0: // Check that the first element of getElementsByTagName on the document is michael@0: // the right thing. michael@0: do_check_eq(doc.getElementsByTagName("*").item(0), root); michael@0: michael@0: // Check that we get the right things in the right order michael@0: var numTests = doc.getElementsByTagName("test").length; michael@0: do_check_eq(numTests, 5); michael@0: michael@0: for (var i = 1; i <= numTests; ++i) { michael@0: do_check_true(doc.getElementById("test" + i) instanceof nsIDOMElement); michael@0: do_check_eq(doc.getElementById("test" + i), michael@0: doc.getElementsByTagName("test").item(i-1)); michael@0: } michael@0: michael@0: // Check that we handle tagnames containing ':' correctly michael@0: do_check_true(doc.getElementsByTagName("foo:test") michael@0: instanceof nsIDOMNodeList); michael@0: do_check_eq(doc.getElementsByTagName("foo:test").length, 2); michael@0: michael@0: do_check_true(doc.getElementsByTagName("foo2:test") michael@0: instanceof nsIDOMNodeList); michael@0: do_check_eq(doc.getElementsByTagName("foo2:test").length, 3); michael@0: michael@0: do_check_true(doc.getElementsByTagName("bar:test") michael@0: instanceof nsIDOMNodeList); michael@0: do_check_eq(doc.getElementsByTagName("bar:test").length, 4); michael@0: } michael@0: michael@0: function test_getElementsByTagNameNS() michael@0: { michael@0: var doc = ParseFile("nodelist_data_1.xml"); michael@0: var root = doc.documentElement; michael@0: michael@0: // Check that getElementsByTagNameNS returns a nodelist. michael@0: do_check_true(doc.getElementsByTagNameNS("*", "*") instanceof nsIDOMNodeList); michael@0: do_check_true(root.getElementsByTagNameNS("*", "*") instanceof nsIDOMNodeList); michael@0: michael@0: // Check that passing "" and null for the namespace URI gives the same result michael@0: var list1 = doc.getElementsByTagNameNS("", "test"); michael@0: var list2 = doc.getElementsByTagNameNS(null, "test"); michael@0: do_check_eq(list1.length, list2.length); michael@0: for (var i = 0; i < list1.length; ++i) { michael@0: do_check_eq(list1.item(i), list2.item(i)); michael@0: } michael@0: michael@0: // Check that getElementsByTagNameNS excludes the element it's called on. michael@0: do_check_eq(doc.getElementsByTagNameNS("*", "*").length, michael@0: root.getElementsByTagNameNS("*", "*").length + 1); michael@0: do_check_eq(doc.getElementById("test2") michael@0: .getElementsByTagNameNS("*", "*").length, michael@0: 8); michael@0: do_check_eq(doc.getElementById("test2") michael@0: .getElementsByTagNameNS("", "test").length, michael@0: 1); michael@0: do_check_eq(doc.getElementById("test2") michael@0: .getElementsByTagNameNS("*", "test").length, michael@0: 7); michael@0: michael@0: // Check that the first element of getElementsByTagNameNS on the document is michael@0: // the right thing. michael@0: do_check_eq(doc.getElementsByTagNameNS("*", "*").item(0), root); michael@0: do_check_eq(doc.getElementsByTagNameNS(null, "*").item(0), root); michael@0: michael@0: // Check that we get the right things in the right order michael@0: michael@0: michael@0: var numTests = doc.getElementsByTagNameNS("*", "test").length; michael@0: do_check_eq(numTests, 14); michael@0: michael@0: for (var i = 1; i <= numTests; ++i) { michael@0: do_check_true(doc.getElementById("test" + i) instanceof nsIDOMElement); michael@0: do_check_eq(doc.getElementById("test" + i), michael@0: doc.getElementsByTagNameNS("*", "test").item(i-1)); michael@0: } michael@0: michael@0: // Check general proper functioning of having a non-wildcard namespace. michael@0: var test2 = doc.getElementById("test2"); michael@0: do_check_eq(doc.getElementsByTagNameNS("", "test").length, michael@0: 3); michael@0: do_check_eq(test2.getElementsByTagNameNS("", "test").length, michael@0: 1); michael@0: do_check_eq(doc.getElementsByTagNameNS("foo", "test").length, michael@0: 7); michael@0: do_check_eq(test2.getElementsByTagNameNS("foo", "test").length, michael@0: 4); michael@0: do_check_eq(doc.getElementsByTagNameNS("foo2", "test").length, michael@0: 0); michael@0: do_check_eq(test2.getElementsByTagNameNS("foo2", "test").length, michael@0: 0); michael@0: do_check_eq(doc.getElementsByTagNameNS("bar", "test").length, michael@0: 4); michael@0: do_check_eq(test2.getElementsByTagNameNS("bar", "test").length, michael@0: 2); michael@0: michael@0: // Check that we handle tagnames containing ':' correctly michael@0: do_check_true(doc.getElementsByTagNameNS(null, "foo:test") michael@0: instanceof nsIDOMNodeList); michael@0: do_check_eq(doc.getElementsByTagNameNS(null, "foo:test").length, 0); michael@0: do_check_eq(doc.getElementsByTagNameNS("foo", "foo:test").length, 0); michael@0: do_check_eq(doc.getElementsByTagNameNS("bar", "foo:test").length, 0); michael@0: do_check_eq(doc.getElementsByTagNameNS("*", "foo:test").length, 0); michael@0: michael@0: do_check_true(doc.getElementsByTagNameNS(null, "foo2:test") michael@0: instanceof nsIDOMNodeList); michael@0: do_check_eq(doc.getElementsByTagNameNS(null, "foo2:test").length, 0); michael@0: do_check_eq(doc.getElementsByTagNameNS("foo2", "foo2:test").length, 0); michael@0: do_check_eq(doc.getElementsByTagNameNS("bar", "foo2:test").length, 0); michael@0: do_check_eq(doc.getElementsByTagNameNS("*", "foo2:test").length, 0); michael@0: michael@0: do_check_true(doc.getElementsByTagNameNS(null, "bar:test") michael@0: instanceof nsIDOMNodeList); michael@0: do_check_eq(doc.getElementsByTagNameNS(null, "bar:test").length, 0); michael@0: do_check_eq(doc.getElementsByTagNameNS("bar", "bar:test").length, 0); michael@0: do_check_eq(doc.getElementsByTagNameNS("*", "bar:test").length, 0); michael@0: michael@0: // Check that previously-unknown namespaces are handled right. Note that we michael@0: // can just hardcode the strings, since we're running only once in XPCshell. michael@0: // If someone wants to run these in a browser, some use of Math.random() may michael@0: // be in order. michael@0: list1 = doc.getElementsByTagNameNS("random-bogus-namespace", "foo"); michael@0: list2 = doc.documentElement.getElementsByTagNameNS("random-bogus-namespace2", michael@0: "foo"); michael@0: do_check_neq(list1, list2); michael@0: do_check_eq(list1.length, 0); michael@0: do_check_eq(list2.length, 0); michael@0: var newNode = doc.createElementNS("random-bogus-namespace", "foo"); michael@0: doc.documentElement.appendChild(newNode); michael@0: var newNode = doc.createElementNS("random-bogus-namespace2", "foo"); michael@0: doc.documentElement.appendChild(newNode); michael@0: do_check_eq(list1.length, 1); michael@0: do_check_eq(list2.length, 1); michael@0: } michael@0: michael@0: function test_getElementsByAttribute() michael@0: { michael@0: var doc = ParseFile("nodelist_data_2.xul"); michael@0: var root = doc.documentElement; michael@0: michael@0: // Sadly, DOMParser can't create XULDocument objects. But at least we have a michael@0: // XULElement! michael@0: michael@0: do_check_true(root instanceof nsIDOMXULElement); michael@0: michael@0: do_check_true(root.getElementsByAttribute("foo", "foo") instanceof michael@0: nsIDOMNodeList); michael@0: michael@0: var master1 = doc.getElementById("master1"); michael@0: var master2 = doc.getElementById("master2"); michael@0: var master3 = doc.getElementById("master3"); michael@0: var external = doc.getElementById("external"); michael@0: michael@0: do_check_true(master1 instanceof nsIDOMXULElement); michael@0: do_check_true(master2 instanceof nsIDOMXULElement); michael@0: do_check_true(master3 instanceof nsIDOMXULElement); michael@0: do_check_true(external instanceof nsIDOMXULElement); michael@0: michael@0: // Basic tests michael@0: do_check_eq(root.getElementsByAttribute("foo", "foo").length, michael@0: 14); michael@0: do_check_eq(master1.getElementsByAttribute("foo", "foo").length, michael@0: 4); michael@0: michael@0: do_check_eq(root.getElementsByAttribute("foo", "bar").length, michael@0: 7); michael@0: do_check_eq(master1.getElementsByAttribute("foo", "bar").length, michael@0: 2); michael@0: michael@0: do_check_eq(root.getElementsByAttribute("bar", "bar").length, michael@0: 7); michael@0: do_check_eq(master1.getElementsByAttribute("bar", "bar").length, michael@0: 2); michael@0: michael@0: do_check_eq(root.getElementsByAttribute("foo", "*").length, michael@0: 21); michael@0: do_check_eq(master1.getElementsByAttribute("foo", "*").length, michael@0: 6); michael@0: michael@0: // Test the various combinations of attributes with colons in the name michael@0: do_check_eq(root.getElementsByAttribute("foo:foo", "foo").length, michael@0: 16); michael@0: do_check_eq(master1.getElementsByAttribute("foo:foo", "foo").length, michael@0: 5); michael@0: do_check_eq(master2.getElementsByAttribute("foo:foo", "foo").length, michael@0: 4); michael@0: do_check_eq(master3.getElementsByAttribute("foo:foo", "foo").length, michael@0: 4); michael@0: do_check_eq(external.getElementsByAttribute("foo:foo", "foo").length, michael@0: 2); michael@0: michael@0: do_check_eq(root.getElementsByAttribute("foo:foo", "bar").length, michael@0: 9); michael@0: do_check_eq(master1.getElementsByAttribute("foo:foo", "bar").length, michael@0: 2); michael@0: do_check_eq(master2.getElementsByAttribute("foo:foo", "bar").length, michael@0: 3); michael@0: do_check_eq(master3.getElementsByAttribute("foo:foo", "bar").length, michael@0: 2); michael@0: do_check_eq(external.getElementsByAttribute("foo:foo", "bar").length, michael@0: 1); michael@0: michael@0: do_check_eq(root.getElementsByAttribute("foo:bar", "foo").length, michael@0: 7); michael@0: do_check_eq(master1.getElementsByAttribute("foo:bar", "foo").length, michael@0: 2); michael@0: do_check_eq(master2.getElementsByAttribute("foo:bar", "foo").length, michael@0: 2); michael@0: do_check_eq(master3.getElementsByAttribute("foo:bar", "foo").length, michael@0: 2); michael@0: do_check_eq(external.getElementsByAttribute("foo:bar", "foo").length, michael@0: 1); michael@0: michael@0: do_check_eq(root.getElementsByAttribute("foo:bar", "bar").length, michael@0: 14); michael@0: do_check_eq(master1.getElementsByAttribute("foo:bar", "bar").length, michael@0: 4); michael@0: do_check_eq(master2.getElementsByAttribute("foo:bar", "bar").length, michael@0: 4); michael@0: do_check_eq(master3.getElementsByAttribute("foo:bar", "bar").length, michael@0: 4); michael@0: do_check_eq(external.getElementsByAttribute("foo:bar", "bar").length, michael@0: 2); michael@0: michael@0: do_check_eq(root.getElementsByAttribute("foo2:foo", "foo").length, michael@0: 8); michael@0: do_check_eq(master1.getElementsByAttribute("foo2:foo", "foo").length, michael@0: 2); michael@0: do_check_eq(master2.getElementsByAttribute("foo2:foo", "foo").length, michael@0: 2); michael@0: do_check_eq(master3.getElementsByAttribute("foo2:foo", "foo").length, michael@0: 3); michael@0: do_check_eq(external.getElementsByAttribute("foo2:foo", "foo").length, michael@0: 1); michael@0: michael@0: do_check_eq(root.getElementsByAttribute("foo:foo", "*").length, michael@0: 25); michael@0: do_check_eq(master1.getElementsByAttribute("foo:foo", "*").length, michael@0: 7); michael@0: do_check_eq(master2.getElementsByAttribute("foo:foo", "*").length, michael@0: 7); michael@0: do_check_eq(master3.getElementsByAttribute("foo:foo", "*").length, michael@0: 6); michael@0: do_check_eq(external.getElementsByAttribute("foo:foo", "*").length, michael@0: 3); michael@0: michael@0: do_check_eq(root.getElementsByAttribute("foo2:foo", "bar").length, michael@0: 0); michael@0: do_check_eq(root.getElementsByAttribute("foo:foo", "baz").length, michael@0: 0); michael@0: } michael@0: michael@0: function test_getElementsByAttributeNS() michael@0: { michael@0: var doc = ParseFile("nodelist_data_2.xul"); michael@0: var root = doc.documentElement; michael@0: michael@0: // Sadly, DOMParser can't create XULDocument objects. But at least we have a michael@0: // XULElement! michael@0: michael@0: do_check_true(root instanceof nsIDOMXULElement); michael@0: michael@0: // Check that getElementsByAttributeNS returns a nodelist. michael@0: do_check_true(root.getElementsByAttributeNS("*", "*", "*") instanceof michael@0: nsIDOMNodeList); michael@0: michael@0: var master1 = doc.getElementById("master1"); michael@0: var master2 = doc.getElementById("master2"); michael@0: var master3 = doc.getElementById("master3"); michael@0: var external = doc.getElementById("external"); michael@0: michael@0: do_check_true(master1 instanceof nsIDOMXULElement); michael@0: do_check_true(master2 instanceof nsIDOMXULElement); michael@0: do_check_true(master3 instanceof nsIDOMXULElement); michael@0: do_check_true(external instanceof nsIDOMXULElement); michael@0: michael@0: // Test wildcard namespace michael@0: do_check_eq(root.getElementsByAttributeNS("*", "foo", "foo").length, michael@0: 38); michael@0: do_check_eq(master1.getElementsByAttributeNS("*", "foo", "foo").length, michael@0: 11); michael@0: do_check_eq(master2.getElementsByAttributeNS("*", "foo", "foo").length, michael@0: 10); michael@0: do_check_eq(master3.getElementsByAttributeNS("*", "foo", "foo").length, michael@0: 11); michael@0: michael@0: do_check_eq(root.getElementsByAttributeNS("*", "foo", "bar").length, michael@0: 16); michael@0: do_check_eq(master1.getElementsByAttributeNS("*", "foo", "bar").length, michael@0: 4); michael@0: do_check_eq(master2.getElementsByAttributeNS("*", "foo", "bar").length, michael@0: 5); michael@0: do_check_eq(master3.getElementsByAttributeNS("*", "foo", "bar").length, michael@0: 4); michael@0: michael@0: do_check_eq(root.getElementsByAttributeNS("*", "bar", "bar").length, michael@0: 21); michael@0: do_check_eq(master1.getElementsByAttributeNS("*", "bar", "bar").length, michael@0: 6); michael@0: do_check_eq(master2.getElementsByAttributeNS("*", "bar", "bar").length, michael@0: 6); michael@0: do_check_eq(master3.getElementsByAttributeNS("*", "bar", "bar").length, michael@0: 6); michael@0: michael@0: do_check_eq(root.getElementsByAttributeNS("*", "foo", "*").length, michael@0: 54); michael@0: do_check_eq(master1.getElementsByAttributeNS("*", "foo", "*").length, michael@0: 15); michael@0: do_check_eq(master2.getElementsByAttributeNS("*", "foo", "*").length, michael@0: 15); michael@0: do_check_eq(master3.getElementsByAttributeNS("*", "foo", "*").length, michael@0: 15); michael@0: michael@0: // Test null namespace. This should be the same as getElementsByAttribute. michael@0: do_check_eq(root.getElementsByAttributeNS("", "foo", "foo").length, michael@0: root.getElementsByAttribute("foo", "foo").length); michael@0: do_check_eq(master1.getElementsByAttributeNS("", "foo", "foo").length, michael@0: master1.getElementsByAttribute("foo", "foo").length); michael@0: do_check_eq(master2.getElementsByAttributeNS("", "foo", "foo").length, michael@0: master2.getElementsByAttribute("foo", "foo").length); michael@0: do_check_eq(master3.getElementsByAttributeNS("", "foo", "foo").length, michael@0: master3.getElementsByAttribute("foo", "foo").length); michael@0: michael@0: // Test namespace "foo" michael@0: do_check_eq(root.getElementsByAttributeNS("foo", "foo", "foo").length, michael@0: 24); michael@0: do_check_eq(master1.getElementsByAttributeNS("foo", "foo", "foo").length, michael@0: 7); michael@0: do_check_eq(master2.getElementsByAttributeNS("foo", "foo", "foo").length, michael@0: 6); michael@0: do_check_eq(master3.getElementsByAttributeNS("foo", "foo", "foo").length, michael@0: 7); michael@0: michael@0: do_check_eq(root.getElementsByAttributeNS("foo", "foo", "bar").length, michael@0: 9); michael@0: do_check_eq(master1.getElementsByAttributeNS("foo", "foo", "bar").length, michael@0: 2); michael@0: do_check_eq(master2.getElementsByAttributeNS("foo", "foo", "bar").length, michael@0: 3); michael@0: do_check_eq(master3.getElementsByAttributeNS("foo", "foo", "bar").length, michael@0: 2); michael@0: michael@0: do_check_eq(root.getElementsByAttributeNS("foo", "bar", "foo").length, michael@0: 7); michael@0: do_check_eq(master1.getElementsByAttributeNS("foo", "bar", "foo").length, michael@0: 2); michael@0: do_check_eq(master2.getElementsByAttributeNS("foo", "bar", "foo").length, michael@0: 2); michael@0: do_check_eq(master3.getElementsByAttributeNS("foo", "bar", "foo").length, michael@0: 2); michael@0: michael@0: do_check_eq(root.getElementsByAttributeNS("foo", "bar", "bar").length, michael@0: 14); michael@0: do_check_eq(master1.getElementsByAttributeNS("foo", "bar", "bar").length, michael@0: 4); michael@0: do_check_eq(master2.getElementsByAttributeNS("foo", "bar", "bar").length, michael@0: 4); michael@0: do_check_eq(master3.getElementsByAttributeNS("foo", "bar", "bar").length, michael@0: 4); michael@0: }