<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test.js"></script>
</head>
<body>
<script>
description("Ensure correct behavior of createImageBitmap for invalid inputs.");
window.jsTestIsAsync = true;

var reason;

function shouldBeRejected(promise, message, isReasonError) {
    return promise.then(function() {
        testFailed('Resolved unexpectedly: ' + message);
    }, function(e) {
        reason = e;
        testPassed('Rejected as expected: ' + message);
        if (isReasonError)
            shouldBeTrue('reason instanceof Error');
        debug(e);
    });
}

function checkInvalidRange(source, message) {
    return Promise.resolve().then(function() {
        return shouldBeRejected(createImageBitmap(source, 0, 0, 10, 0), message + ' / invalid range', true);
    }).then(function() {
        return shouldBeRejected(createImageBitmap(source, 0, 0, 0, 10), message + ' / invalid range', true);
    });
}

function createCanvas() {
    return new Promise(function(resolve, reject) {
        var canvas = document.createElement('canvas');
        canvas.setAttribute('width', '200');
        canvas.setAttribute('height', '200');
        resolve(canvas);
    });
}

function createInvalidCanvas() {
    // Create a terapixel canvas to generate an invalid canvas through
    // allocation failure
    return new Promise(function(resolve, reject) {
        var canvas = document.createElement('canvas');
        canvas.setAttribute('width', '100000000');
        canvas.setAttribute('height', '100000000');
        resolve(canvas);
    });
}

function createVideo() {
    return new Promise(function(resolve, reject) {
        var video = document.createElement('video');
        video.addEventListener('canplaythrough', resolve.bind(undefined, video), false);
        video.src = '../../compositing/resources/video.ogv';
    });
}

function createImage() {
    return createCanvas().then(function(canvas) {
        var image = new Image();
        var promise = new Promise(function(resolve, reject) {
            image.onload = resolve.bind(undefined, image);
        });
        image.src = canvas.toDataURL();
        return promise;
    });
}

function createBlob(url) {
    return new Promise(function(resolve, reject) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url);
        xhr.responseType = 'blob';
        xhr.onload = function() {
            resolve(xhr.response);
        };
        xhr.onerror = reject;
        xhr.send();
    });
}

Promise.resolve().then(function() {
    return shouldBeRejected(createImageBitmap(undefined), 'undefined', true);
}).then(function() {
    return shouldBeRejected(createImageBitmap(null), 'null', true);
}).then(function() {
    return shouldBeRejected(createImageBitmap(new Image), 'empty image', true);
}).then(function() {
    return shouldBeRejected(createImageBitmap(document.createElement('video')), 'empty video', true);
}).then(function() {
    return createImage().then(function(image) {
        return checkInvalidRange(image, 'image');
    });
}).then(function() {
    return createVideo().then(function(video) {
        return checkInvalidRange(video, 'video');
    });
}).then(function() {
    return createCanvas().then(function(canvas) {
        return checkInvalidRange(canvas, 'canvas');
    });
}).then(function() {
    return createCanvas().then(function(canvas) {
        var imagedata = canvas.getContext('2d').getImageData(0, 0, canvas.width, canvas.height);
        return checkInvalidRange(imagedata, 'canvas imagedata')
    });
}).then(function() {
    return createImage().then(function(image) {
        return createImageBitmap(image);
    }).then(function(bitmap) {
        return checkInvalidRange(bitmap, 'image bitmap');
    });
}).then(function() {
    return createBlob('resources/pattern.png').then(function(blob) {
        return checkInvalidRange(blob, 'blob');
    });
}).then(function() {
    return createBlob('resources/shadow-offset.js').then(function(blob) {
        return shouldBeRejected(createImageBitmap(blob), 'invalid blob', true);
    });
}).then(function() {
    return createInvalidCanvas().then(function(invalidCanvas) {
        return shouldBeRejected(createImageBitmap(invalidCanvas), 'invalid canvas', false);
    });
}).then(function() {
    var imageData = new ImageData(10, 10);
    return shouldBeRejected(createImageBitmap(imageData, 0, 0, 0x10004, 0x10004, {premultiplyAlpha:"none"}), 'cropRect too big', false);
}).catch(function(e) {
    testFailed('Unexpected rejection: ' + e);
}).then(finishJSTest, finishJSTest);

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