diff options
author | Josh Matthews <josh@joshmatthews.net> | 2016-12-29 14:07:57 -0500 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2017-02-22 14:19:35 -0500 |
commit | 980eb5ac33b16d7310d0b5b20d8c3f94b4b2c241 (patch) | |
tree | d5da2086eea069c55be666d94985cd3a4e9f574a /components/net_traits/image_cache_thread.rs | |
parent | 541ecbfe21d0e79d1eb8b6f197325adc5065b684 (diff) | |
download | servo-980eb5ac33b16d7310d0b5b20d8c3f94b4b2c241.tar.gz servo-980eb5ac33b16d7310d0b5b20d8c3f94b4b2c241.zip |
Avoid dropping image requests on the ground from non-script-initiated reflow.
Diffstat (limited to 'components/net_traits/image_cache_thread.rs')
-rw-r--r-- | components/net_traits/image_cache_thread.rs | 22 |
1 files changed, 19 insertions, 3 deletions
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<Result<ImageOrMetadataAvailable, ImageState>>), + GetImageOrMetadataIfAvailable(ServoUrl, + UsePlaceholder, + CanRequestImages, + IpcSender<Result<ImageOrMetadataAvailable, ImageState>>), /// 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<ImageOrMetadataAvailable, ImageState> { 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)) } |