diff --git a/src/lib/missing-types.d.ts b/src/lib/missing-types.d.ts index 7a6a87b5..1bc4ed1a 100644 --- a/src/lib/missing-types.d.ts +++ b/src/lib/missing-types.d.ts @@ -1,5 +1,5 @@ interface HTMLImageElement { - decode: () => Promise | undefined; + decode: (() => Promise) | undefined; } interface CanvasRenderingContext2D { diff --git a/src/lib/util.ts b/src/lib/util.ts index a42aa14c..518f8d59 100644 --- a/src/lib/util.ts +++ b/src/lib/util.ts @@ -90,18 +90,20 @@ export async function blobToImg(blob: Blob): Promise { const img = new Image(); img.decoding = 'async'; img.src = url; + const loaded = new Promise((resolve, reject) => { + img.onload = () => resolve(); + img.onerror = () => reject(Error('Image loading error')); + }); if (img.decode) { - // Nice off-thread way supported in at least Safari. - await img.decode(); - } else { - // Main thread decoding :( - await new Promise((resolve, reject) => { - img.onload = () => resolve(); - img.onerror = () => reject(Error('Image loading error')); - }); + // Nice off-thread way supported in Safari/Chrome. + // Safari throws on decode if the source is SVG. + // https://bugs.webkit.org/show_bug.cgi?id=188347 + await img.decode().catch(() => null); } + // Always await loaded, as we may have bailed due to the Safari bug above. + await loaded; return img; } finally { URL.revokeObjectURL(url);