tor-browser

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

shared-storage-writable-fetch-request-in-sandboxed-iframe-inner.https.sub.html (1976B)


      1 <!doctype html>
      2 <body>
      3  <script src=/resources/testharness.js></script>
      4  <script src=/shared-storage/resources/util.js></script>
      5  <script>
      6 
      7 async function init() {
      8  // Make fetch request that sets (expectedKey, expectedValue) to shared storage
      9  // via response header.
     10  let {expectedKey, expectedValue} = parseExpectedKeyAndValueData();
     11  const rawWriteHeader = `set;key=${expectedKey};value=${expectedValue}`;
     12  const writeHeader = encodeURIComponent(rawWriteHeader);
     13  const fetchUrl =
     14    `/shared-storage/resources/shared-storage-write-notify-parent.py` +
     15    `?write=${writeHeader}`;
     16  let frame = document.createElement('iframe');
     17  let parentOrOpener = window.opener || window.parent;
     18  fetch(fetchUrl, {sharedStorageWritable: true})
     19    .then(response => response.text())
     20    .then(htmlContent => {
     21        frame.srcdoc = htmlContent;
     22 
     23        const promise = new Promise((resolve, reject) => {
     24          window.addEventListener('message', async function handler(evt) {
     25            if (evt.source === frame.contentWindow &&
     26                evt.data.sharedStorageWritableHeader) {
     27              assert_equals(evt.data.sharedStorageWritableHeader, '?1');
     28                parentOrOpener.postMessage({
     29                    sharedStorageFetchStatus: "success",
     30                    sharedStorageWritableHeader:
     31                      evt.data.sharedStorageWritableHeader},
     32                                         "*");
     33              document.body.removeChild(frame);
     34              window.removeEventListener('message', handler);
     35              resolve();
     36            }
     37          });
     38          window.addEventListener('error', () => {
     39            reject(new Error('Fetch or navigation error'));
     40          });
     41        });
     42 
     43      // Navigate and wait for notification.
     44      document.body.appendChild(frame);
     45      return promise;
     46    })
     47    .catch(error => {
     48      parentOrOpener.postMessage({sharedStorageFetchStatus: error}, "*");
     49    });
     50 }
     51 
     52 init();
     53  </script>
     54 </body>