mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Implement HTMLMediaElement poster attribute
This commit is contained in:
parent
b49e7517a3
commit
5c5b5aae0f
8 changed files with 383 additions and 60 deletions
|
@ -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};
|
||||
|
@ -262,44 +262,6 @@ impl PreInvoke for ImageContext {
|
|||
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) => {
|
||||
|
@ -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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue