<!DOCTYPE html>
<html>
<title>createImageBitmap test</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/canvas-tests.js"></script>
<link rel="stylesheet" href="/common/canvas-tests.css">
<body>
<script>
(function() {
    let loadImage = new Promise(function(resolve, reject) {
        let img = new Image();
        img.onload = function() { resolve(img); };
        img.onerror = function() { reject(); };
        img.src = "/images/pattern.png";
    });

    promise_test(function(t) {
        return promise_rejects(t, new RangeError, createImageBitmap(new Image(), 0, 0, 0, 10));
    }, "createImageBitmap rejects with RangeError if width is zero");

    promise_test(function(t) {
        return promise_rejects(t, new RangeError, createImageBitmap(new Image(), 0, 0, 10, 0));
    }, "createImageBitmap rejects with RangeError if height is zero");

    promise_test(function(t) {
        return loadImage.then(function(img) {
            assert_equals(img.width, 20);
            assert_equals(img.height, 20);
            return createImageBitmap(img, 10, 10, -10, -10);
        }).then(function(imageBitmap) {
            assert_equals(imageBitmap.width, 10);
            assert_equals(imageBitmap.height, 10);
        });
    }, "createImageBitmap if width is negative");

    promise_test(function(t) {
        return loadImage.then(function(img) {
            assert_equals(img.width, 20);
            assert_equals(img.height, 20);
            return createImageBitmap(img, 10, 10, 10, -10);
        }).then(function(imageBitmap) {
            assert_equals(imageBitmap.width, 10);
            assert_equals(imageBitmap.height, 10);
        });
    }, "createImageBitmap if height is negative");

    promise_test(function(t) {
        return promise_rejects(t, "InvalidStateError", createImageBitmap(new Image()));
    }, "createImageBitmap rejects with InvalidStateError on an HTMLImageElement with no image data");

    promise_test(function() {
        return loadImage.then(function(img) {
            return createImageBitmap(img);
        }).then(function(imageBitmap) {
            assert_equals(imageBitmap.width, 20, "ImageBitmap width should be 20");
            assert_equals(imageBitmap.height, 20, "ImageBitmap height should be 20");
        });
    }, "createImageBitmap from an HTMLImageElement with image data");

    promise_test(function(t) {
        let canvas = document.createElement("canvas");
        canvas.width = 0;
        canvas.height = 0;
        return promise_rejects(t, "InvalidStateError", createImageBitmap(canvas));
    }, "createImageBitmap rejects with InvalidStateError from an canvas with zero dimensions");

    promise_test(function() {
        return new Promise(function(resolve, reject) {
            let canvas = document.createElement("canvas");
            canvas.width = 20;
            canvas.height = 20;
            canvas.getContext("2d").fillRect(0, 0, 20, 20);
            resolve(createImageBitmap(canvas));
        }).then(function(imageBitmap) {
            assert_equals(imageBitmap.width, 20, "ImageBitmap width should be 20");
            assert_equals(imageBitmap.height, 20, "ImageBitmap height should be 20");
        });
    }, "createImageBitmap from an canvas");

    promise_test(function() {
        return new Promise(function(resolve, reject) {
            let img = new Image();
            img.onload = function() { resolve(img); };
            img.src = "/images/pattern.png";
        }).then(function(img) {
            return createImageBitmap(img);
        }).then(function(imageBitmap) {
            imageBitmap.close();
            assert_equals(imageBitmap.width, 0, "A closed ImageBitmap width should be 0");
            assert_equals(imageBitmap.height, 0, "A closed ImageBitmap height should be 0");
        });
    }, "A closed ImageBitmap has zero width and height");

})();
</script>
</body>
</html>
