tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>