<!DOCTYPE html>
<meta charset="utf-8">
<title>Canvas's ImageBitmapRenderingContext test</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#the-imagebitmap-rendering-context">
<script>
var width = 10;
var height = 10;

function testCanvas(bitmapCanvas, r, g, b, a)
{
    var myCanvas = document.createElement('canvas');
    myCanvas.width = width;
    myCanvas.height = height;
    var myCtx = myCanvas.getContext('2d');
    myCtx.drawImage(bitmapCanvas, 0, 0);
    var color = myCtx.getImageData(5, 5, 1, 1).data;
    assert_array_equals(color, [r, g, b, a]);
}

promise_test(function() {
    function testTransferFromImageBitmapNullability(greenImage, redImage) {
        var bitmapCanvas = new OffscreenCanvas(width,height);
        var bitmapCtx = bitmapCanvas.getContext('bitmaprenderer');
        bitmapCtx.transferFromImageBitmap(greenImage);

        // Make sure the bitmap renderer canvas is filled correctly.
        testCanvas(bitmapCanvas, 0, 255, 0, 255);

        // Test if passing null resets the bitmap renderer canvas.
        // Drawing the resetted canvas cannot change the destination canvas.
        bitmapCtx.transferFromImageBitmap(null);
        testCanvas(bitmapCanvas, 0, 0, 0, 0);

        // Test if we can redraw the bitmap canvas correctly after reset.
        bitmapCtx.transferFromImageBitmap(redImage);
        testCanvas(bitmapCanvas, 255, 0, 0, 255);
    }

    var greenCanvas = document.createElement('canvas');
    greenCanvas.width = width;
    greenCanvas.height = height;
    var greenCtx = greenCanvas.getContext('2d');
    greenCtx.fillStyle = '#0f0';
    greenCtx.fillRect(0, 0, width, height);

    var redCanvas = document.createElement('canvas');
    redCanvas.width = width;
    redCanvas.height = height;
    var redCtx = redCanvas.getContext('2d');
    redCtx.fillStyle = '#f00';
    redCtx.fillRect(0, 0, width, height);

    return Promise.all([
        createImageBitmap(greenCanvas),
        createImageBitmap(redCanvas),
    ]).then(([greenImage, redImage]) => {
        testTransferFromImageBitmapNullability(greenImage, redImage);
    });
},'Test that transferFromImageBitmap(null) discards the previously transferred image');

</script>
