mirror of
https://github.com/servo/servo.git
synced 2025-06-24 00:54:32 +01:00
186 lines
7.9 KiB
JavaScript
186 lines
7.9 KiB
JavaScript
/*
|
|
* 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);
|