blob: f920b733ac068d9f1cc2149ede13661e5dafd70a [file] [log] [blame]
<!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>