diff options
author | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2018-09-21 12:58:03 +0200 |
---|---|---|
committer | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2018-10-08 16:12:03 +0200 |
commit | f4ba7e503bfa89805950e29cd9bd729e99264bda (patch) | |
tree | cfc3b48bd5ae10dd661255b006e5c24f7d9339dc /components | |
parent | 6904535865c3d7edebfdfc5919bc9207013d4cf8 (diff) | |
download | servo-f4ba7e503bfa89805950e29cd9bd729e99264bda.tar.gz servo-f4ba7e503bfa89805950e29cd9bd729e99264bda.zip |
Media element duration param
Diffstat (limited to 'components')
-rw-r--r-- | components/atoms/static_atoms.txt | 1 | ||||
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 35 | ||||
-rw-r--r-- | components/script/dom/htmlvideoelement.rs | 2 | ||||
-rw-r--r-- | components/script/dom/webidls/HTMLMediaElement.webidl | 2 |
4 files changed, 30 insertions, 10 deletions
diff --git a/components/atoms/static_atoms.txt b/components/atoms/static_atoms.txt index 151ad41d914..4281c7004d0 100644 --- a/components/atoms/static_atoms.txt +++ b/components/atoms/static_atoms.txt @@ -18,6 +18,7 @@ cursive date datetime-local dir +durationchange email emptied ended diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 605b6cd8a99..4dd589d937e 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -49,6 +49,7 @@ use servo_media::ServoMedia; use servo_url::ServoUrl; use std::cell::Cell; use std::collections::VecDeque; +use std::f64; use std::mem; use std::rc::Rc; use std::sync::{Arc, Mutex}; @@ -165,6 +166,8 @@ pub struct HTMLMediaElement { fetch_canceller: DomRefCell<FetchCanceller>, /// https://html.spec.whatwg.org/multipage/media.html#show-poster-flag 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> @@ -211,6 +214,7 @@ impl HTMLMediaElement { Arc::new(Mutex::new(MediaFrameRenderer::new(document.window().get_webrender_api_sender()))), fetch_canceller: DomRefCell::new(Default::default()), show_poster: Cell::new(true), + duration: Cell::new(f64::NAN), } } @@ -838,7 +842,7 @@ impl HTMLMediaElement { // FIXME(nox): Set timeline offset to NaN. // Step 6.10. - // FIXME(nox): Set duration to NaN. + self.duration.set(f64::NAN); } // Step 7. @@ -968,7 +972,18 @@ impl HTMLMediaElement { // to the earliest possible position. // 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. if self.is::<HTMLVideoElement>() { @@ -976,19 +991,16 @@ impl HTMLMediaElement { let video_elem = self.downcast::<HTMLVideoElement>().unwrap(); video_elem.set_video_width(metadata.width); video_elem.set_video_height(metadata.height); - let window = window_from_node(self); - window.dom_manipulation_task_source().queue_simple_event( + task_source.queue_simple_event( self.upcast(), atom!("resize"), &window, ); } - if let Some(_dur) = metadata.duration { - // Step 6. - self.change_ready_state(ReadyState::HaveMetadata); - self.have_metadata.set(true); - } + // Step 6. + self.change_ready_state(ReadyState::HaveMetadata); + self.have_metadata.set(true); } else { // => set the element's delaying-the-load-event flag to false self.change_ready_state(ReadyState::HaveCurrentData); @@ -1104,6 +1116,11 @@ impl HTMLMediaElementMethods for HTMLMediaElement { fn Paused(&self) -> bool { 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 { diff --git a/components/script/dom/htmlvideoelement.rs b/components/script/dom/htmlvideoelement.rs index 5ce8d941b61..142887a855e 100644 --- a/components/script/dom/htmlvideoelement.rs +++ b/components/script/dom/htmlvideoelement.rs @@ -15,7 +15,9 @@ use std::cell::Cell; #[dom_struct] pub struct HTMLVideoElement { htmlmediaelement: HTMLMediaElement, + /// https://html.spec.whatwg.org/multipage/media.html#dom-video-videowidth video_width: Cell<u32>, + /// https://html.spec.whatwg.org/multipage/media.html#dom-video-videoheight video_height: Cell<u32>, } diff --git a/components/script/dom/webidls/HTMLMediaElement.webidl b/components/script/dom/webidls/HTMLMediaElement.webidl index b67a5e3c1fe..e00b1de7c4f 100644 --- a/components/script/dom/webidls/HTMLMediaElement.webidl +++ b/components/script/dom/webidls/HTMLMediaElement.webidl @@ -39,7 +39,7 @@ interface HTMLMediaElement : HTMLElement { // playback state // attribute double currentTime; // void fastSeek(double time); - // readonly attribute unrestricted double duration; + readonly attribute unrestricted double duration; // Date getStartDate(); readonly attribute boolean paused; // attribute double defaultPlaybackRate; |