chromium/third_party/blink/web_tests/fast/canvas/canvas-createImageBitmap-blob-in-workers.html

<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test.js"></script>
</head>
<body>
<script>
jsTestIsAsync = true;
var worker = new Worker('../../fast/canvas/resources/canvas-createImageBitmap-blob-in-workers.js');

description('Test race condition for createImageBitmap from blob in workers and main.');

var imgWidth = 300;
var imgHeight = 150;
var numOfBitmaps = 5;
var bitmapArray = [];

var canvas1 = document.createElement("canvas");
var ctx1 = canvas1.getContext("2d");
ctx1.fillStyle = "#FF0000";
ctx1.fillRect(0, 0, imgWidth, imgHeight);

function compareImageData(data1, data2)
{
    if (data1.length != data2.length) {
        testFailed("The two image have different dimensions");
        finishJSTest();
    }
    for (var i = 0; i < data1.length; i++) {
        if (data1[i] != data2[i]) {
            testFailed("The two image have different pixel data");
            finishJSTest();
        }
    }
}

var getMessageFromWorker = new Promise((resolve, reject) => {
    function onMessage(e) {
        resolve(e.data.data);
        worker.removeEventListener("message", onMessage);
    }
    worker.addEventListener("message", onMessage);
});

// check that the created ImageBitmaps from worker and main have the same pixel
// data as the source, which is the canvas1.toBlob
var newImg = new Image();
canvas1.toBlob(function(blob) {
    worker.postMessage(blob);
    for (var i = 0; i < numOfBitmaps; i++) {
        createImageBitmap(blob).then(imageBitmap => {
            bitmapArray.push(imageBitmap);
            if (bitmapArray.length == numOfBitmaps) {
                var url = URL.createObjectURL(blob);
                newImg.src = url;
            }
        });
    }
});

var imageLoaded = new Promise((resolve, reject) => {
    newImg.onload = function() {
        var canvas2 = document.createElement("canvas");
        var ctx2 = canvas2.getContext("2d", {willReadFrequently: true});
        ctx2.drawImage(newImg, 0, 0, imgWidth, imgHeight);
        resolve(ctx2.getImageData(0, 0, imgWidth, imgHeight).data);
    };
});

Promise.all([imageLoaded, getMessageFromWorker]).then(([imageDataFromImg, imageBitmapFromWorker]) => {
    var canvas3 = document.createElement("canvas");
    var ctx3 = canvas3.getContext("2d", {willReadFrequently: true});
    for (var i = 0; i < numOfBitmaps; i++) {
        ctx3.clearRect(0, 0, imgWidth, imgHeight);
        ctx3.drawImage(bitmapArray[i], 0, 0, imgWidth, imgHeight);
        var imageData = ctx3.getImageData(0, 0, imgWidth, imgHeight).data;
        compareImageData(imageData, imageDataFromImg);
    }

    ctx3.clearRect(0, 0, imgWidth, imgHeight);
    ctx3.drawImage(imageBitmapFromWorker, 0, 0, imgWidth, imgHeight);
    var imageData = ctx3.getImageData(0, 0, imgWidth, imgHeight).data;
    compareImageData(imageData, imageDataFromImg);
    testPassed("ImageBitmaps created from blob in worker and in main have the same pixel data");
    finishJSTest();
});

</script>
</body>
</html>