aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2018-09-21 12:58:03 +0200
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2018-10-08 16:12:03 +0200
commitf4ba7e503bfa89805950e29cd9bd729e99264bda (patch)
treecfc3b48bd5ae10dd661255b006e5c24f7d9339dc /components
parent6904535865c3d7edebfdfc5919bc9207013d4cf8 (diff)
downloadservo-f4ba7e503bfa89805950e29cd9bd729e99264bda.tar.gz
servo-f4ba7e503bfa89805950e29cd9bd729e99264bda.zip
Media element duration param
Diffstat (limited to 'components')
-rw-r--r--components/atoms/static_atoms.txt1
-rw-r--r--components/script/dom/htmlmediaelement.rs35
-rw-r--r--components/script/dom/htmlvideoelement.rs2
-rw-r--r--components/script/dom/webidls/HTMLMediaElement.webidl2
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;