tor-browser

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

test-read-and-notify.js (2019B)


      1 let testId;
      2 
      3 let messageSource;
      4 let messageSink;
      5 let messageTarget;
      6 try {
      7  messageSource = window;
      8  messageSink = window.parent;
      9  messageTarget = document.referrer;
     10 } catch (_) {
     11  messageSource = self;
     12  messageSink = self;
     13  messageTarget = null;
     14 }
     15 
     16 messageSource.addEventListener("message", async e => {
     17  try {
     18    console.log("Read script received " + e.data.message);
     19    testId = e.data.message;
     20    const storeName = "testObjectStore" + testId;
     21    let actual;
     22 
     23    if (e.data.type === "IDB") {
     24      const openReq = indexedDB.open(testId);
     25      const db = await new Promise((openResolve, openReject) => {
     26        openReq.onerror = err => {
     27          openReject(err);
     28        };
     29        openReq.onsuccess = ev => {
     30          openResolve(ev.target.result);
     31        };
     32      });
     33 
     34      const objectStore = db
     35        .transaction([storeName], "readonly")
     36        .objectStore(storeName);
     37      const item = await new Promise((getResolve, getReject) => {
     38        const getReq = objectStore.get("actual");
     39        getReq.onerror = err => {
     40          getReject(err);
     41        };
     42        getReq.onsuccess = ev => {
     43          getResolve(ev.target.result);
     44        };
     45      });
     46 
     47      actual = await item.text();
     48    } else if (e.data.type === "FS") {
     49      const root = await navigator.storage.getDirectory();
     50      const fileHandle = await root.getFileHandle(testId, { create: false });
     51      const file = await fileHandle.getFile();
     52      actual = await file.text();
     53    } else {
     54      throw Error("Unknown data type " + e.data.type);
     55    }
     56 
     57    if (actual.toString() === e.data.expected.toString()) {
     58      messageSink.postMessage({ id: testId, message: testId }, messageTarget);
     59    } else {
     60      const description = "Found " + actual + ", expected " + e.data.expected;
     61      messageSink.postMessage(
     62        { id: testId, message: description },
     63        messageTarget
     64      );
     65    }
     66  } catch (err) {
     67    messageSink.postMessage(
     68      { id: testId, message: err.message },
     69      messageTarget
     70    );
     71  }
     72 });