@@ -204,135 +204,132 @@ const ResourceLoader = (() => {
204204 }
205205 } ;
206206
207- switch ( fileType ) {
208- case "js" :
209- element = document . createElement ( "script" ) ;
210- element . src = finalUrl ;
211- element . async = true ;
212- if ( crossorigin ) {
213- element . crossOrigin = crossorigin ;
214- }
215- break ;
216- case "css" :
217- element = document . createElement ( "link" ) ;
218- element . href = finalUrl ;
219- element . rel = "stylesheet" ;
220- if ( crossorigin ) {
221- element . crossOrigin = crossorigin ;
222- }
223- break ;
224- case "json" :
225- fetch ( finalUrl , { signal } )
226- . then ( ( response ) => response . json ( ) )
227- . then ( ( data ) => {
228- if ( ! timedOut ) {
229- resourceStates [ url ] = "loaded" ;
230- resolve ( data ) ;
207+ switch ( fileType ) {
208+ case "js" :
209+ element = document . createElement ( "script" ) ;
210+ element . src = finalUrl ;
211+ element . async = true ;
212+ if ( crossorigin ) {
213+ element . crossOrigin = crossorigin ;
231214 }
232- } )
233- . catch ( ( error ) => {
234- const categorizedError = categorizeError (
235- error ,
236- fileType ,
237- finalUrl
238- ) ;
239- reject ( categorizedError ) ;
240- if ( onError ) onError ( categorizedError ) ;
241- if ( retryCount < retries ) {
242- log ( `Retrying to load resource: ${ finalUrl } ` , "warn" ) ;
243- setTimeout (
244- ( ) => loadResource ( url , retryCount + 1 ) ,
245- retryDelay
246- ) ;
215+ break ;
216+ case "css" :
217+ element = document . createElement ( "link" ) ;
218+ element . href = finalUrl ;
219+ element . rel = "stylesheet" ;
220+ if ( crossorigin ) {
221+ element . crossOrigin = crossorigin ;
247222 }
248- } ) ;
249- cancel = ( ) => controller . abort ( ) ;
250- return ;
251- case "jpg" :
252- case "jpeg" :
253- case "png" :
254- case "gif" :
255- case "svg" :
256- element = document . createElement ( "img" ) ;
257- element . src = finalUrl ;
258- if ( crossorigin ) {
259- element . crossOrigin = crossorigin ;
260- }
261- break ;
262- case "woff" :
263- case "woff2" :
264- const fontFace = new FontFace ( "customFont" , `url(${ finalUrl } )` , {
265- crossOrigin : crossorigin ,
266- } ) ;
267- fontFace
268- . load ( )
269- . then ( ( ) => {
270- if ( ! timedOut ) {
271- document . fonts . add ( fontFace ) ;
272- resourceStates [ url ] = "loaded" ;
273- resolve ( ) ;
223+ break ;
224+ case "json" :
225+ fetch ( finalUrl , { signal } )
226+ . then ( ( response ) => response . json ( ) )
227+ . then ( ( data ) => {
228+ if ( ! timedOut ) {
229+ resourceStates [ url ] = "loaded" ;
230+ resolve ( data ) ;
231+ }
232+ } )
233+ . catch ( ( error ) => {
234+ const categorizedError = categorizeError (
235+ error ,
236+ fileType ,
237+ finalUrl
238+ ) ;
239+ reject ( categorizedError ) ;
240+ if ( onError ) onError ( categorizedError ) ;
241+ if ( retryCount < retries ) {
242+ log ( `Retrying to load resource: ${ finalUrl } ` , "warn" ) ;
243+ setTimeout (
244+ ( ) => loadResource ( url , retryCount + 1 ) ,
245+ retryDelay
246+ ) ;
247+ }
248+ } ) ;
249+ cancel = ( ) => controller . abort ( ) ;
250+ return ;
251+ case "jpg" :
252+ case "jpeg" :
253+ case "png" :
254+ case "gif" :
255+ case "svg" :
256+ element = document . createElement ( "img" ) ;
257+ element . src = finalUrl ;
258+ if ( crossorigin ) {
259+ element . crossOrigin = crossorigin ;
274260 }
275- } )
276- . catch ( ( error ) => {
277- const categorizedError = categorizeError (
278- error ,
279- fileType ,
280- finalUrl
261+ break ;
262+ case "woff" :
263+ case "woff2" :
264+ const fontFace = new FontFace (
265+ "customFont" ,
266+ `url(${ finalUrl } )` ,
267+ {
268+ crossOrigin : crossorigin ,
269+ }
281270 ) ;
282- reject ( categorizedError ) ;
283- if ( onError ) onError ( categorizedError ) ;
284- if ( retryCount < retries ) {
285- log ( `Retrying to load resource: ${ finalUrl } ` , "warn" ) ;
286- setTimeout (
287- ( ) => loadResource ( url , retryCount + 1 ) ,
288- retryDelay
289- ) ;
290- }
291- } ) ;
292- return ;
293- case "pdf" :
294- case "zip" :
295- case "bin" :
296- fetch ( finalUrl , { signal } )
297- . then ( ( response ) => response . blob ( ) )
298- . then ( ( data ) => {
299- if ( ! timedOut ) {
300- resourceStates [ url ] = "loaded" ;
301- resolve ( data ) ;
302- }
303- } )
304- . catch ( ( error ) => {
305- const categorizedError = categorizeError (
306- error ,
307- fileType ,
308- finalUrl
271+ fontFace
272+ . load ( )
273+ . then ( ( ) => {
274+ if ( ! timedOut ) {
275+ document . fonts . add ( fontFace ) ;
276+ resourceStates [ url ] = "loaded" ;
277+ resolve ( ) ;
278+ }
279+ } )
280+ . catch ( ( error ) => {
281+ const categorizedError = categorizeError (
282+ error ,
283+ fileType ,
284+ finalUrl
285+ ) ;
286+ reject ( categorizedError ) ;
287+ if ( onError ) onError ( categorizedError ) ;
288+ if ( retryCount < retries ) {
289+ log ( `Retrying to load resource: ${ finalUrl } ` , "warn" ) ;
290+ setTimeout (
291+ ( ) => loadResource ( url , retryCount + 1 ) ,
292+ retryDelay
293+ ) ;
294+ }
295+ } ) ;
296+ return ;
297+ case "pdf" :
298+ case "zip" :
299+ case "bin" :
300+ fetch ( finalUrl , { signal } )
301+ . then ( ( response ) => response . blob ( ) )
302+ . then ( ( data ) => {
303+ if ( ! timedOut ) {
304+ resourceStates [ url ] = "loaded" ;
305+ resolve ( data ) ;
306+ }
307+ } )
308+ . catch ( ( error ) => {
309+ const categorizedError = categorizeError (
310+ error ,
311+ fileType ,
312+ finalUrl
313+ ) ;
314+ reject ( categorizedError ) ;
315+ if ( onError ) onError ( categorizedError ) ;
316+ if ( retryCount < retries ) {
317+ log ( `Retrying to load resource: ${ finalUrl } ` , "warn" ) ;
318+ setTimeout (
319+ ( ) => loadResource ( url , retryCount + 1 ) ,
320+ retryDelay
321+ ) ;
322+ }
323+ } ) ;
324+ cancel = ( ) => controller . abort ( ) ;
325+ return ;
326+ default :
327+ reject ( new Error ( `Unsupported file type: ${ fileType } ` ) ) ;
328+ log (
329+ `Failed to load unsupported file type: ${ finalUrl } ` ,
330+ "error"
309331 ) ;
310- reject ( categorizedError ) ;
311- if ( onError ) onError ( categorizedError ) ;
312- if ( retryCount < retries ) {
313- log ( `Retrying to load resource: ${ finalUrl } ` , "warn" ) ;
314- setTimeout (
315- ( ) => loadResource ( url , retryCount + 1 ) ,
316- retryDelay
317- ) ;
318- }
319- } ) ;
320- cancel = ( ) => controller . abort ( ) ;
321- return ;
322- default :
323- const unsupportedError = categorizeError (
324- new Error ( "Unsupported file type" ) ,
325- fileType ,
326- finalUrl
327- ) ;
328- reject ( unsupportedError ) ;
329- if ( onError ) onError ( unsupportedError ) ;
330- if ( retryCount < retries ) {
331- log ( `Retrying to load resource: ${ finalUrl } ` , "warn" ) ;
332- setTimeout ( ( ) => loadResource ( url , retryCount + 1 ) , retryDelay ) ;
333332 }
334- return ;
335- }
336333
337334 applyAttributes ( element , attributes , fileType ) ;
338335 startedLoading = true ;
@@ -341,9 +338,19 @@ const ResourceLoader = (() => {
341338 element . onload = ( ) => {
342339 if ( ! timedOut ) {
343340 clearTimeout ( timeoutId ) ;
344- log ( `Resource loaded from: ${ finalUrl } ` , "verbose" ) ;
345- resourceStates [ url ] = "loaded" ;
346- resolve ( ) ; // Make sure resolve is correctly called here
341+
342+ // Check if resource was really loaded (some resources may trigger onload without being valid)
343+ if (
344+ element . naturalWidth === 0 ||
345+ element . readyState === "complete"
346+ ) {
347+ log ( `Resource loaded from: ${ finalUrl } ` , "verbose" ) ;
348+ resourceStates [ url ] = "loaded" ;
349+ resolve ( ) ;
350+ } else {
351+ log ( `Failed to load resource from: ${ finalUrl } ` , "error" ) ;
352+ reject ( new Error ( `Failed to load resource: ${ finalUrl } ` ) ) ;
353+ }
347354 }
348355 } ;
349356
@@ -357,7 +364,7 @@ const ResourceLoader = (() => {
357364 fileType ,
358365 finalUrl
359366 ) ;
360- reject ( categorizedError ) ; // Ensure reject is called on error
367+ reject ( categorizedError ) ;
361368 log ( `Failed to load resource from: ${ finalUrl } ` , "warn" ) ;
362369 resourceStates [ url ] = "unloaded" ;
363370 if ( retryCount < retries ) {
0 commit comments