aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/script/dom/htmlmediaelement.rs61
-rw-r--r--components/script/dom/webidls/HTMLMediaElement.webidl2
2 files changed, 56 insertions, 7 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index 8aad0820502..f594608563c 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -16,6 +16,7 @@ use dom::bindings::codegen::InheritTypes::{ElementTypeId, HTMLElementTypeId};
use dom::bindings::codegen::InheritTypes::{HTMLMediaElementTypeId, NodeTypeId};
use dom::bindings::error::{Error, ErrorResult};
use dom::bindings::inheritance::Castable;
+use dom::bindings::num::Finite;
use dom::bindings::refcounted::Trusted;
use dom::bindings::reflector::DomObject;
use dom::bindings::root::{DomRoot, LayoutDom, MutNullableDom};
@@ -161,7 +162,7 @@ pub struct HTMLMediaElement {
#[ignore_malloc_size_of = "promises are hard"]
in_flight_play_promises_queue: DomRefCell<VecDeque<(Box<[Rc<Promise>]>, ErrorResult)>>,
#[ignore_malloc_size_of = "servo_media"]
- player: Box<Player<Error=ServoMediaError>>,
+ player: Box<Player<Error = ServoMediaError>>,
#[ignore_malloc_size_of = "Arc"]
frame_renderer: Arc<Mutex<MediaFrameRenderer>>,
fetch_canceller: DomRefCell<FetchCanceller>,
@@ -169,6 +170,10 @@ pub struct HTMLMediaElement {
show_poster: Cell<bool>,
/// https://html.spec.whatwg.org/multipage/#dom-media-duration
duration: Cell<f64>,
+ /// https://html.spec.whatwg.org/multipage/media.html#official-playback-position
+ playback_position: Cell<f64>,
+ /// https://html.spec.whatwg.org/multipage/media.html#default-playback-start-position
+ default_playback_start_position: Cell<f64>,
}
/// <https://html.spec.whatwg.org/multipage/#dom-media-networkstate>
@@ -216,6 +221,8 @@ impl HTMLMediaElement {
fetch_canceller: DomRefCell::new(Default::default()),
show_poster: Cell::new(true),
duration: Cell::new(f64::NAN),
+ playback_position: Cell::new(0.),
+ default_playback_start_position: Cell::new(0.),
}
}
@@ -961,8 +968,12 @@ impl HTMLMediaElement {
self.media_element_load_algorithm();
}
- // servo media player
- fn setup_media_player(&self) -> Result<(), ServoMediaError>{
+ // https://html.spec.whatwg.org/multipage/#dom-media-seek
+ fn seek(&self, _time: f64, _approximate_for_speed: bool) {
+ // XXX
+ }
+
+ fn setup_media_player(&self) -> Result<(), ServoMediaError> {
let (action_sender, action_receiver) = ipc::channel().unwrap();
self.player.register_event_handler(action_sender)?;
@@ -1004,8 +1015,7 @@ impl HTMLMediaElement {
// XXX(ferjm) Update the timeline offset.
// Step 3.
- // XXX(ferjm) Set the current and official playback positions
- // to the earliest possible position.
+ self.playback_position.set(0.);
// Step 4.
if let Some(duration) = metadata.duration {
@@ -1028,7 +1038,27 @@ impl HTMLMediaElement {
// Step 6.
self.change_ready_state(ReadyState::HaveMetadata);
- // XXX(ferjm) Steps 7 to 13.
+ // Step 7.
+ let mut _jumped = false;
+
+ // Step 8.
+ if self.default_playback_start_position.get() > 0. {
+ self.seek(self.default_playback_start_position.get(), /* approximate_for_speed*/ false);
+ _jumped = true;
+ }
+
+ // Step 9.
+ self.default_playback_start_position.set(0.);
+
+ // Steps 10 and 11.
+ // XXX(ferjm) Implement parser for
+ // https://www.w3.org/TR/media-frags/#media-fragment-syntax
+ // https://github.com/servo/media/issues/156
+
+ // XXX Steps 12 and 13 require audio and video tracks support.
+ },
+ PlayerEvent::PositionChanged(position) => {
+ self.playback_position.set(position as f64);
},
PlayerEvent::StateChanged(ref state) => match *state {
PlaybackState::Paused => {
@@ -1157,6 +1187,25 @@ impl HTMLMediaElementMethods for HTMLMediaElement {
fn Duration(&self) -> f64 {
self.duration.get()
}
+
+ // https://html.spec.whatwg.org/multipage/#dom-media-currenttime
+ fn CurrentTime(&self) -> Finite<f64> {
+ Finite::wrap(if self.default_playback_start_position.get() != 0. {
+ self.default_playback_start_position.get()
+ } else {
+ self.playback_position.get()
+ })
+ }
+
+ // https://html.spec.whatwg.org/multipage/#dom-media-currenttime
+ fn SetCurrentTime(&self, time: Finite<f64>) {
+ if self.ready_state.get() == ReadyState::HaveNothing {
+ self.default_playback_start_position.set(*time);
+ } else {
+ self.playback_position.set(*time);
+ self.seek(*time, /* approximate_for_speed */ false);
+ }
+ }
}
impl VirtualMethods for HTMLMediaElement {
diff --git a/components/script/dom/webidls/HTMLMediaElement.webidl b/components/script/dom/webidls/HTMLMediaElement.webidl
index e00b1de7c4f..a8b9241c54d 100644
--- a/components/script/dom/webidls/HTMLMediaElement.webidl
+++ b/components/script/dom/webidls/HTMLMediaElement.webidl
@@ -37,7 +37,7 @@ interface HTMLMediaElement : HTMLElement {
// readonly attribute boolean seeking;
// playback state
- // attribute double currentTime;
+ attribute double currentTime;
// void fastSeek(double time);
readonly attribute unrestricted double duration;
// Date getStartDate();