createImageBitmap-invalid-args.html (7788B)
1 <!doctype html> 2 <script src="/resources/testharness.js"></script> 3 <script src="/resources/testharnessreport.js"></script> 4 <script src="/common/media.js"></script> 5 <script src="common.sub.js"></script> 6 <script> 7 8 function makeOversizedCanvas() { 9 10 return new Promise(resolve => { 11 let canvas = document.createElement('canvas'); 12 canvas.setAttribute('width', '100000000'); 13 canvas.setAttribute('height', '100000000'); 14 resolve(canvas); 15 }); 16 } 17 18 function makeOversizedOffscreenCanvas() { 19 return new Promise(resolve =>{ 20 let canvas = new OffscreenCanvas(100000000, 100000000); 21 resolve(canvas); 22 }); 23 } 24 25 function makeInvalidBlob() { 26 return new Promise(resolve => { 27 resolve(new Blob()); // Blob with no data cannot be decoded. 28 }); 29 } 30 31 function makeBrokenImage() { 32 return new Promise((resolve, reject) => { 33 const image = new Image(); 34 image.src = "data:,x"; 35 image.onload = reject; 36 image.onerror = () => resolve(image); 37 }); 38 } 39 40 function makeAvailableButBrokenImage(path) { 41 return new Promise((resolve, reject) => { 42 const image = new Image(); 43 image.src = path; 44 image.onload = () => resolve(image); 45 image.onerror = reject; 46 }); 47 } 48 49 testCases = [ 50 { 51 description: 'createImageBitmap with <sourceType> source and sw set to 0', 52 promiseTestFunction: 53 (source, t) => { 54 return promise_rejects_js(t, RangeError, 55 createImageBitmap(source, 0, 0, 0, 10)); 56 } 57 }, 58 { 59 description: 'createImageBitmap with <sourceType> source and sh set to 0', 60 promiseTestFunction: 61 (source, t) => { 62 return promise_rejects_js(t, RangeError, 63 createImageBitmap(source, 0, 0, 10, 0)); 64 } 65 }, 66 { 67 description: 'createImageBitmap with <sourceType> source and oversized ' + 68 '(unallocatable) crop region', 69 promiseTestFunction: 70 (source, t) => { 71 return createImageBitmap(source, 0, 0, 100000000, 100000000) 72 .then(i => { 73 assert_equals(i.width, 100000000); 74 assert_equals(i.height, 100000000); 75 }) 76 .catch(e => { 77 // This case is not explicitly documented in the specification for 78 // createImageBitmap, but it is expected that internal failures 79 // cause InvalidStateError. 80 // 81 // Note: https://bugs.chromium.org/p/chromium/issues/detail?id=799025 82 assert_throws_dom("InvalidStateError", () => { throw e }); 83 }); 84 } 85 }, 86 { 87 description: 'createImageBitmap with <sourceType> source and ' + 88 'a value of 0 int resizeWidth', 89 promiseTestFunction: 90 (source, t) => { 91 return createImageBitmap(source, {resizeWidth:0, resizeHeight:10}) 92 .catch(e => { 93 assert_throws_dom("InvalidStateError", () => { throw e }); 94 }); 95 } 96 }, 97 { 98 description: 'createImageBitmap with <sourceType> source and ' + 99 'a value of 0 in resizeHeight', 100 promiseTestFunction: 101 (source, t) => { 102 return createImageBitmap(source, {resizeWidth:10, resizeHeight:0}) 103 .catch(e => { 104 assert_throws_dom("InvalidStateError", () => { throw e }); 105 }); 106 } 107 }, 108 { 109 description: 'createImageBitmap with <sourceType> source and ' + 110 'a value between 0 and 1 in resizeWidth', 111 promiseTestFunction: 112 (source, t) => { 113 return createImageBitmap(source, {resizeWidth:0.5, resizeHeight:10}) 114 .catch(e => { 115 assert_throws_dom("InvalidStateError", () => { throw e }); 116 }); 117 } 118 }, 119 { 120 description: 'createImageBitmap with <sourceType> source and ' + 121 'a value between 0 and 1 in resizeHeight', 122 promiseTestFunction: 123 (source, t) => { 124 return createImageBitmap(source, {resizeWidth:10, resizeHeight:0.5}) 125 .catch(e => { 126 assert_throws_dom("InvalidStateError", () => { throw e }); 127 }); 128 } 129 }, 130 ]; 131 132 // Generate the test matrix for each sourceType + testCase combo. 133 imageSourceTypes.forEach(imageSourceType => { 134 testCases.forEach(testCase => { 135 let description = testCase.description.replace('<sourceType>', 136 imageSourceType.name); 137 promise_test( t => { 138 return imageSourceType.factory().then(source => { 139 return testCase.promiseTestFunction(source, t); 140 }); 141 }, description); 142 }); 143 }); 144 145 promise_test( t => { 146 return promise_rejects_js(t, TypeError, createImageBitmap(undefined)); 147 }, "createImageBitmap with undefined image source."); 148 149 promise_test( t => { 150 return promise_rejects_js(t, TypeError, createImageBitmap(null)); 151 }, "createImageBitmap with null image source."); 152 153 promise_test( t => { 154 var context = document.createElement("canvas").getContext("2d"); 155 return promise_rejects_js(t, TypeError, createImageBitmap(context)); 156 }, "createImageBitmap with CanvasRenderingContext2D image source."); 157 158 promise_test( t => { 159 var context = document.createElement("canvas").getContext("webgl"); 160 return promise_rejects_js(t, TypeError, createImageBitmap(context)); 161 }, "createImageBitmap with WebGLRenderingContext image source."); 162 163 promise_test( t => { 164 var buffer = new Uint8Array(); 165 return promise_rejects_js(t, TypeError, createImageBitmap(buffer)); 166 }, "createImageBitmap with Uint8Array image source."); 167 168 promise_test( t => { 169 var buffer = new ArrayBuffer(8); 170 return promise_rejects_js(t, TypeError, createImageBitmap(buffer)); 171 }, "createImageBitmap with ArrayBuffer image source."); 172 173 promise_test( t => { 174 return promise_rejects_dom(t, "InvalidStateError", 175 createImageBitmap(new Image())); 176 }, "createImageBitmap with empty image source."); 177 178 promise_test( t => { 179 return promise_rejects_dom(t, "InvalidStateError", 180 createImageBitmap(document.createElement('video'))); 181 }, "createImageBitmap with empty video source."); 182 183 promise_test( t => { 184 return makeOversizedCanvas().then(canvas => { 185 return promise_rejects_dom(t, "InvalidStateError", 186 createImageBitmap(canvas)); 187 }); 188 }, "createImageBitmap with an oversized canvas source."); 189 190 promise_test( t => { 191 return makeOversizedOffscreenCanvas().then(offscreenCanvas => { 192 return promise_rejects_dom(t, "InvalidStateError", 193 createImageBitmap(offscreenCanvas)); 194 }); 195 }, "createImageBitmap with an invalid OffscreenCanvas source."); 196 197 promise_test( t => { 198 return makeInvalidBlob().then(blob => { 199 return promise_rejects_dom(t, "InvalidStateError", 200 createImageBitmap(blob)); 201 }); 202 }, "createImageBitmap with an undecodable blob source."); 203 204 promise_test( t => { 205 return makeBrokenImage().then(image => { 206 return promise_rejects_dom(t, "InvalidStateError", 207 createImageBitmap(image)); 208 }); 209 }, "createImageBitmap with a broken image source."); 210 211 promise_test( t => { 212 return makeAvailableButBrokenImage("/images/undecodable.png").then(image => { 213 return promise_rejects_dom(t, "InvalidStateError", 214 createImageBitmap(image)); 215 }); 216 }, "createImageBitmap with an available but undecodable image source."); 217 218 promise_test( t => { 219 return makeAvailableButBrokenImage("/images/red-zeroheight.svg").then(image => { 220 return promise_rejects_dom(t, "InvalidStateError", 221 createImageBitmap(image)); 222 }); 223 }, "createImageBitmap with an available but zero height image source."); 224 225 promise_test( t => { 226 return makeAvailableButBrokenImage("/images/red-zerowidth.svg").then(image => { 227 return promise_rejects_dom(t, "InvalidStateError", 228 createImageBitmap(image)); 229 }); 230 }, "createImageBitmap with an available but zero width image source."); 231 232 promise_test( t => { 233 return makeImageBitmap().then(bitmap => { 234 bitmap.close() 235 return promise_rejects_dom(t, "InvalidStateError", 236 createImageBitmap(bitmap)); 237 }); 238 }, "createImageBitmap with a closed ImageBitmap."); 239 </script>