diff options
Diffstat (limited to 'components/script/dom/htmlimageelement.rs')
-rw-r--r-- | components/script/dom/htmlimageelement.rs | 60 |
1 files changed, 16 insertions, 44 deletions
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index cf6466b1f27..d11cd2ed4de 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -38,13 +38,13 @@ use crate::dom::progressevent::ProgressEvent; use crate::dom::values::UNSIGNED_LONG_MAX; use crate::dom::virtualmethods::VirtualMethods; use crate::dom::window::Window; +use crate::image_listener::{add_cache_listener_for_element, ImageCacheListener}; use crate::microtask::{Microtask, MicrotaskRunnable}; use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; use crate::script_thread::ScriptThread; use crate::task_source::TaskSource; use app_units::{Au, AU_PER_PX}; use cssparser::{Parser, ParserInput}; - use dom_struct::dom_struct; use euclid::Point2D; use html5ever::{LocalName, Prefix}; @@ -167,7 +167,7 @@ struct ImageContext { /// The cache ID for this request. id: PendingImageId, /// Used to mark abort - aborted: Cell<bool>, + aborted: bool, /// The document associated with this request doc: Trusted<Document>, /// timing data for this resource @@ -193,7 +193,7 @@ impl FetchResponseListener for ImageContext { if let Some(ref content_type) = metadata.content_type { let mime: Mime = content_type.clone().into_inner().into(); if mime.type_() == mime::MULTIPART && mime.subtype().as_str() == "x-mixed-replace" { - self.aborted.set(true); + self.aborted = true; } } } @@ -255,51 +255,13 @@ impl ResourceTimingListener for ImageContext { impl PreInvoke for ImageContext { fn should_invoke(&self) -> bool { - !self.aborted.get() + !self.aborted } } impl HTMLImageElement { /// Update the current image with a valid URL. fn fetch_image(&self, img_url: &ServoUrl) { - fn add_cache_listener_for_element( - image_cache: Arc<dyn ImageCache>, - id: PendingImageId, - elem: &HTMLImageElement, - ) { - let trusted_node = Trusted::new(elem); - let (responder_sender, responder_receiver) = ipc::channel().unwrap(); - - let window = window_from_node(elem); - let (task_source, canceller) = window - .task_manager() - .networking_task_source_with_canceller(); - let generation = elem.generation.get(); - ROUTER.add_route( - responder_receiver.to_opaque(), - Box::new(move |message| { - debug!("Got image {:?}", message); - // Return the image via a message to the script thread, which marks - // the element as dirty and triggers a reflow. - let element = trusted_node.clone(); - let image = message.to().unwrap(); - // FIXME(nox): Why are errors silenced here? - let _ = task_source.queue_with_canceller( - task!(process_image_response: move || { - let element = element.root(); - // Ignore any image response for a previous request that has been discarded. - if generation == element.generation.get() { - element.process_image_response(image); - } - }), - &canceller, - ); - }), - ); - - image_cache.add_listener(id, ImageResponder::new(responder_sender, id)); - } - let window = window_from_node(self); let image_cache = window.image_cache(); let response = image_cache.find_image_or_metadata( @@ -317,7 +279,7 @@ impl HTMLImageElement { }, Err(ImageState::Pending(id)) => { - add_cache_listener_for_element(image_cache.clone(), id, self); + add_cache_listener_for_element(image_cache, id, self); }, Err(ImageState::LoadError) => { @@ -339,7 +301,7 @@ impl HTMLImageElement { image_cache: window.image_cache(), status: Ok(()), id: id, - aborted: Cell::new(false), + aborted: false, doc: Trusted::new(&document), resource_timing: ResourceFetchTiming::new(ResourceTimingType::Resource), url: img_url.clone(), @@ -1735,6 +1697,16 @@ impl FormControl for HTMLImageElement { } } +impl ImageCacheListener for HTMLImageElement { + fn generation_id(&self) -> u32 { + self.generation.get() + } + + fn process_image_response(&self, response: ImageResponse) { + self.process_image_response(response); + } +} + fn image_dimension_setter(element: &Element, attr: LocalName, value: u32) { // This setter is a bit weird: the IDL type is unsigned long, but it's parsed as // a dimension for rendering. |