135 lines
4.7 KiB
JavaScript
135 lines
4.7 KiB
JavaScript
/*
|
|
* Check that the matches() method exists on the given Node
|
|
*/
|
|
function interfaceCheckMatches(method, type, obj) {
|
|
if (obj.nodeType === obj.ELEMENT_NODE) {
|
|
test(function() {
|
|
assert_idl_attribute(obj, method, type + " supports " + method);
|
|
}, type + " supports " + method)
|
|
} else {
|
|
test(function() {
|
|
assert_false(method in obj, type + " supports " + method);
|
|
}, type + " should not support " + method)
|
|
}
|
|
}
|
|
|
|
function runSpecialMatchesTests(method, type, element) {
|
|
test(function() { // 1
|
|
if (element.tagName.toLowerCase() === "null") {
|
|
assert_true(element[method](null), "An element with the tag name '" + element.tagName.toLowerCase() + "' should match.");
|
|
} else {
|
|
assert_false(element[method](null), "An element with the tag name '" + element.tagName.toLowerCase() + "' should not match.");
|
|
}
|
|
}, type + "." + method + "(null)")
|
|
|
|
test(function() { // 2
|
|
if (element.tagName.toLowerCase() === "undefined") {
|
|
assert_true(element[method](undefined), "An element with the tag name '" + element.tagName.toLowerCase() + "' should match.");
|
|
} else {
|
|
assert_false(element[method](undefined), "An element with the tag name '" + element.tagName.toLowerCase() + "' should not match.");
|
|
}
|
|
}, type + "." + method + "(undefined)")
|
|
|
|
test(function() { // 3
|
|
assert_throws_js(element.ownerDocument.defaultView.TypeError, function() {
|
|
element[method]();
|
|
}, "This should throw a TypeError.")
|
|
}, type + "." + method + " no parameter")
|
|
}
|
|
|
|
/*
|
|
* Execute queries with the specified invalid selectors for matches()
|
|
* Only run these tests when errors are expected. Don't run for valid selector tests.
|
|
*/
|
|
function runInvalidSelectorTestMatches(method, type, root, selectors) {
|
|
if (root.nodeType === root.ELEMENT_NODE) {
|
|
for (var i = 0; i < selectors.length; i++) {
|
|
var s = selectors[i];
|
|
var n = s["name"];
|
|
var q = s["selector"];
|
|
|
|
test(function() {
|
|
assert_throws_dom(
|
|
"SyntaxError",
|
|
root.ownerDocument.defaultView.DOMException,
|
|
function() {
|
|
root[method](q)
|
|
}
|
|
);
|
|
}, type + "." + method + ": " + n + ": " + q);
|
|
}
|
|
}
|
|
}
|
|
|
|
function runMatchesTest(method, type, root, selectors, docType) {
|
|
var nodeType = getNodeType(root);
|
|
|
|
for (var i = 0; i < selectors.length; i++) {
|
|
var s = selectors[i];
|
|
var n = s["name"];
|
|
var q = s["selector"];
|
|
var e = s["expect"];
|
|
var u = s["unexpected"];
|
|
|
|
var ctx = s["ctx"];
|
|
var ref = s["ref"];
|
|
|
|
if ((!s["exclude"] || (s["exclude"].indexOf(nodeType) === -1 && s["exclude"].indexOf(docType) === -1))
|
|
&& (s["testType"] & TEST_MATCH) ) {
|
|
|
|
if (ctx && !ref) {
|
|
test(function() {
|
|
var j, element, refNode;
|
|
for (j = 0; j < e.length; j++) {
|
|
element = root.querySelector("#" + e[j]);
|
|
refNode = root.querySelector(ctx);
|
|
assert_true(element[method](q, refNode), "The element #" + e[j] + " should match the selector.")
|
|
}
|
|
|
|
if (u) {
|
|
for (j = 0; j < u.length; j++) {
|
|
element = root.querySelector("#" + u[j]);
|
|
refNode = root.querySelector(ctx);
|
|
assert_false(element[method](q, refNode), "The element #" + u[j] + " should not match the selector.")
|
|
}
|
|
}
|
|
}, type + " Element." + method + ": " + n + " (with refNode Element): " + q);
|
|
}
|
|
|
|
if (ref) {
|
|
test(function() {
|
|
var j, element, refNodes;
|
|
for (j = 0; j < e.length; j++) {
|
|
element = root.querySelector("#" + e[j]);
|
|
refNodes = root.querySelectorAll(ref);
|
|
assert_true(element[method](q, refNodes), "The element #" + e[j] + " should match the selector.")
|
|
}
|
|
|
|
if (u) {
|
|
for (j = 0; j < u.length; j++) {
|
|
element = root.querySelector("#" + u[j]);
|
|
refNodes = root.querySelectorAll(ref);
|
|
assert_false(element[method](q, refNodes), "The element #" + u[j] + " should not match the selector.")
|
|
}
|
|
}
|
|
}, type + " Element." + method + ": " + n + " (with refNodes NodeList): " + q);
|
|
}
|
|
|
|
if (!ctx && !ref) {
|
|
test(function() {
|
|
for (var j = 0; j < e.length; j++) {
|
|
var element = root.querySelector("#" + e[j]);
|
|
assert_true(element[method](q), "The element #" + e[j] + " should match the selector.")
|
|
}
|
|
|
|
if (u) {
|
|
for (j = 0; j < u.length; j++) {
|
|
element = root.querySelector("#" + u[j]);
|
|
assert_false(element[method](q), "The element #" + u[j] + " should not match the selector.")
|
|
}
|
|
}
|
|
}, type + " Element." + method + ": " + n + " (with no refNodes): " + q);
|
|
}
|
|
}
|
|
}
|
|
}
|