@@ -51,7 +51,7 @@ pub struct LayoutContext<'a> {
51
51
// A cache that maps image resources used in CSS (e.g as the `url()` value
52
52
// for `background-image` or `content` property) to the final resolved image data.
53
53
pub resolved_images_cache :
54
- Arc < RwLock < FnvHashMap < ( ServoUrl , UsePlaceholder ) , Option < CachedImage > > > > ,
54
+ Arc < RwLock < FnvHashMap < ( ServoUrl , UsePlaceholder ) , Result < CachedImage , ResolveImageError > > > > ,
55
55
56
56
pub node_image_animation_map : Arc < RwLock < FxHashMap < OpaqueNode , ImageAnimationState > > > ,
57
57
@@ -83,7 +83,7 @@ impl Drop for LayoutContext<'_> {
83
83
}
84
84
}
85
85
86
- #[ derive( Debug ) ]
86
+ #[ derive( Copy , Clone , Debug ) ]
87
87
pub enum ResolveImageError {
88
88
LoadError ,
89
89
ImagePending ,
@@ -108,7 +108,7 @@ impl LayoutContext<'_> {
108
108
node : OpaqueNode ,
109
109
url : ServoUrl ,
110
110
use_placeholder : UsePlaceholder ,
111
- ) -> Result < ImageOrMetadataAvailable , ResolveImageError > {
111
+ ) -> Result < Option < ImageOrMetadataAvailable > , ( ) > {
112
112
// Check for available image or start tracking.
113
113
let cache_result = self . image_cache . get_cached_image_status (
114
114
url. clone ( ) ,
@@ -118,7 +118,7 @@ impl LayoutContext<'_> {
118
118
) ;
119
119
120
120
match cache_result {
121
- ImageCacheResult :: Available ( img_or_meta) => Ok ( img_or_meta) ,
121
+ ImageCacheResult :: Available ( img_or_meta) => Ok ( Some ( img_or_meta) ) ,
122
122
// Image has been requested, is still pending. Return no image for this paint loop.
123
123
// When the image loads it will trigger a reflow and/or repaint.
124
124
ImageCacheResult :: Pending ( id) => {
@@ -129,7 +129,7 @@ impl LayoutContext<'_> {
129
129
origin : self . origin . clone ( ) ,
130
130
} ;
131
131
self . pending_images . lock ( ) . push ( image) ;
132
- Result :: Err ( ResolveImageError :: ImagePending )
132
+ Ok ( None )
133
133
} ,
134
134
// Not yet requested - request image or metadata from the cache
135
135
ImageCacheResult :: ReadyForRequest ( id) => {
@@ -140,10 +140,10 @@ impl LayoutContext<'_> {
140
140
origin : self . origin . clone ( ) ,
141
141
} ;
142
142
self . pending_images . lock ( ) . push ( image) ;
143
- Result :: Err ( ResolveImageError :: ImageRequested )
143
+ Ok ( None )
144
144
} ,
145
145
// Image failed to load, so just return nothing
146
- ImageCacheResult :: LoadError => Result :: Err ( ResolveImageError :: LoadError ) ,
146
+ ImageCacheResult :: LoadError => Result :: Err ( ( ) ) ,
147
147
}
148
148
}
149
149
@@ -178,26 +178,31 @@ impl LayoutContext<'_> {
178
178
. read ( )
179
179
. get ( & ( url. clone ( ) , use_placeholder) )
180
180
{
181
- return cached_image
182
- . as_ref ( )
183
- . map_or ( Err ( ResolveImageError :: LoadError ) , |image| Ok ( image. clone ( ) ) ) ;
181
+ return cached_image. clone ( ) ;
184
182
}
185
183
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, .. } ) ) => {
190
187
if let Some ( image) = image. as_raster_image ( ) {
191
188
self . handle_animated_image ( node, image. clone ( ) ) ;
192
189
}
193
190
194
191
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 ( ) ) ) ;
196
193
Ok ( image)
197
194
} ,
198
- ImageOrMetadataAvailable :: MetadataAvailable ( ..) => {
195
+ Ok ( Some ( ImageOrMetadataAvailable :: MetadataAvailable ( ..) ) ) => {
199
196
Result :: Err ( ResolveImageError :: OnlyMetadata )
200
197
} ,
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
+ } ,
201
206
}
202
207
}
203
208
0 commit comments