resolver-callback-interface.html (3575B)
1 <!DOCTYPE html> 2 <meta charset=utf-8> 3 <title>XPathNSResolver implements callback interface</title> 4 <link rel="help" href="https://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator"> 5 <link rel="help" href="https://webidl.spec.whatwg.org/#call-a-user-objects-operation"> 6 <script src="/resources/testharness.js"></script> 7 <script src="/resources/testharnessreport.js"></script> 8 <script src="resources/invalid_namespace_test.js"></script> 9 <div id=log></div> 10 <script> 11 "use strict"; 12 13 test(() => { 14 let resolverCalls = 0; 15 document.evaluate("/foo:bar", document.documentElement, () => { 16 resolverCalls++; 17 return ""; 18 }); 19 20 assert_equals(resolverCalls, 1); 21 }, "callable resolver"); 22 23 test(() => { 24 let resolverCalls = 0; 25 const resolver = () => { 26 resolverCalls++; 27 return ""; 28 }; 29 30 document.evaluate("/foo:bar", document.documentElement, resolver); 31 document.evaluate("/foo:bar", document.documentElement, resolver); 32 33 assert_equals(resolverCalls, 2); 34 }, "callable resolver: result is not cached"); 35 36 promise_test(t => { 37 const testError = { name: "test" }; 38 const resolver = () => { 39 throw testError; 40 }; 41 42 return promise_rejects_exactly(t, testError, 43 invalid_namespace_test(t, resolver) 44 ); 45 }, "callable resolver: abrupt completion from Call"); 46 47 test(() => { 48 let resolverCalls = 0; 49 const resolver = () => { 50 resolverCalls++; 51 return ""; 52 }; 53 54 let resolverGets = 0; 55 Object.defineProperty(resolver, "lookupNamespaceURI", { 56 get() { 57 resolverGets++; 58 }, 59 }); 60 61 document.evaluate("/foo:bar", document.documentElement, resolver); 62 63 assert_equals(resolverCalls, 1); 64 assert_equals(resolverGets, 0); 65 }, "callable resolver: no 'lookupNamespaceURI' lookups"); 66 67 test(() => { 68 let resolverCalls = 0; 69 document.evaluate("/foo:bar", document.documentElement, { 70 lookupNamespaceURI() { 71 resolverCalls++; 72 return ""; 73 }, 74 }); 75 76 assert_equals(resolverCalls, 1); 77 }, "object resolver"); 78 79 test(() => { 80 let thisValue, prefixArg; 81 const resolver = { 82 lookupNamespaceURI(prefix) { 83 thisValue = this; 84 prefixArg = prefix; 85 return ""; 86 }, 87 }; 88 89 document.evaluate("/foo:bar", document.documentElement, resolver); 90 91 assert_equals(thisValue, resolver); 92 assert_equals(prefixArg, "foo"); 93 }, "object resolver: this value and `prefix` argument"); 94 95 test(() => { 96 let resolverCalls = 0; 97 const lookupNamespaceURI = () => { 98 resolverCalls++; 99 return ""; 100 }; 101 102 let resolverGets = 0; 103 const resolver = { 104 get lookupNamespaceURI() { 105 resolverGets++; 106 return lookupNamespaceURI; 107 }, 108 }; 109 110 document.evaluate("/foo:bar", document.documentElement, resolver); 111 document.evaluate("/foo:bar", document.documentElement, resolver); 112 113 assert_equals(resolverCalls, 2); 114 assert_equals(resolverGets, 2); 115 }, "object resolver: 'lookupNamespaceURI' is not cached"); 116 117 promise_test(t => { 118 const testError = { name: "test" }; 119 const resolver = { 120 get lookupNamespaceURI() { 121 throw testError; 122 }, 123 }; 124 125 return promise_rejects_exactly(t, testError, 126 invalid_namespace_test(t, resolver) 127 ); 128 }, "object resolver: abrupt completion from Get"); 129 130 promise_test(t => { 131 const resolver = { 132 lookupNamespaceURI: {}, 133 }; 134 135 return promise_rejects_js(t, TypeError, 136 invalid_namespace_test(t, resolver) 137 ); 138 }, "object resolver: 'lookupNamespaceURI' is thruthy and not callable"); 139 140 promise_test(t => { 141 return promise_rejects_js(t, TypeError, 142 invalid_namespace_test(t, {}) 143 ); 144 }, "object resolver: 'lookupNamespaceURI' is falsy and not callable"); 145 </script> 146 </body>