From 7f77017333735b7a4df72f792c55f8d7e19de8cb Mon Sep 17 00:00:00 2001 From: Peter Velkov Date: Thu, 23 Feb 2023 13:56:58 +0200 Subject: [PATCH] [fix] ImageLoader: ImageUriCache is not kept up to date with loaded images Close #2493 --- .../react-native-web/src/exports/Image/index.js | 2 +- .../src/modules/ImageLoader/index.js | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/react-native-web/src/exports/Image/index.js b/packages/react-native-web/src/exports/Image/index.js index 1862ad6e64..64b7a73276 100644 --- a/packages/react-native-web/src/exports/Image/index.js +++ b/packages/react-native-web/src/exports/Image/index.js @@ -327,7 +327,7 @@ const BaseImage: ImageComponent = React.forwardRef((props, ref) => { function abortPendingRequest() { if (requestRef.current != null) { - ImageLoader.abort(requestRef.current); + ImageLoader.clear(requestRef.current); requestRef.current = null; } } diff --git a/packages/react-native-web/src/modules/ImageLoader/index.js b/packages/react-native-web/src/modules/ImageLoader/index.js index 0d7ceda8ff..db887df6d3 100644 --- a/packages/react-native-web/src/modules/ImageLoader/index.js +++ b/packages/react-native-web/src/modules/ImageLoader/index.js @@ -74,12 +74,13 @@ let id = 0; const requests = {}; const ImageLoader = { - abort(requestId: number) { - let image = requests[`${requestId}`]; + clear(requestId: number) { + const image = requests[`${requestId}`]; if (image) { image.onerror = null; image.onload = null; - image = null; + ImageUriCache.remove(image.src); + image.src = ''; delete requests[`${requestId}`]; } }, @@ -102,7 +103,7 @@ const ImageLoader = { } } if (complete) { - ImageLoader.abort(requestId); + ImageLoader.clear(requestId); clearInterval(interval); } } @@ -111,7 +112,7 @@ const ImageLoader = { if (typeof failure === 'function') { failure(); } - ImageLoader.abort(requestId); + ImageLoader.clear(requestId); clearInterval(interval); } }, @@ -123,6 +124,7 @@ const ImageLoader = { const image = new window.Image(); image.onerror = onError; image.onload = (nativeEvent) => { + ImageUriCache.add(uri); // avoid blocking the main thread const onDecode = () => { // Append `source` to match RN's ImageLoadEvent interface @@ -185,9 +187,8 @@ const ImageLoader = { ImageLoader.load( uri, () => { - // Add the uri to the cache so it can be immediately displayed when used - // but also immediately remove it to correctly reflect that it has no active references - ImageUriCache.add(uri); + // load() adds the uri to the cache so it can be immediately displayed when used, + // but we also immediately remove it to correctly reflect that it has no active references ImageUriCache.remove(uri); resolve(); },