| <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> |
| <html> |
| <head> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| </head> |
| <body> |
| <script> |
| |
| function makeCanvas() { |
| return new Promise(resolve => { |
| let canvas = document.createElement('canvas'); |
| canvas.setAttribute('width', '10'); |
| canvas.setAttribute('height', '10'); |
| resolve(canvas); |
| }); |
| } |
| |
| function makeOffscreenCanvas() { |
| return new Promise(resolve => { |
| let canvas = new OffscreenCanvas(10, 10); |
| resolve(canvas); |
| }); |
| } |
| |
| function makeOversizedCanvas() { |
| |
| return new Promise(resolve => { |
| let canvas = document.createElement('canvas'); |
| canvas.setAttribute('width', '100000000'); |
| canvas.setAttribute('height', '100000000'); |
| resolve(canvas); |
| }); |
| } |
| |
| function makeOversizedOffscreenCanvas() { |
| return new Promise(resolve =>{ |
| let canvas = new OffscreenCanvas(100000000, 100000000); |
| resolve(canvas); |
| }); |
| } |
| |
| function makeVideo() { |
| return new Promise(resolve => { |
| let video = document.createElement('video'); |
| video.addEventListener('canplaythrough', resolve.bind(undefined, video), false); |
| video.src = '/media/A4.ogv'; |
| }); |
| } |
| |
| function makeImage() { |
| return makeCanvas().then(canvas => { |
| let image = new Image(); |
| image.src = canvas.toDataURL(); |
| return new Promise(resolve => { |
| image.onload = resolve.bind(undefined, image); |
| }); |
| }); |
| } |
| |
| function makeImageData() { |
| return makeCanvas().then(canvas => { |
| return new Promise(function(resolve, reject) { |
| resolve(canvas.getContext('2d').getImageData(0, 0, 10, 10)); |
| }); |
| }); |
| } |
| |
| function makeImageBitmap() { |
| return makeCanvas().then(canvas => { |
| return createImageBitmap(canvas); |
| }); |
| } |
| |
| function makeBlob() { |
| return makeCanvas().then(canvas => { |
| return new Promise(resolve => { |
| canvas.toBlob(resolve); |
| }); |
| }); |
| } |
| |
| function makeInvalidBlob() { |
| return new Promise(resolve => { |
| resolve(new Blob()); // Blob with no data cannot be decoded. |
| }); |
| } |
| |
| imageSourceTypes = [ |
| { name: 'HTMLImageElement', factory: makeImage }, |
| { name: 'HTMLVideoElement', factory: makeVideo }, |
| { name: 'HTMLCanvasElement', factory: makeCanvas }, |
| { name: 'OffscreenCanvas', factory: makeOffscreenCanvas }, |
| { name: 'ImageData', factory: makeImageData }, |
| { name: 'ImageBitmap', factory: makeImageBitmap }, |
| { name: 'Blob', factory: makeBlob }, |
| ]; |
| |
| testCases = [ |
| { |
| description: 'createImageBitmap with a <sourceType> source and sw set to ' + |
| '0 rejects with a RangeError.', |
| promiseTestFunction: |
| (source, t) => { |
| return promise_rejects(t, new RangeError(), |
| createImageBitmap(source, 0, 0, 0, 10)); |
| } |
| }, |
| { |
| description: 'createImageBitmap with a <sourceType> source and sh set to ' + |
| '0 rejects with a RangeError.', |
| promiseTestFunction: |
| (source, t) => { |
| return promise_rejects(t, new RangeError(), |
| createImageBitmap(source, 0, 0, 10, 0)); |
| } |
| }, |
| { |
| // This case is not explicitly documented in the specification for |
| // createImageBitmap, but it is expected that internal failures cause |
| // |
| description: 'createImageBitmap with a <sourceType> source and oversized ' + |
| '(unallocatable) crop region rejects with an InvalidStateError ' + |
| 'DOMException.', |
| promiseTestFunction: |
| (source, t) => { |
| return promise_rejects(t, new DOMException('', 'InvalidStateError'), |
| createImageBitmap(source, 0, 0, 100000000, 100000000)); |
| } |
| }, |
| ]; |
| |
| // Generate the test matrix for each sourceType + testCase combo. |
| imageSourceTypes.forEach(imageSourceType => { |
| testCases.forEach(testCase => { |
| let description = testCase.description.replace('<sourceType>', |
| imageSourceType.name); |
| promise_test( t => { |
| return imageSourceType.factory().then(source => { |
| return testCase.promiseTestFunction(source, t); |
| }); |
| }, description); |
| }); |
| }); |
| |
| promise_test( t => { |
| return promise_rejects(t, new TypeError(), createImageBitmap(undefined)); |
| }, "createImageBitmap with undefined image source rejects with a TypeError."); |
| |
| promise_test( t => { |
| return promise_rejects(t, new TypeError(), createImageBitmap(null)); |
| }, "createImageBitmap with null image source rejects with a TypeError."); |
| |
| promise_test( t => { |
| return promise_rejects(t, new DOMException('', 'InvalidStateError'), |
| createImageBitmap(new Image())); |
| }, "createImageBitmap with empty image source rejects with a InvalidStateError."); |
| |
| promise_test( t => { |
| return promise_rejects(t, new DOMException('', 'InvalidStateError'), |
| createImageBitmap(document.createElement('video'))); |
| }, "createImageBitmap with empty video source rejects with a InvalidStateError."); |
| |
| promise_test( t => { |
| return makeOversizedCanvas().then(canvas => { |
| return promise_rejects(t, new DOMException('', 'InvalidStateError'), |
| createImageBitmap(canvas)); |
| }); |
| }, "createImageBitmap with an oversized canvas source rejects with a RangeError."); |
| |
| promise_test( t => { |
| return makeOversizedOffscreenCanvas().then(offscreenCanvas => { |
| return promise_rejects(t, new DOMException('', 'InvalidStateError'), |
| createImageBitmap(offscreenCanvas)); |
| }); |
| }, "createImageBitmap with an invalid OffscreenCanvas source rejects with a RangeError."); |
| |
| promise_test( t => { |
| return makeInvalidBlob().then(blob => { |
| return promise_rejects(t, new DOMException('', 'InvalidStateError'), |
| createImageBitmap(blob)); |
| }); |
| }, "createImageBitmap with an undecodable blob source rejects with an InvalidStateError."); |
| |
| </script> |
| </body> |
| </html> |