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));