tor-browser

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

sxg-util.js (3200B)


      1 // Opens |url| in an iframe, establish a message channel with it, and waits for
      2 // a message from the frame content. Returns a promise that resolves with the
      3 // data of the message, or rejects on 15000ms timeout.
      4 // If the iframe load is expected to fail, the test should have
      5 // <meta name="timeout" content="long"> tag.
      6 function openSXGInIframeAndWaitForMessage(test_object, url, referrerPolicy) {
      7  return new Promise(async (resolve, reject) => {
      8    // We can't catch the network error on iframe. So we use the timer.
      9    test_object.step_timeout(() => reject('timeout'), 15000);
     10 
     11    const frame = await withIframe(url, 'sxg_iframe', referrerPolicy);
     12    const channel = new MessageChannel();
     13    channel.port1.onmessage = (event) => resolve(event.data);
     14    frame.contentWindow.postMessage(
     15        {port: channel.port2}, '*', [channel.port2]);
     16  });
     17 }
     18 
     19 function withIframe(url, name, referrerPolicy) {
     20  return new Promise((resolve, reject) => {
     21      const frame = document.createElement('iframe');
     22      frame.src = url;
     23      frame.name = name;
     24      if (referrerPolicy !== undefined) {
     25        frame.referrerPolicy = referrerPolicy;
     26      }
     27      frame.onload = () => resolve(frame);
     28      frame.onerror = () => reject('failed to load ' + url);
     29      document.body.appendChild(frame);
     30    });
     31 }
     32 
     33 function loadScript(url) {
     34  return new Promise((resolve, reject) => {
     35    const scriptTag = document.createElement('script');
     36    scriptTag.src = url;
     37    scriptTag.onload = () => resolve();
     38    scriptTag.onerror = () => reject('failed to load ' + url);
     39    document.head.appendChild(scriptTag);
     40  });
     41 }
     42 
     43 function innerURLOrigin() {
     44  return 'https://127.0.0.1:8444';
     45 }
     46 
     47 function runReferrerTests(test_cases) {
     48  for (const i in test_cases) {
     49    const test_case = test_cases[i];
     50    promise_test(async (t) => {
     51      const sxgUrl = test_case.origin + '/signed-exchange/resources/sxg/' +
     52                     test_case.sxg;
     53      const message =
     54          await openSXGInIframeAndWaitForMessage(
     55              t, sxgUrl, test_case.referrerPolicy);
     56      assert_false(message.is_fallback);
     57      assert_equals(message.referrer, test_case.expectedReferrer);
     58 
     59      const invalidSxgUrl =
     60          test_case.origin + '/signed-exchange/resources/sxg/invalid-' +
     61          test_case.sxg;
     62      const fallbackMessage =
     63          await openSXGInIframeAndWaitForMessage(
     64                t, invalidSxgUrl, test_case.referrerPolicy);
     65      assert_true(fallbackMessage.is_fallback);
     66      assert_equals(fallbackMessage.referrer, test_case.expectedReferrer);
     67    }, 'Referrer of SignedHTTPExchange test : ' + JSON.stringify(test_case));
     68  }
     69 }
     70 
     71 function addPrefetch(url) {
     72  const link = document.createElement('link');
     73  link.rel = 'prefetch';
     74  link.href = url;
     75  document.body.appendChild(link);
     76 }
     77 
     78 async function registerServiceWorkerAndWaitUntilActivated(script, scope) {
     79  const reg = await navigator.serviceWorker.register(script, {scope: scope});
     80  if (reg.active)
     81    return;
     82  const worker =  reg.installing || reg.waiting;
     83  await new Promise((resolve) => {
     84    worker.addEventListener('statechange', (event) => {
     85      if (event.target.state == 'activated')
     86        resolve();
     87    });
     88  });
     89 }