aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlmediaelement.rs
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2018-11-02 10:07:12 +0100
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2018-11-21 09:42:53 +0100
commitf98da2e7b73885888b211736d4f7582511c9016a (patch)
treee3184dc991566fae89b8c07f15b28818129981c4 /components/script/dom/htmlmediaelement.rs
parent5da10694912fa43b673f74445f4f249eaf46b451 (diff)
downloadservo-f98da2e7b73885888b211736d4f7582511c9016a.tar.gz
servo-f98da2e7b73885888b211736d4f7582511c9016a.zip
HTMLMediaElement playing attribute
Diffstat (limited to 'components/script/dom/htmlmediaelement.rs')
-rw-r--r--components/script/dom/htmlmediaelement.rs17
1 files changed, 16 insertions, 1 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index b5cc9d9b1fd..bfc51227dc5 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -33,6 +33,7 @@ use crate::dom::mediaerror::MediaError;
use crate::dom::node::{document_from_node, window_from_node, Node, NodeDamage, UnbindContext};
use crate::dom::performanceresourcetiming::InitiatorType;
use crate::dom::promise::Promise;
+use crate::dom::timeranges::{TimeRanges, TimeRangesContainer};
use crate::dom::virtualmethods::VirtualMethods;
use crate::fetch::FetchCanceller;
use crate::microtask::{Microtask, MicrotaskRunnable};
@@ -182,6 +183,9 @@ pub struct HTMLMediaElement {
seeking: Cell<bool>,
/// URL of the media resource, if any.
resource_url: DomRefCell<Option<ServoUrl>>,
+ /// https://html.spec.whatwg.org/multipage/#dom-media-played
+ #[ignore_malloc_size_of = "Rc"]
+ played: Rc<DomRefCell<TimeRangesContainer>>,
}
/// <https://html.spec.whatwg.org/multipage/#dom-media-networkstate>
@@ -233,6 +237,7 @@ impl HTMLMediaElement {
default_playback_start_position: Cell::new(0.),
seeking: Cell::new(false),
resource_url: DomRefCell::new(None),
+ played: Rc::new(DomRefCell::new(TimeRangesContainer::new())),
}
}
@@ -1186,7 +1191,12 @@ impl HTMLMediaElement {
// XXX Steps 12 and 13 require audio and video tracks support.
},
PlayerEvent::PositionChanged(position) => {
- self.playback_position.set(position as f64);
+ let position = position as f64;
+ let _ = self
+ .played
+ .borrow_mut()
+ .add(self.playback_position.get(), position);
+ self.playback_position.set(position);
},
PlayerEvent::StateChanged(ref state) => match *state {
PlaybackState::Paused => {
@@ -1356,6 +1366,11 @@ impl HTMLMediaElementMethods for HTMLMediaElement {
fn FastSeek(&self, time: Finite<f64>) {
self.seek(*time, /* approximat_for_speed */ true);
}
+
+ // https://html.spec.whatwg.org/multipage/#dom-media-played
+ fn Played(&self) -> DomRoot<TimeRanges> {
+ TimeRanges::new(self.global().as_window(), self.played.clone())
+ }
}
impl VirtualMethods for HTMLMediaElement {