test_offscreencanvas_dynamic_fallback.html (2191B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>WebGL in OffscreenCanvas</title> 5 <script src="/tests/SimpleTest/SimpleTest.js"></script> 6 <script src="/tests/SimpleTest/WindowSnapshot.js"></script> 7 <link rel="stylesheet" href="/tests/SimpleTest/test.css"> 8 </head> 9 <body> 10 <script> 11 12 SimpleTest.waitForExplicitFinish(); 13 14 function createCanvas(initWithMask) { 15 var canvas = document.createElement("canvas"); 16 canvas.width = 64; 17 canvas.height = 64; 18 document.body.appendChild(canvas); 19 if (initWithMask) { 20 canvas.style.mask = "url('offscreencanvas_mask.svg#fade_mask_both')"; 21 } 22 23 return canvas; 24 } 25 26 async function getRefSnapshot(initWithMask) { 27 var refCanvas = createCanvas(!initWithMask); 28 var ctx = refCanvas.getContext("2d"); 29 ctx.rect(0, 0, 64, 64); 30 ctx.fillStyle = "#00FF00"; 31 ctx.fill(); 32 var result = await snapshotWindow(window); 33 document.body.removeChild(refCanvas); 34 return result; 35 } 36 37 function runTest(initWithMask) { 38 var htmlCanvas = createCanvas(initWithMask); 39 var worker = new Worker("offscreencanvas.js"); 40 41 worker.onmessage = async function(evt) { 42 var msg = evt.data || {}; 43 if (msg.type == "draw") { 44 if (msg.count === 10) { 45 // Change the fallback state dynamically when drawing count reaches 10. 46 if (initWithMask) { 47 htmlCanvas.style.mask = ""; 48 } else { 49 htmlCanvas.style.mask = "url('offscreencanvas_mask.svg#fade_mask_both')"; 50 } 51 } else if (msg.count === 20) { 52 worker.terminate(); 53 var snapshotFallback = await snapshotWindow(window); 54 document.body.removeChild(htmlCanvas); 55 56 var results = compareSnapshots(snapshotFallback, await getRefSnapshot(initWithMask), true); 57 ok(results[0], "after dynamic fallback, screenshots should be the same"); 58 59 if (initWithMask) { 60 SimpleTest.finish(); 61 } else { 62 runTest(true); 63 } 64 } 65 } 66 } 67 68 var offscreenCanvas = htmlCanvas.transferControlToOffscreen(); 69 70 worker.postMessage({test: 'webgl_fallback', canvas: offscreenCanvas}, [offscreenCanvas]); 71 } 72 73 SpecialPowers.pushPrefEnv({'set': [ 74 ['webgl.force-enabled', true], 75 ]}, runTest.bind(false)); 76 77 </script> 78 </body> 79 </html>