From 980eb5ac33b16d7310d0b5b20d8c3f94b4b2c241 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 29 Dec 2016 14:07:57 -0500 Subject: Avoid dropping image requests on the ground from non-script-initiated reflow. --- components/net_traits/image_cache_thread.rs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'components/net_traits/image_cache_thread.rs') diff --git a/components/net_traits/image_cache_thread.rs b/components/net_traits/image_cache_thread.rs index a000bd8b6bc..481a4f551ea 100644 --- a/components/net_traits/image_cache_thread.rs +++ b/components/net_traits/image_cache_thread.rs @@ -79,7 +79,10 @@ pub enum ImageOrMetadataAvailable { pub enum ImageCacheCommand { /// Synchronously check the state of an image in the cache. If the image is in a loading /// state and but its metadata has been made available, it will be sent as a response. - GetImageOrMetadataIfAvailable(ServoUrl, UsePlaceholder, IpcSender>), + GetImageOrMetadataIfAvailable(ServoUrl, + UsePlaceholder, + CanRequestImages, + IpcSender>), /// Add a new listener for the given pending image. AddListener(PendingImageId, ImageResponder), @@ -98,6 +101,15 @@ pub enum UsePlaceholder { Yes, } +/// Whether a consumer is in a position to request images or not. This can occur when +/// animations are being processed by the layout thread while the script thread is executing +/// in parallel. +#[derive(Copy, Clone, PartialEq, Deserialize, Serialize)] +pub enum CanRequestImages { + No, + Yes, +} + /// The client side of the image cache thread. This can be safely cloned /// and passed to different threads. #[derive(Clone, Deserialize, Serialize)] @@ -120,10 +132,14 @@ impl ImageCacheThread { /// FIXME: We shouldn't do IPC for data uris! pub fn find_image_or_metadata(&self, url: ServoUrl, - use_placeholder: UsePlaceholder) + use_placeholder: UsePlaceholder, + can_request: CanRequestImages) -> Result { let (sender, receiver) = ipc::channel().unwrap(); - let msg = ImageCacheCommand::GetImageOrMetadataIfAvailable(url, use_placeholder, sender); + let msg = ImageCacheCommand::GetImageOrMetadataIfAvailable(url, + use_placeholder, + can_request, + sender); let _ = self.chan.send(msg); try!(receiver.recv().map_err(|_| ImageState::LoadError)) } -- cgit v1.2.3