diff options
Diffstat (limited to 'components/layout/context.rs')
-rw-r--r-- | components/layout/context.rs | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/components/layout/context.rs b/components/layout/context.rs index 1374ba175f9..f98f8bc8395 100644 --- a/components/layout/context.rs +++ b/components/layout/context.rs @@ -11,7 +11,7 @@ use gfx::font_cache_thread::FontCacheThread; use gfx::font_context::FontContext; use malloc_size_of::{MallocSizeOf, MallocSizeOfOps}; use msg::constellation_msg::PipelineId; -use net_traits::image_cache::{CanRequestImages, ImageCache, ImageState}; +use net_traits::image_cache::{CanRequestImages, ImageCache, ImageCacheResult}; use net_traits::image_cache::{ImageOrMetadataAvailable, UsePlaceholder}; use parking_lot::RwLock; use script_layout_interface::{PendingImage, PendingImageState}; @@ -122,37 +122,20 @@ impl<'a> LayoutContext<'a> { CanRequestImages::No }; - // See if the image is already available - let result = self.image_cache.find_image_or_metadata( + // Check for available image or start tracking. + let cache_result = self.image_cache.get_cached_image_status( url.clone(), self.origin.clone(), None, use_placeholder, can_request, ); - match result { - Ok(image_or_metadata) => Some(image_or_metadata), - // Image failed to load, so just return nothing - Err(ImageState::LoadError) => None, - // Not yet requested - request image or metadata from the cache - Err(ImageState::NotRequested(id)) => { - let image = PendingImage { - state: PendingImageState::Unrequested(url), - node: node.to_untrusted_node_address(), - id: id, - origin: self.origin.clone(), - }; - self.pending_images - .as_ref() - .unwrap() - .lock() - .unwrap() - .push(image); - None - }, + + match cache_result { + ImageCacheResult::Available(img_or_meta) => Some(img_or_meta), // Image has been requested, is still pending. Return no image for this paint loop. // When the image loads it will trigger a reflow and/or repaint. - Err(ImageState::Pending(id)) => { + ImageCacheResult::Pending(id) => { //XXXjdm if self.pending_images is not available, we should make sure that // this node gets marked dirty again so it gets a script-initiated // reflow that deals with this properly. @@ -160,13 +143,31 @@ impl<'a> LayoutContext<'a> { let image = PendingImage { state: PendingImageState::PendingResponse, node: node.to_untrusted_node_address(), - id: id, + id, origin: self.origin.clone(), }; pending_images.lock().unwrap().push(image); } None }, + // Not yet requested - request image or metadata from the cache + ImageCacheResult::ReadyForRequest(id) => { + let image = PendingImage { + state: PendingImageState::Unrequested(url), + node: node.to_untrusted_node_address(), + id, + origin: self.origin.clone(), + }; + self.pending_images + .as_ref() + .unwrap() + .lock() + .unwrap() + .push(image); + None + }, + // Image failed to load, so just return nothing + ImageCacheResult::LoadError => None, } } |