offscreencanvas.transferrable.w.html (5212B)
1 <!DOCTYPE html> 2 <script src="/resources/testharness.js"></script> 3 <script src="/resources/testharnessreport.js"></script> 4 <script src="/html/canvas/resources/canvas-tests.js"></script> 5 <link rel="help" href="https://html.spec.whatwg.org/#offscreencanvas"> 6 7 <script id="myWorker" type="text/worker"> 8 9 function isDataCloneError(funcStr, offscreenCanvas) 10 { 11 try { 12 eval(funcStr); 13 } catch (e) { 14 if (e instanceof DOMException && e.name == "DataCloneError") 15 return true; 16 return false; 17 } 18 } 19 20 function isInvalidStateError(funcStr, offscreenCanvas) 21 { 22 try { 23 eval(funcStr); 24 } catch (e) { 25 if (e instanceof DOMException && e.name == "InvalidStateError") 26 return true; 27 return false; 28 } 29 } 30 31 function testExceptionWith2DContext() 32 { 33 var offscreenCanvas = new OffscreenCanvas(10, 10); 34 var ctx = offscreenCanvas.getContext('2d'); 35 return isInvalidStateError("self.postMessage(offscreenCanvas, [offscreenCanvas])", offscreenCanvas); 36 } 37 38 function testExceptionWithWebGLContext() 39 { 40 var offscreenCanvas = new OffscreenCanvas(10, 10); 41 var ctx = offscreenCanvas.getContext('webgl'); 42 return isInvalidStateError("self.postMessage(offscreenCanvas, [offscreenCanvas])", offscreenCanvas); 43 } 44 45 function testExceptionWithDetachedOffscreenCanvas1() 46 { 47 var offscreenCanvas = new OffscreenCanvas(10, 10); 48 self.postMessage(offscreenCanvas, [offscreenCanvas]); 49 return isDataCloneError("self.postMessage(offscreenCanvas, [offscreenCanvas])", offscreenCanvas); 50 } 51 52 function testExceptionWithDetachedOffscreenCanvas2() 53 { 54 var offscreenCanvas = new OffscreenCanvas(10, 10); 55 self.postMessage(offscreenCanvas, [offscreenCanvas]); 56 return isInvalidStateError("offscreenCanvas.getContext('2d')", offscreenCanvas); 57 } 58 59 function testExceptionWithDetachedOffscreenCanvas3() 60 { 61 var offscreenCanvas = new OffscreenCanvas(10, 10); 62 self.postMessage(offscreenCanvas, [offscreenCanvas]); 63 return isInvalidStateError("offscreenCanvas.getContext('webgl')", offscreenCanvas); 64 } 65 66 self.onmessage = function(e) { 67 switch(e.data) { 68 case 'test1': 69 var offscreenCanvas = new OffscreenCanvas(10, 10); 70 self.postMessage(offscreenCanvas, [offscreenCanvas]); 71 break; 72 case 'test2': 73 self.postMessage(testExceptionWith2DContext()); 74 break; 75 case 'test3': 76 self.postMessage(testExceptionWithWebGLContext()); 77 break; 78 case 'test4': 79 self.postMessage(testExceptionWithDetachedOffscreenCanvas1()); 80 break; 81 case 'test5': 82 self.postMessage(testExceptionWithDetachedOffscreenCanvas2()); 83 break; 84 case 'test6': 85 self.postMessage(testExceptionWithDetachedOffscreenCanvas3()); 86 break; 87 } 88 }; 89 90 </script> 91 92 <script> 93 function makeWorker(test) { 94 var blob = new Blob([document.getElementById("myWorker").textContent]); 95 var worker = new Worker(URL.createObjectURL(blob)); 96 worker.onerror = test.unreached_func("error"); 97 return worker; 98 } 99 100 async_test(function(t) { 101 var worker = makeWorker(t); 102 worker.addEventListener('message', t.step_func_done(function(msg) { 103 assert_equals(msg.data.width, 10); 104 assert_equals(msg.data.height, 10); 105 })); 106 worker.postMessage('test1'); 107 }, "Test that OffscreenCanvas's size is correct after being transferred from a worker."); 108 109 async_test(function(t) { 110 var worker = makeWorker(t); 111 worker.addEventListener('message', t.step_func_done(function(msg) { 112 assert_true(msg.data); 113 })); 114 worker.postMessage('test2'); 115 }, "Test that transfer an OffscreenCanvas that has a 2d context throws exception in a worker."); 116 117 async_test(function(t) { 118 var worker = makeWorker(t); 119 worker.addEventListener('message', t.step_func_done(function(msg) { 120 assert_true(msg.data); 121 })); 122 worker.postMessage('test3'); 123 }, "Test that transfer an OffscreenCanvas that has a webgl context throws exception in a worker."); 124 125 async_test(function(t) { 126 var worker = makeWorker(t); 127 worker.addEventListener('message', t.step_func(function(msg) { 128 if (msg.data == true || msg.data == false) { 129 assert_true(msg.data); 130 t.done(); 131 } 132 })); 133 worker.postMessage('test4'); 134 }, "Test that transfer an OffscreenCanvas twice throws exception in a worker."); 135 136 async_test(function(t) { 137 var worker = makeWorker(t); 138 worker.addEventListener('message', t.step_func(function(msg) { 139 if (msg.data == true || msg.data == false) { 140 assert_true(msg.data); 141 t.done(); 142 } 143 })); 144 worker.postMessage('test5'); 145 }, "Test that calling getContext('2d') on a detached OffscreenCanvas throws exception in a worker."); 146 147 async_test(function(t) { 148 var worker = makeWorker(t); 149 worker.addEventListener('message', t.step_func(function(msg) { 150 if (msg.data == true || msg.data == false) { 151 assert_true(msg.data); 152 t.done(); 153 } 154 })); 155 worker.postMessage('test6'); 156 }, "Test that calling getContext('webgl') on a detached OffscreenCanvas throws exception in a worker."); 157 158 </script>