<!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) {
        var bitmapCanvas = new OffscreenCanvas(width,height);
        var bitmapCtx = bitmapCanvas.getContext('bitmaprenderer');
        bitmapCtx.transferFromImageBitmap(greenImage);

        // Make sure the bitmap renderer canvas is filled correctly.
        var myCanvas = document.createElement('canvas');
        var myCtx = myCanvas.getContext('bitmaprenderer');
        myCtx.transferFromImageBitmap(bitmapCanvas.transferToImageBitmap());
        testCanvas(myCanvas, 0, 255, 0, 255);

        // Test that after transfering for second time to ImageBitmap produces
        // a black bitmap of the same size
        var myCanvas2 = document.createElement('canvas');
        var myCtx2 = myCanvas2.getContext('bitmaprenderer');
        myCtx2.transferFromImageBitmap(bitmapCanvas.transferToImageBitmap());
        testCanvas(myCanvas2, 0, 0, 0, 0);
    }

    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);

    return Promise.all([
        createImageBitmap(greenCanvas),
    ]).then(([greenImage]) => {
        testTransferFromImageBitmapNullability(greenImage);
    });
},'Test that transferToImageBitmap works and that resets the imagebitmap to black');

</script>
