tor-browser

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

test-write-and-notify.js (3614B)


      1 var testId;
      2 
      3 const getNonZeroRandomValue = () => {
      4  return 1 + Math.floor(Math.random() * (Number.MAX_SAFE_INTEGER - 1));
      5 };
      6 
      7 var messageSource;
      8 var messageSink;
      9 var messageTarget;
     10 try {
     11  messageSource = window;
     12  messageSink = window.parent;
     13  messageTarget = document.referrer;
     14 } catch (_) {
     15  messageSource = self;
     16  messageSink = self;
     17  messageTarget = null;
     18 }
     19 
     20 messageSource.addEventListener("message", e => {
     21  try {
     22    console.log("Write script received " + JSON.stringify(e.data));
     23    testId = e.data.message;
     24    const storeName = "testObjectStore" + testId;
     25    const storeProps = { autoIncrement: false };
     26 
     27    const actual = getNonZeroRandomValue();
     28 
     29    if (e.data.type === "IDB") {
     30      new Promise((openResolve, openReject) => {
     31        const openReq = indexedDB.open(testId, 1);
     32        openReq.onerror = () => {
     33          openReject(openReq.error);
     34        };
     35        openReq.onupgradeneeded = ev => {
     36          ev.target.result.createObjectStore(storeName, storeProps);
     37        };
     38        openReq.onsuccess = ev => {
     39          openResolve(ev.target.result);
     40        };
     41      })
     42        .then(db => {
     43          new Promise((addResolve, addReject) => {
     44            const blob = new Blob([actual], {});
     45            const tx = db.transaction([storeName], "readwrite");
     46            const objectStore = tx.objectStore(storeName);
     47            const addReq = objectStore.add(blob, "actual");
     48            addReq.onerror = () => {
     49              addReject(addReq.error);
     50            };
     51            addReq.onsuccess = ev => {
     52              addResolve(ev);
     53            };
     54          })
     55            .then(() => {
     56              const doneMessage = {
     57                id: testId,
     58                message: "write done",
     59                expected: actual,
     60              };
     61              console.log("Sending parent " + JSON.stringify(doneMessage));
     62              messageSink.postMessage(doneMessage, messageTarget);
     63            })
     64            .catch(err => {
     65              console.log("Encountered error " + err.message);
     66              messageSink.postMessage(
     67                { id: testId, message: err.message },
     68                messageTarget
     69              );
     70            });
     71        })
     72        .catch(err => {
     73          console.log("Sending parent error " + err.message);
     74          messageSink.postMessage(
     75            { id: testId, message: err.message },
     76            messageTarget
     77          );
     78        });
     79    } else if (e.data.type === "FS") {
     80      navigator.storage
     81        .getDirectory()
     82        .then(root => {
     83          root.getFileHandle(testId, { create: true }).then(file => {
     84            file.createWritable({}).then(writable => {
     85              writable.write(actual).then(() => {
     86                writable.close().then(() => {
     87                  const doneMessage = {
     88                    id: testId,
     89                    message: "write done",
     90                    expected: actual,
     91                  };
     92                  console.log("Sending parent " + JSON.stringify(doneMessage));
     93                  messageSink.postMessage(doneMessage, messageTarget);
     94                });
     95              });
     96            });
     97          });
     98        })
     99        .catch(err => {
    100          console.log("Sending parent error " + err.message);
    101          messageSink.postMessage(
    102            { id: testId, message: err.message },
    103            messageTarget
    104          );
    105        });
    106    } else {
    107      throw Error("Unknown data type " + e.data.type);
    108    }
    109  } catch (err) {
    110    console.log("Caught " + err.message);
    111    messageSink.postMessage(
    112      { id: testId, message: err.message },
    113      messageTarget
    114    );
    115  }
    116 });