aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlimageelement.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/htmlimageelement.rs')
-rw-r--r--components/script/dom/htmlimageelement.rs60
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.