Skip to content

Commit 583d375

Browse files
committed
cache the errors from image_cache during resolution
Signed-off-by: Mukilan Thiyagarajan <[email protected]>
1 parent b91b2a2 commit 583d375

File tree

3 files changed

+27
-21
lines changed

3 files changed

+27
-21
lines changed

components/layout/context.rs

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ pub struct LayoutContext<'a> {
5151
// A cache that maps image resources used in CSS (e.g as the `url()` value
5252
// for `background-image` or `content` property) to the final resolved image data.
5353
pub resolved_images_cache:
54-
Arc<RwLock<FnvHashMap<(ServoUrl, UsePlaceholder), Option<CachedImage>>>>,
54+
Arc<RwLock<FnvHashMap<(ServoUrl, UsePlaceholder), Result<CachedImage, ResolveImageError>>>>,
5555

5656
pub node_image_animation_map: Arc<RwLock<FxHashMap<OpaqueNode, ImageAnimationState>>>,
5757

@@ -83,7 +83,7 @@ impl Drop for LayoutContext<'_> {
8383
}
8484
}
8585

86-
#[derive(Debug)]
86+
#[derive(Copy, Clone, Debug)]
8787
pub enum ResolveImageError {
8888
LoadError,
8989
ImagePending,
@@ -108,7 +108,7 @@ impl LayoutContext<'_> {
108108
node: OpaqueNode,
109109
url: ServoUrl,
110110
use_placeholder: UsePlaceholder,
111-
) -> Result<ImageOrMetadataAvailable, ResolveImageError> {
111+
) -> Result<Option<ImageOrMetadataAvailable>, ()> {
112112
// Check for available image or start tracking.
113113
let cache_result = self.image_cache.get_cached_image_status(
114114
url.clone(),
@@ -118,7 +118,7 @@ impl LayoutContext<'_> {
118118
);
119119

120120
match cache_result {
121-
ImageCacheResult::Available(img_or_meta) => Ok(img_or_meta),
121+
ImageCacheResult::Available(img_or_meta) => Ok(Some(img_or_meta)),
122122
// Image has been requested, is still pending. Return no image for this paint loop.
123123
// When the image loads it will trigger a reflow and/or repaint.
124124
ImageCacheResult::Pending(id) => {
@@ -129,7 +129,7 @@ impl LayoutContext<'_> {
129129
origin: self.origin.clone(),
130130
};
131131
self.pending_images.lock().push(image);
132-
Result::Err(ResolveImageError::ImagePending)
132+
Ok(None)
133133
},
134134
// Not yet requested - request image or metadata from the cache
135135
ImageCacheResult::ReadyForRequest(id) => {
@@ -140,10 +140,10 @@ impl LayoutContext<'_> {
140140
origin: self.origin.clone(),
141141
};
142142
self.pending_images.lock().push(image);
143-
Result::Err(ResolveImageError::ImageRequested)
143+
Ok(None)
144144
},
145145
// Image failed to load, so just return nothing
146-
ImageCacheResult::LoadError => Result::Err(ResolveImageError::LoadError),
146+
ImageCacheResult::LoadError => Result::Err(()),
147147
}
148148
}
149149

@@ -178,26 +178,31 @@ impl LayoutContext<'_> {
178178
.read()
179179
.get(&(url.clone(), use_placeholder))
180180
{
181-
return cached_image
182-
.as_ref()
183-
.map_or(Err(ResolveImageError::LoadError), |image| Ok(image.clone()));
181+
return cached_image.clone();
184182
}
185183

186-
let image_or_meta =
187-
self.get_or_request_image_or_meta(node, url.clone(), use_placeholder)?;
188-
match image_or_meta {
189-
ImageOrMetadataAvailable::ImageAvailable { image, .. } => {
184+
let result = self.get_or_request_image_or_meta(node, url.clone(), use_placeholder);
185+
match result {
186+
Ok(Some(ImageOrMetadataAvailable::ImageAvailable { image, .. })) => {
190187
if let Some(image) = image.as_raster_image() {
191188
self.handle_animated_image(node, image.clone());
192189
}
193190

194191
let mut resolved_images_cache = self.resolved_images_cache.write();
195-
resolved_images_cache.insert((url, use_placeholder), Some(image.clone()));
192+
resolved_images_cache.insert((url, use_placeholder), Ok(image.clone()));
196193
Ok(image)
197194
},
198-
ImageOrMetadataAvailable::MetadataAvailable(..) => {
195+
Ok(Some(ImageOrMetadataAvailable::MetadataAvailable(..))) => {
199196
Result::Err(ResolveImageError::OnlyMetadata)
200197
},
198+
Ok(None) => Result::Err(ResolveImageError::ImagePending),
199+
Err(()) => {
200+
let error = Err(ResolveImageError::LoadError);
201+
self.resolved_images_cache
202+
.write()
203+
.insert((url, use_placeholder), error.clone());
204+
error
205+
},
201206
}
202207
}
203208

components/layout/layout_impl.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ use url::Url;
7676
use webrender_api::units::{DevicePixel, DevicePoint, LayoutPixel, LayoutPoint, LayoutSize};
7777
use webrender_api::{ExternalScrollId, HitTestFlags};
7878

79-
use crate::context::LayoutContext;
79+
use crate::context::{LayoutContext, ResolveImageError};
8080
use crate::display_list::DisplayList;
8181
use crate::query::{
8282
get_the_text_steps, process_client_rect_request, process_content_box_request,
@@ -156,7 +156,8 @@ pub struct LayoutThread {
156156

157157
// A cache that maps image resources used in CSS (e.g as the `url()` value
158158
// for `background-image` or `content` property) to the final resolved image data.
159-
resolved_images_cache: Arc<RwLock<FnvHashMap<(ServoUrl, UsePlaceholder), Option<Image>>>>,
159+
resolved_images_cache:
160+
Arc<RwLock<FnvHashMap<(ServoUrl, UsePlaceholder), Result<Image, ResolveImageError>>>>,
160161

161162
/// The executors for paint worklets.
162163
registered_painters: RegisteredPaintersImpl,

components/layout/replaced.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,18 +195,18 @@ impl ReplacedContents {
195195
image_url.clone().into(),
196196
UsePlaceholder::No,
197197
) {
198-
Ok(ImageOrMetadataAvailable::ImageAvailable { image, .. }) => {
198+
Ok(Some(ImageOrMetadataAvailable::ImageAvailable { image, .. })) => {
199199
let metadata = image.metadata();
200200
(
201201
Some(image.clone()),
202202
metadata.width as f32,
203203
metadata.height as f32,
204204
)
205205
},
206-
Ok(ImageOrMetadataAvailable::MetadataAvailable(metadata, _id)) => {
206+
Ok(Some(ImageOrMetadataAvailable::MetadataAvailable(metadata, _id))) => {
207207
(None, metadata.width as f32, metadata.height as f32)
208208
},
209-
Err(_) => return None,
209+
Ok(None) | Err(_) => return None,
210210
};
211211

212212
return Some(Self {

0 commit comments

Comments
 (0)