tor-browser

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

test_blob_sliced_from_child_process.js (3981B)


      1 "use strict";
      2 
      3 const { XPCShellContentUtils } = ChromeUtils.importESModule(
      4  "resource://testing-common/XPCShellContentUtils.sys.mjs"
      5 );
      6 
      7 XPCShellContentUtils.init(this);
      8 
      9 function childFrameScript() {
     10  /* eslint-env mozilla/frame-script */
     11  "use strict";
     12 
     13  const messageName = "test:blob-slice-test";
     14  const blobData = ["So", " ", "many", " ", "blobs!"];
     15  const blobType = "text/plain";
     16 
     17  let blob = new Blob(blobData, { type: blobType });
     18 
     19  let firstSliceStart = blobData[0].length + blobData[1].length;
     20  let firstSliceEnd = firstSliceStart + blobData[2].length;
     21 
     22  let slice = blob.slice(firstSliceStart, firstSliceEnd, blobType);
     23 
     24  let secondSliceStart = blobData[2].indexOf("a");
     25  let secondSliceEnd = secondSliceStart + 2;
     26 
     27  slice = slice.slice(secondSliceStart, secondSliceEnd, blobType);
     28 
     29  sendAsyncMessage(messageName, { blob });
     30  sendAsyncMessage(messageName, { slice });
     31 }
     32 
     33 add_task(async function test() {
     34  let page = await XPCShellContentUtils.loadContentPage(
     35    "data:text/html,<!DOCTYPE HTML><html><body></body></html>",
     36    {
     37      remote: true,
     38    }
     39  );
     40 
     41  page.loadFrameScript(childFrameScript);
     42 
     43  const messageName = "test:blob-slice-test";
     44  const blobData = ["So", " ", "many", " ", "blobs!"];
     45  const blobText = blobData.join("");
     46  const blobType = "text/plain";
     47 
     48  const sliceText = "an";
     49 
     50  let receivedBlob = false;
     51  let receivedSlice = false;
     52 
     53  let resolveBlob, resolveSlice;
     54  let blobPromise = new Promise(resolve => {
     55    resolveBlob = resolve;
     56  });
     57  let slicePromise = new Promise(resolve => {
     58    resolveSlice = resolve;
     59  });
     60 
     61  let mm = page.browser.messageManager;
     62  mm.addMessageListener(messageName, function (message) {
     63    if ("blob" in message.data) {
     64      equal(receivedBlob, false, "Have not yet received Blob");
     65      equal(receivedSlice, false, "Have not yet received Slice");
     66 
     67      receivedBlob = true;
     68 
     69      let blob = message.data.blob;
     70 
     71      ok(Blob.isInstance(blob), "Received a Blob");
     72      equal(blob.size, blobText.length, "Blob has correct size");
     73      equal(blob.type, blobType, "Blob has correct type");
     74 
     75      let slice = blob.slice(
     76        blobText.length - blobData[blobData.length - 1].length,
     77        blob.size,
     78        blobType
     79      );
     80 
     81      ok(Blob.isInstance(slice), "Slice returned a Blob");
     82      equal(
     83        slice.size,
     84        blobData[blobData.length - 1].length,
     85        "Slice has correct size"
     86      );
     87      equal(slice.type, blobType, "Slice has correct type");
     88 
     89      let reader = new FileReader();
     90      reader.onload = function () {
     91        equal(
     92          reader.result,
     93          blobData[blobData.length - 1],
     94          "Slice has correct data"
     95        );
     96 
     97        resolveBlob();
     98      };
     99      reader.readAsText(slice);
    100    } else if ("slice" in message.data) {
    101      equal(receivedBlob, true, "Already received Blob");
    102      equal(receivedSlice, false, "Have not yet received Slice");
    103 
    104      receivedSlice = true;
    105 
    106      let slice = message.data.slice;
    107 
    108      ok(Blob.isInstance(slice), "Received a Blob for slice");
    109      equal(slice.size, sliceText.length, "Slice has correct size");
    110      equal(slice.type, blobType, "Slice has correct type");
    111 
    112      let reader = new FileReader();
    113      reader.onload = function () {
    114        equal(reader.result, sliceText, "Slice has correct data");
    115 
    116        let slice2 = slice.slice(1, 2, blobType);
    117 
    118        ok(Blob.isInstance(slice2), "Slice returned a Blob");
    119        equal(slice2.size, 1, "Slice has correct size");
    120        equal(slice2.type, blobType, "Slice has correct type");
    121 
    122        let reader2 = new FileReader();
    123        reader2.onload = function () {
    124          equal(reader2.result, sliceText[1], "Slice has correct data");
    125 
    126          resolveSlice();
    127        };
    128        reader2.readAsText(slice2);
    129      };
    130      reader.readAsText(slice);
    131    } else {
    132      ok(false, "Received a bad message: " + JSON.stringify(message.data));
    133    }
    134  });
    135 
    136  await blobPromise;
    137  await slicePromise;
    138 
    139  await page.close();
    140 });