aboutsummaryrefslogtreecommitdiffstats
path: root/components/net_traits/image_cache_thread.rs
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2016-12-29 14:07:57 -0500
committerJosh Matthews <josh@joshmatthews.net>2017-02-22 14:19:35 -0500
commit980eb5ac33b16d7310d0b5b20d8c3f94b4b2c241 (patch)
treed5da2086eea069c55be666d94985cd3a4e9f574a /components/net_traits/image_cache_thread.rs
parent541ecbfe21d0e79d1eb8b6f197325adc5065b684 (diff)
downloadservo-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.rs22
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))
}