/* * document.createElement(NS) * * document.getElementsByTagName(NS) * * Element.setAttribute(NS) * * Element.getAttribute(NS) * Element.hasAttribute(NS) * Element.getElementsByTagName(NS) */ var tests = []; setup(function() { var name_inputs = ["abc", "Abc", "ABC", "ä", "Ä"]; var namespaces = ["http://www.w3.org/1999/xhtml", "http://www.w3.org/2000/svg", "http://FOO"]; name_inputs.forEach(function(x) { tests.push(["createElement " + x, test_create_element, [x]]); tests.push(["setAttribute " +x, test_set_attribute, [x]]); tests.push(["getAttribute " +x, test_get_attribute, [x]]); tests.push(["getElementsByTagName a:" +x, test_get_elements_tag_name, [outer_product(namespaces, ["a"], name_inputs), x]]); tests.push(["getElementsByTagName " +x, test_get_elements_tag_name, [outer_product(namespaces, [null], name_inputs), x]]); }); outer_product(namespaces, name_inputs, name_inputs).forEach(function(x) { tests.push(["createElementNS " + x, test_create_element_ns, x]); tests.push(["setAttributeNS " + x, test_set_attribute_ns, x]); tests.push(["getAttributeNS " + x, test_get_attribute_ns, x]); }); outer_product([null].concat(namespaces), name_inputs).forEach(function(x) { tests.push(["getElementsByTagNameNS " + x, test_get_elements_tag_name_ns, outer_product(namespaces, name_inputs), x]); }); name_inputs.forEach(function(x) { tests.push(["createElementNS " + x, test_create_element_ns, [null, null, x]]); tests.push(["setAttributeNS " + x, test_set_attribute_ns, [null, null, x]]); tests.push(["getAttributeNS " + x, test_get_attribute_ns, [null, null, x]]); }); }); function outer_product() { var rv = []; function compute_outer_product() { var args = Array.prototype.slice.call(arguments); var index = args[0]; if (index < args.length) { args[index].forEach(function(x) { compute_outer_product.apply(this, [index+1].concat(args.slice(1, index), x, args.slice(index+1))); }); } else { rv.push(args.slice(1)); } } compute_outer_product.apply(this, [1].concat(Array.prototype.slice.call(arguments))); return rv; } function expected_case(input) { //is_html gets set by a global on the page loading the tests if (is_html) { return ascii_lowercase(input); } else { return input; } } function ascii_lowercase(input) { return input.replace(/[A-Z]/g, function(x) { return x.toLowerCase(); }); } function get_qualified_name(el) { if (el.prefix) { return el.prefix + ":" + el.localName; } return el.localName; } function test_create_element(name) { var node = document.createElement(name); assert_equals(node.localName, expected_case(name)); } function test_create_element_ns(namespace, prefix, local_name) { var qualified_name = prefix ? prefix + ":" + local_name : local_name; var node = document.createElementNS(namespace, qualified_name); assert_equals(node.prefix, prefix, "prefix"); assert_equals(node.localName, local_name, "localName"); } function test_set_attribute(name) { var node = document.createElement("div"); node.setAttribute(name, "test"); assert_equals(node.attributes[0].localName, expected_case(name)); } function test_set_attribute_ns(namespace, prefix, local_name) { var qualified_name = prefix ? prefix + ":" + local_name : local_name; var node = document.createElement("div"); node.setAttributeNS(namespace, qualified_name, "test"); var attr = node.attributes[0]; assert_equals(attr.prefix, prefix, "prefix"); assert_equals(attr.localName, local_name, "localName"); } function test_get_attribute(name) { var node = document.createElement("div"); node.setAttribute(name, "test"); var expected_name = expected_case(name); assert_equals(node.getAttribute(expected_name), "test"); if (expected_name != name) { assert_equals(node.getAttribute(expected_name), "test"); } else if (name !== ascii_lowercase(name)) { assert_equals(node.getAttribute(ascii_lowercase(name)), null); } } function test_get_attribute_ns(namespace, prefix, local_name) { var qualified_name = prefix ? prefix + ":" + local_name : local_name; var node = document.createElement("div"); node.setAttributeNS(namespace, qualified_name, "test"); var expected_name = local_name; assert_equals(node.getAttributeNS(namespace, expected_name), "test"); if (local_name !== ascii_lowercase(local_name)) { assert_equals(node.getAttributeNS(namespace, ascii_lowercase(local_name)), null); } } function test_get_elements_tag_name(elements_to_create, search_string) { var container = document.createElement("div"); elements_to_create.forEach(function(x) { var qualified_name = x[1] ? x[1] + ":" + x[2] : x[2]; var element = document.createElementNS(x[0], qualified_name); container.appendChild(element); }); var expected = Array.prototype.filter.call(container.childNodes, function(node) { if (is_html && node.namespaceURI === "http://www.w3.org/1999/xhtml") { return get_qualified_name(node) === expected_case(search_string); } else { return get_qualified_name(node) === search_string; } }); document.documentElement.appendChild(container); try { assert_array_equals(document.getElementsByTagName(search_string), expected); } finally { document.documentElement.removeChild(container); } } function test_get_elements_tag_name_ns(elements_to_create, search_input) { var search_uri = search_input[0]; var search_name = search_input[1]; var container = document.createElement("div"); elements_to_create.forEach(function(x) { var qualified_name = x[1] ? x[1] + ":" + x[2] : x[2]; var element = document.createElementNS(x[0], qualified_name); container.appendChild(element); }); var expected = Array.prototype.filter.call(container.childNodes, function(node) { return node.namespaceURI === search_uri; return node.localName === search_name; }); document.documentElement.appendChild(container); try { assert_array_equals(document.getElementsByTagNameNS(search_uri, search_name), expected); } catch(e) { throw e; } finally { document.documentElement.removeChild(container); } } function test_func() { var func = arguments[0]; var rest = arguments[1]; func.apply(this, rest); } generate_tests(test_func, tests);