resolver-callback-interface-cross-realm.tentative.html (3653B)
1 <!DOCTYPE html> 2 <meta charset="utf-8"> 3 <title>Cross-realm XPathNSResolver throws TypeError of its associated Realm</title> 4 <link rel="help" href="https://webidl.spec.whatwg.org/#ref-for-prepare-to-run-script"> 5 <script src="/resources/testharness.js"></script> 6 <script src="/resources/testharnessreport.js"></script> 7 8 <iframe name="evaluateGlobalObject" src="resources/empty-document.html"></iframe> 9 <iframe name="resolverGlobalObject" src="resources/empty-document.html"></iframe> 10 <iframe name="lookupNamespaceURIGlobalObject" src="resources/empty-document.html"></iframe> 11 <iframe name="relevantGlobalObject" src="resources/empty-document.html"></iframe> 12 <iframe name="incumbentGlobalObject" src="resources/empty-document.html"></iframe> 13 14 <script> 15 setup({ allow_uncaught_exception: true }); 16 17 const expectedDOMExceptionType = "NAMESPACE_ERR"; 18 19 test_onload(() => { 20 const resolver = new resolverGlobalObject.Object; 21 22 assert_reports_exception(() => { 23 assert_throws_dom(expectedDOMExceptionType, evaluateGlobalObject.DOMException, bind_evaluate(resolver)); 24 }); 25 }, "XPathNSResolver is cross-realm plain object without 'lookupNamespaceURI' property"); 26 27 test_onload(() => { 28 const resolver = new resolverGlobalObject.Object; 29 resolver.lookupNamespaceURI = new lookupNamespaceURIGlobalObject.Object; 30 31 assert_reports_exception(() => { 32 assert_throws_dom(expectedDOMExceptionType, evaluateGlobalObject.DOMException, bind_evaluate(resolver)); 33 }); 34 }, "XPathNSResolver is cross-realm plain object with non-callable 'lookupNamespaceURI' property"); 35 36 test_onload(() => { 37 const { proxy, revoke } = resolverGlobalObject.Proxy.revocable(new resolverGlobalObject.Object, {}); 38 revoke(); 39 40 assert_reports_exception(() => { 41 assert_throws_dom(expectedDOMExceptionType, evaluateGlobalObject.DOMException, bind_evaluate(proxy)); 42 }); 43 }, "XPathNSResolver is cross-realm non-callable revoked Proxy"); 44 45 test_onload(() => { 46 const { proxy, revoke } = resolverGlobalObject.Proxy.revocable(new resolverGlobalObject.Function, {}); 47 revoke(); 48 49 assert_reports_exception(() => { 50 assert_throws_dom(expectedDOMExceptionType, evaluateGlobalObject.DOMException, bind_evaluate(proxy)); 51 }); 52 }, "XPathNSResolver is cross-realm callable revoked Proxy"); 53 54 test_onload(() => { 55 const { proxy, revoke } = lookupNamespaceURIGlobalObject.Proxy.revocable(new lookupNamespaceURIGlobalObject.Function, {}); 56 revoke(); 57 58 const resolver = new resolverGlobalObject.Object; 59 resolver.lookupNamespaceURI = proxy; 60 61 assert_reports_exception(() => { 62 assert_throws_dom(expectedDOMExceptionType, evaluateGlobalObject.DOMException, bind_evaluate(resolver)); 63 }); 64 }, "XPathNSResolver is cross-realm plain object with revoked Proxy as 'lookupNamespaceURI' property"); 65 66 function test_onload(fn, desc) { 67 async_test(t => { window.addEventListener("load", t.step_func_done(fn)); }, desc); 68 } 69 70 function assert_reports_exception(fn) { 71 let error; 72 const onErrorHandler = event => { 73 error = event.error; 74 event.preventDefault(); 75 }; 76 77 resolverGlobalObject.addEventListener("error", onErrorHandler); 78 fn(); 79 resolverGlobalObject.removeEventListener("error", onErrorHandler); 80 81 assert_equals(typeof error, "object"); 82 assert_equals(error.constructor, evaluateGlobalObject.TypeError); 83 } 84 85 function bind_evaluate(resolver) { 86 const boundEvaluate = new incumbentGlobalObject.Function("evaluate", "relevantDocument", "resolver", ` 87 evaluate.call(relevantDocument, "/foo:bar", relevantDocument.documentElement, resolver); 88 `); 89 90 return () => { 91 boundEvaluate(evaluateGlobalObject.document.evaluate, relevantGlobalObject.document, resolver); 92 }; 93 } 94 </script>