diff --git a/application/ui/src/features/annotator/tools/utils.ts b/application/ui/src/features/annotator/tools/utils.ts index 84df1f32d23..4d89cb494b2 100644 --- a/application/ui/src/features/annotator/tools/utils.ts +++ b/application/ui/src/features/annotator/tools/utils.ts @@ -348,22 +348,32 @@ export const getRelativePoint = (element: ElementType, point: Point, zoom: numbe }; }; -export const loadImage = (link: string): Promise => - new Promise((resolve, reject) => { - const image = new Image(); - image.crossOrigin = 'anonymous'; +export const loadImage = async (link: string): Promise => { + // Fetch as blob first to avoid CORS issues with cached images + const response = await fetch(link, { credentials: 'include' }); + if (!response.ok) { + throw new Error(`Failed to load image from ${link}: ${response.status} ${response.statusText}`); + } - image.onload = () => resolve(image); - image.onerror = (error) => reject(error); + const blob = await response.blob(); + const objectUrl = URL.createObjectURL(blob); - image.fetchPriority = 'high'; - image.src = link; + return new Promise((resolve, reject) => { + const image = new Image(); - if (process.env.NODE_ENV === 'test') { - // Immediately load the media item's image + image.onload = () => { + URL.revokeObjectURL(objectUrl); resolve(image); - } + }; + image.onerror = (error) => { + URL.revokeObjectURL(objectUrl); + reject(error); + }; + + image.fetchPriority = 'high'; + image.src = objectUrl; }); +}; const drawImageOnCanvas = (img: HTMLImageElement, filter = ''): HTMLCanvasElement => { const canvas: HTMLCanvasElement = document.createElement('canvas');