tor-browser

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

transfer-errors.window.js (1929B)


      1 function assert_transfer_error(transferList) {
      2  assert_throws_dom("DataCloneError", () => self.postMessage({ get whatever() { throw new Error("You should not have gotten to this point") } }, "*", transferList));
      3 }
      4 
      5 test(() => {
      6  [self, self.document, new Image()].forEach(val => {
      7    assert_transfer_error([val]);
      8  });
      9 }, "Cannot transfer all objects");
     10 
     11 function transfer_tests(name, create) {
     12  promise_test(async () => {
     13    const transferable = await create();
     14    assert_transfer_error([transferable, transferable]);
     15  }, `Cannot transfer the same ${name} twice`);
     16 
     17  promise_test(async () => {
     18    const transferable = await create();
     19    self.postMessage(null, "*", [transferable]);
     20    assert_throws_dom("DataCloneError", () => self.postMessage(null, "*", [transferable]));
     21  }, `Serialize should make the ${name} detached, so it cannot be transferred again`);
     22 
     23  promise_test(async () => {
     24    const transferable = await create(),
     25          customError = new Error("hi");
     26    self.postMessage(null, "*", [transferable]);
     27    assert_throws_exactly(customError, () => self.postMessage({ get whatever() { throw customError } }, "*", [transferable]));
     28  }, `Serialize should throw before a detached ${name} is found`);
     29 
     30  promise_test(async () => {
     31    const transferable = await create();
     32    let seen = false;
     33    const message = {
     34      get a() {
     35        self.postMessage(null, '*', [transferable]);
     36        seen = true;
     37      }
     38    };
     39    assert_throws_dom("DataCloneError", () => self.postMessage(message, "*", [transferable]));
     40    assert_true(seen);
     41  }, `Cannot transfer ${name} detached while the message was serialized`);
     42 }
     43 
     44 transfer_tests("ArrayBuffer", () => new ArrayBuffer(1));
     45 transfer_tests("MessagePort", () => new MessageChannel().port1);
     46 transfer_tests("ImageBitmap", () => self.createImageBitmap(document.createElement("canvas")));
     47 transfer_tests("OffscreenCanvas", () => new OffscreenCanvas(1, 1));