<!DOCTYPE html>
<html>
<body>
<canvas id='output' width='200' height='400'></canvas>
<script src="/js-test-resources/js-test.js"></script>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
    var aCanvas = new OffscreenCanvas(200, 400);
    var ctx = aCanvas.getContext('2d');

    // Draw a tainted imagebitmap into OffscreenCanvas 2d
    ctx.drawImage(e.data, 0, 0, 10, 10);

    var image = aCanvas.transferToImageBitmap();
    self.postMessage(image, [image]);
};
</script>
<script>
description("The taintedness of the imagebitmap drawn to OffscrenCanvas must be transfered");

window.jsTestIsAsync = true;

function shouldBeTainted(imageBitmap) {
    var canvas = document.createElement("canvas");
    canvas.width = 10;
    canvas.height = 10;
    var context = canvas.getContext("2d");
    context.drawImage(imageBitmap, 0, 0, 10, 10);
    try {
        var imageData = context.getImageData(0, 0, 10, 10);
        testFailed("ImageBitmap is not tainted.");
    } catch (e) {
        testPassed("ImageBitmap is tainted. Threw error: " + e);
    }
}

var blob = new Blob([document.getElementById('myWorker').textContent]);
var worker = new Worker(URL.createObjectURL(blob));
worker.addEventListener('message', msg => {
    shouldBeTainted(msg.data);
    finishJSTest();
});

var image = document.createElement('img');
image.src = 'http://localhost:8080/security/resources/abe.png';
image.addEventListener('load', function() {
    createImageBitmap(image, 0, 0, 10, 10).then(
        function(imagebitmap) {
            // Post the tainted imagebitmap to worker
            worker.postMessage(imagebitmap, [imagebitmap]);
        },
        function(e) {
            testFailed("Image rejected unexpectedly. ");
            debug(e);
        }
    );
});

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