blob: 98f1f0e0f486e7b36f45d31c8989f7bc8eab745f [file] [log] [blame]
<!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");
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");
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>