offscreencanvas.transfer.to.imagebitmap.w.html (6711B)
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/#dom-offscreencanvas-transfertoimagebitmap"> 6 7 <script id="myWorker" type="text/worker"> 8 9 function testSize(contextType) 10 { 11 var offscreenCanvas = new OffscreenCanvas(100, 50); 12 var ctx = offscreenCanvas.getContext(contextType); 13 var image = offscreenCanvas.transferToImageBitmap(); 14 if (image.width == 100 && image.height == 50) 15 return true; 16 return false; 17 } 18 19 function testImageBitmapClr(shouldCallTwice, alphaVal) { 20 var offscreenCanvas = new OffscreenCanvas(100, 50); 21 var ctx = offscreenCanvas.getContext('2d', {alpha: alphaVal}); 22 ctx.fillStyle = "#0f0"; 23 ctx.fillRect(0, 0, 100, 50); 24 var image = offscreenCanvas.transferToImageBitmap(); 25 26 if (shouldCallTwice) 27 image = offscreenCanvas.transferToImageBitmap(); 28 return image; 29 } 30 31 function isInvalidStateError(funcStr, offscreenCanvas) 32 { 33 try { 34 eval(funcStr); 35 } catch (e) { 36 if (e instanceof DOMException && e.name == "InvalidStateError") 37 return true; 38 return false; 39 } 40 } 41 42 function testImageBitmapSize() 43 { 44 return testSize('2d') && testSize('webgl'); 45 } 46 47 function testLineWidthNotAltered() 48 { 49 var offscreenCanvas = new OffscreenCanvas(100, 50); 50 var ctx = offscreenCanvas.getContext('2d'); 51 ctx.lineWidth = 10; 52 var image = offscreenCanvas.transferToImageBitmap(); 53 return ctx.lineWidth == 10; 54 } 55 56 function testTransformPreserved() 57 { 58 var offscreenCanvas = new OffscreenCanvas(100, 50); 59 var ctx = offscreenCanvas.getContext('2d'); 60 ctx.rect(0, 0, 25, 50); 61 ctx.clip(); 62 ctx.translate(20, 20); 63 64 ctx.fillStyle = '#0f0'; 65 var image1 = offscreenCanvas.transferToImageBitmap(); 66 // trasnform should be preserved 67 ctx.fillRect(0, 0, 10, 10); 68 var image2 = offscreenCanvas.transferToImageBitmap(); 69 return image2; 70 } 71 72 function testException() 73 { 74 var offscreenCanvas = new OffscreenCanvas(10, 10); 75 return isInvalidStateError("offscreenCanvas.transferToImageBitmap()", offscreenCanvas); 76 } 77 78 self.onmessage = function(e) { 79 switch (e.data) { 80 case 'test1': 81 self.postMessage(testImageBitmapSize()); 82 break; 83 case 'test2': 84 self.postMessage(testImageBitmapClr(false, true)); 85 break; 86 case 'test3': 87 self.postMessage(testImageBitmapClr(true, true)); 88 break; 89 case 'test4': 90 self.postMessage(testImageBitmapClr(true, false)); 91 break; 92 case 'test5': 93 self.postMessage(testLineWidthNotAltered()); 94 break; 95 case 'test6': 96 self.postMessage(testTransformPreserved()); 97 break; 98 case 'test7': 99 var offscreenCanvas = new OffscreenCanvas(10, 10); 100 self.postMessage({offscreenCanvas: offscreenCanvas}, [offscreenCanvas]); 101 self.postMessage(isInvalidStateError("offscreenCanvas.transferToImageBitmap()", offscreenCanvas)); 102 break; 103 case 'test8': 104 self.postMessage(testException()); 105 break; 106 } 107 }; 108 109 </script> 110 111 <script> 112 function makeWorker(test) { 113 var blob = new Blob([document.getElementById("myWorker").textContent]); 114 var worker = new Worker(URL.createObjectURL(blob)); 115 worker.onerror = test.unreached_func("error"); 116 return worker; 117 } 118 119 function drawImageBitmap(image, x, y) 120 { 121 var drawCanvas = document.createElement('canvas'); 122 drawCanvas.width = 100; 123 drawCanvas.height = 50; 124 var dCtx = drawCanvas.getContext('2d'); 125 dCtx.drawImage(image, 0, 0); 126 return dCtx.getImageData(x, y, 1, 1).data; 127 } 128 129 async_test(function(t) { 130 var worker = makeWorker(t); 131 worker.addEventListener('message', t.step_func_done(function(msg) { 132 assert_true(msg.data); 133 })); 134 worker.postMessage('test1'); 135 }, "Test that transferToImageBitmap returns an ImageBitmap with correct width and height in a worker"); 136 137 async_test(function(t) { 138 var worker = makeWorker(t); 139 worker.addEventListener('message', t.step_func_done(function(msg) { 140 var clr = drawImageBitmap(msg.data, 50, 25); 141 assert_array_equals(clr, [0, 255, 0, 255]); 142 })); 143 worker.postMessage('test2'); 144 }, "Test that transferToImageBitmap returns an ImageBitmap with correct color in a worker"); 145 146 async_test(function(t) { 147 var worker = makeWorker(t); 148 worker.addEventListener('message', t.step_func_done(function(msg) { 149 var clr = drawImageBitmap(msg.data, 50, 25); 150 assert_array_equals(clr, [0, 0, 0, 0]); 151 })); 152 worker.postMessage('test3'); 153 }, "Test that call transferToImageBitmap twice returns an ImageBitmap with correct color in a worker"); 154 155 async_test(function(t) { 156 var worker = makeWorker(t); 157 worker.addEventListener('message', t.step_func_done(function(msg) { 158 var clr = drawImageBitmap(msg.data, 50, 25); 159 assert_array_equals(clr, [0, 0, 0, 255]); 160 })); 161 worker.postMessage('test4'); 162 }, "Test that call transferToImageBitmap twice on a alpha-disabled context returns an ImageBitmap with correct color in a worker"); 163 164 async_test(function(t) { 165 var worker = makeWorker(t); 166 worker.addEventListener('message', t.step_func_done(function(msg) { 167 assert_true(msg.data); 168 })); 169 worker.postMessage('test5'); 170 }, "Test that transferToImageBitmap won't change context's property in a worker"); 171 172 async_test(function(t) { 173 var worker = makeWorker(t); 174 worker.addEventListener('message', t.step_func_done(function(msg) { 175 var clr1 = drawImageBitmap(msg.data, 23, 25); 176 assert_array_equals(clr1, [0, 255, 0, 255]); 177 var clr2 = drawImageBitmap(msg.data, 27, 25); 178 assert_array_equals(clr2, [0, 0, 0, 0]); 179 })); 180 worker.postMessage('test6'); 181 }, "Test that call transferToImageBitmap preserves transform in a worker"); 182 183 async_test(function(t) { 184 var worker = makeWorker(t); 185 worker.addEventListener('message', t.step_func(function (msg) { 186 if (msg.data == true || msg.data == false) { 187 assert_true(msg.data); 188 t.done(); 189 } 190 })); 191 worker.postMessage('test7'); 192 }, "Test that call transferToImageBitmap on a detached OffscreenCanvas throws an exception in a worker"); 193 194 async_test(function(t) { 195 var worker = makeWorker(t); 196 worker.addEventListener('message', t.step_func_done(function(msg) { 197 assert_true(msg.data); 198 })); 199 worker.postMessage('test8'); 200 }, "Test that call transferToImageBitmap without a context throws an exception in a worker"); 201 202 </script>