Media element duration param

This commit is contained in:
Fernando Jiménez Moreno 2018-09-21 12:58:03 +02:00
parent 6904535865
commit f4ba7e503b
4 changed files with 30 additions and 10 deletions

View file

@ -18,6 +18,7 @@ cursive
date date
datetime-local datetime-local
dir dir
durationchange
email email
emptied emptied
ended ended

View file

@ -49,6 +49,7 @@ use servo_media::ServoMedia;
use servo_url::ServoUrl; use servo_url::ServoUrl;
use std::cell::Cell; use std::cell::Cell;
use std::collections::VecDeque; use std::collections::VecDeque;
use std::f64;
use std::mem; use std::mem;
use std::rc::Rc; use std::rc::Rc;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
@ -165,6 +166,8 @@ pub struct HTMLMediaElement {
fetch_canceller: DomRefCell<FetchCanceller>, fetch_canceller: DomRefCell<FetchCanceller>,
/// https://html.spec.whatwg.org/multipage/media.html#show-poster-flag /// https://html.spec.whatwg.org/multipage/media.html#show-poster-flag
show_poster: Cell<bool>, show_poster: Cell<bool>,
/// https://html.spec.whatwg.org/multipage/media.html#dom-media-duration
duration: Cell<f64>,
} }
/// <https://html.spec.whatwg.org/multipage/#dom-media-networkstate> /// <https://html.spec.whatwg.org/multipage/#dom-media-networkstate>
@ -211,6 +214,7 @@ impl HTMLMediaElement {
Arc::new(Mutex::new(MediaFrameRenderer::new(document.window().get_webrender_api_sender()))), Arc::new(Mutex::new(MediaFrameRenderer::new(document.window().get_webrender_api_sender()))),
fetch_canceller: DomRefCell::new(Default::default()), fetch_canceller: DomRefCell::new(Default::default()),
show_poster: Cell::new(true), show_poster: Cell::new(true),
duration: Cell::new(f64::NAN),
} }
} }
@ -838,7 +842,7 @@ impl HTMLMediaElement {
// FIXME(nox): Set timeline offset to NaN. // FIXME(nox): Set timeline offset to NaN.
// Step 6.10. // Step 6.10.
// FIXME(nox): Set duration to NaN. self.duration.set(f64::NAN);
} }
// Step 7. // Step 7.
@ -968,7 +972,18 @@ impl HTMLMediaElement {
// to the earliest possible position. // to the earliest possible position.
// Step 4. // Step 4.
// XXX(ferjm) Update duration. if let Some(duration) = metadata.duration {
self.duration.set(duration.as_secs() as f64);
} else {
self.duration.set(f64::INFINITY);
}
let window = window_from_node(self);
let task_source = window.dom_manipulation_task_source();
task_source.queue_simple_event(
self.upcast(),
atom!("durationchange"),
&window,
);
// Step 5. // Step 5.
if self.is::<HTMLVideoElement>() { if self.is::<HTMLVideoElement>() {
@ -976,19 +991,16 @@ impl HTMLMediaElement {
let video_elem = self.downcast::<HTMLVideoElement>().unwrap(); let video_elem = self.downcast::<HTMLVideoElement>().unwrap();
video_elem.set_video_width(metadata.width); video_elem.set_video_width(metadata.width);
video_elem.set_video_height(metadata.height); video_elem.set_video_height(metadata.height);
let window = window_from_node(self); task_source.queue_simple_event(
window.dom_manipulation_task_source().queue_simple_event(
self.upcast(), self.upcast(),
atom!("resize"), atom!("resize"),
&window, &window,
); );
} }
if let Some(_dur) = metadata.duration {
// Step 6. // Step 6.
self.change_ready_state(ReadyState::HaveMetadata); self.change_ready_state(ReadyState::HaveMetadata);
self.have_metadata.set(true); self.have_metadata.set(true);
}
} else { } else {
// => set the element's delaying-the-load-event flag to false // => set the element's delaying-the-load-event flag to false
self.change_ready_state(ReadyState::HaveCurrentData); self.change_ready_state(ReadyState::HaveCurrentData);
@ -1104,6 +1116,11 @@ impl HTMLMediaElementMethods for HTMLMediaElement {
fn Paused(&self) -> bool { fn Paused(&self) -> bool {
self.paused.get() self.paused.get()
} }
// https://html.spec.whatwg.org/multipage/media.html#dom-media-duration
fn Duration(&self) -> f64 {
self.duration.get()
}
} }
impl VirtualMethods for HTMLMediaElement { impl VirtualMethods for HTMLMediaElement {

View file

@ -15,7 +15,9 @@ use std::cell::Cell;
#[dom_struct] #[dom_struct]
pub struct HTMLVideoElement { pub struct HTMLVideoElement {
htmlmediaelement: HTMLMediaElement, htmlmediaelement: HTMLMediaElement,
/// https://html.spec.whatwg.org/multipage/media.html#dom-video-videowidth
video_width: Cell<u32>, video_width: Cell<u32>,
/// https://html.spec.whatwg.org/multipage/media.html#dom-video-videoheight
video_height: Cell<u32>, video_height: Cell<u32>,
} }

View file

@ -39,7 +39,7 @@ interface HTMLMediaElement : HTMLElement {
// playback state // playback state
// attribute double currentTime; // attribute double currentTime;
// void fastSeek(double time); // void fastSeek(double time);
// readonly attribute unrestricted double duration; readonly attribute unrestricted double duration;
// Date getStartDate(); // Date getStartDate();
readonly attribute boolean paused; readonly attribute boolean paused;
// attribute double defaultPlaybackRate; // attribute double defaultPlaybackRate;