diff options
Diffstat (limited to 'testing/web-platform/tests/domxpath/resolver-callback-interface.html')
-rw-r--r-- | testing/web-platform/tests/domxpath/resolver-callback-interface.html | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/testing/web-platform/tests/domxpath/resolver-callback-interface.html b/testing/web-platform/tests/domxpath/resolver-callback-interface.html new file mode 100644 index 0000000000..b43695f4aa --- /dev/null +++ b/testing/web-platform/tests/domxpath/resolver-callback-interface.html @@ -0,0 +1,146 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<title>XPathNSResolver implements callback interface</title> +<link rel="help" href="https://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator"> +<link rel="help" href="https://webidl.spec.whatwg.org/#call-a-user-objects-operation"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/invalid_namespace_test.js"></script> +<div id=log></div> +<script> +"use strict"; + +test(() => { + let resolverCalls = 0; + document.evaluate("/foo:bar", document.documentElement, () => { + resolverCalls++; + return ""; + }); + + assert_equals(resolverCalls, 1); +}, "callable resolver"); + +test(() => { + let resolverCalls = 0; + const resolver = () => { + resolverCalls++; + return ""; + }; + + document.evaluate("/foo:bar", document.documentElement, resolver); + document.evaluate("/foo:bar", document.documentElement, resolver); + + assert_equals(resolverCalls, 2); +}, "callable resolver: result is not cached"); + +promise_test(t => { + const testError = { name: "test" }; + const resolver = () => { + throw testError; + }; + + return promise_rejects_exactly(t, testError, + invalid_namespace_test(t, resolver) + ); +}, "callable resolver: abrupt completion from Call"); + +test(() => { + let resolverCalls = 0; + const resolver = () => { + resolverCalls++; + return ""; + }; + + let resolverGets = 0; + Object.defineProperty(resolver, "lookupNamespaceURI", { + get() { + resolverGets++; + }, + }); + + document.evaluate("/foo:bar", document.documentElement, resolver); + + assert_equals(resolverCalls, 1); + assert_equals(resolverGets, 0); +}, "callable resolver: no 'lookupNamespaceURI' lookups"); + +test(() => { + let resolverCalls = 0; + document.evaluate("/foo:bar", document.documentElement, { + lookupNamespaceURI() { + resolverCalls++; + return ""; + }, + }); + + assert_equals(resolverCalls, 1); +}, "object resolver"); + +test(() => { + let thisValue, prefixArg; + const resolver = { + lookupNamespaceURI(prefix) { + thisValue = this; + prefixArg = prefix; + return ""; + }, + }; + + document.evaluate("/foo:bar", document.documentElement, resolver); + + assert_equals(thisValue, resolver); + assert_equals(prefixArg, "foo"); +}, "object resolver: this value and `prefix` argument"); + +test(() => { + let resolverCalls = 0; + const lookupNamespaceURI = () => { + resolverCalls++; + return ""; + }; + + let resolverGets = 0; + const resolver = { + get lookupNamespaceURI() { + resolverGets++; + return lookupNamespaceURI; + }, + }; + + document.evaluate("/foo:bar", document.documentElement, resolver); + document.evaluate("/foo:bar", document.documentElement, resolver); + + assert_equals(resolverCalls, 2); + assert_equals(resolverGets, 2); +}, "object resolver: 'lookupNamespaceURI' is not cached"); + +promise_test(t => { + const testError = { name: "test" }; + const resolver = { + get lookupNamespaceURI() { + throw testError; + }, + }; + + return promise_rejects_exactly(t, testError, + invalid_namespace_test(t, resolver) + ); +}, "object resolver: abrupt completion from Get"); + +promise_test(t => { + const resolver = { + lookupNamespaceURI: {}, + }; + + return promise_rejects_js(t, TypeError, + invalid_namespace_test(t, resolver) + ); +}, "object resolver: 'lookupNamespaceURI' is thruthy and not callable"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, + invalid_namespace_test(t, {}) + ); +}, "object resolver: 'lookupNamespaceURI' is falsy and not callable"); +</script> +</body> |