| <!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> |