<!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(ctx, r, g, b, a)
{
    var color = ctx.getImageData(5, 5, 1, 1).data;
    assert_array_equals(color, [r, g, b, a]);
}

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

        return bitmapCanvas.convertToBlob();
    }

    function drawBlobToCanvas(blob) {
        // Make sure the bitmap renderer canvas is filled correctly.
        var pngImage = new Image();
        var myCanvasToTest = document.createElement('canvas');
        myCanvasToTest.width = width;
        myCanvasToTest.height = height;

        // Wait for the blob img to load.
        return new Promise(function(resolve) {
            pngImage.src = URL.createObjectURL(blob);
            pngImage.onload = function() {
                var myCtxToTest = myCanvasToTest.getContext('2d');
                myCtxToTest.drawImage(pngImage, 0, 0);
                resolve(myCtxToTest);
            };
        });
    }

    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 createImageBitmap(greenCanvas).then(
        greenImage => transferFromImageBitmapToBlobOffscreen(greenImage)
    ).then(
        blob => drawBlobToCanvas(blob)
    ).then(
        ctx => testCanvas(ctx, 0, 255, 0, 255)
    );
},'Test that convertToBlob works and produce the expected image');

</script>
