tor-browser

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

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>