From add8c51f4728fbafe56781670f9ae4b1a754e094 Mon Sep 17 00:00:00 2001 From: Barigbue Nbira Date: Fri, 18 Apr 2025 21:01:26 +0100 Subject: [PATCH] Prevent multiple notifications for image dimensions (#36600) Added a simple check to only perform metadata extraction and listener notification when we haven't already processed the metadata for an image Testing: Existing tests should cover if we break decoding image metadata complete. Fixes: #36502 --------- Signed-off-by: Barigbue Co-authored-by: Josh Matthews --- components/net/image_cache.rs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/components/net/image_cache.rs b/components/net/image_cache.rs index 55a2c86cae8..eab2f9c08fe 100644 --- a/components/net/image_cache.rs +++ b/components/net/image_cache.rs @@ -608,16 +608,18 @@ impl ImageCache for ImageCacheImpl { pending_load.bytes.extend_from_slice(&data); //jmr0 TODO: possibly move to another task? - let mut reader = std::io::Cursor::new(pending_load.bytes.as_slice()); - if let Ok(info) = imsz_from_reader(&mut reader) { - let img_metadata = ImageMetadata { - width: info.width as u32, - height: info.height as u32, - }; - for listener in &pending_load.listeners { - listener.respond(ImageResponse::MetadataLoaded(img_metadata.clone())); + if pending_load.metadata.is_none() { + let mut reader = std::io::Cursor::new(pending_load.bytes.as_slice()); + if let Ok(info) = imsz_from_reader(&mut reader) { + let img_metadata = ImageMetadata { + width: info.width as u32, + height: info.height as u32, + }; + for listener in &pending_load.listeners { + listener.respond(ImageResponse::MetadataLoaded(img_metadata.clone())); + } + pending_load.metadata = Some(img_metadata); } - pending_load.metadata = Some(img_metadata); } }, (FetchResponseMsg::ProcessResponseEOF(_, result), key) => {