diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-01-17 11:46:48 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-17 11:46:48 -0500 |
commit | 866fd55ded6ded98b49862a29951d746a7846f64 (patch) | |
tree | e8ef5aa22f7496cfa90cbabcc6ba7fb0bb2ed727 /components/script/dom | |
parent | 0b5ca81f4105fcce7ebbe6a825893faadb304a9b (diff) | |
parent | 4b23c631ea9210fab34bb66d3edce9f63d5f99d1 (diff) | |
download | servo-866fd55ded6ded98b49862a29951d746a7846f64.tar.gz servo-866fd55ded6ded98b49862a29951d746a7846f64.zip |
Auto merge of #22692 - ferjm:buffering, r=ceyusa
Media cache and buffering support
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #22055 and fix #22296
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/22692)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 17 | ||||
-rw-r--r-- | components/script/dom/timeranges.rs | 23 | ||||
-rw-r--r-- | components/script/dom/webidls/HTMLMediaElement.webidl | 2 |
3 files changed, 21 insertions, 21 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index b38c0e9255f..97170befaf1 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -203,7 +203,7 @@ pub struct HTMLMediaElement { resource_url: DomRefCell<Option<ServoUrl>>, /// https://html.spec.whatwg.org/multipage/#dom-media-played #[ignore_malloc_size_of = "Rc"] - played: Rc<DomRefCell<TimeRangesContainer>>, + played: DomRefCell<TimeRangesContainer>, /// https://html.spec.whatwg.org/multipage/#dom-media-texttracks text_tracks_list: MutNullableDom<TextTrackList>, /// Time of last timeupdate notification. @@ -264,7 +264,7 @@ impl HTMLMediaElement { volume: Cell::new(1.0), seeking: Cell::new(false), resource_url: DomRefCell::new(None), - played: Rc::new(DomRefCell::new(TimeRangesContainer::new())), + played: DomRefCell::new(TimeRangesContainer::new()), text_tracks_list: Default::default(), next_timeupdate_event: Cell::new(time::get_time() + Duration::milliseconds(250)), current_fetch_context: DomRefCell::new(None), @@ -1654,7 +1654,18 @@ impl HTMLMediaElementMethods for HTMLMediaElement { // https://html.spec.whatwg.org/multipage/#dom-media-played fn Played(&self) -> DomRoot<TimeRanges> { - TimeRanges::new(self.global().as_window(), self.played.clone()) + TimeRanges::new(self.global().as_window(), self.played.borrow().clone()) + } + + // https://html.spec.whatwg.org/multipage/#dom-media-buffered + fn Buffered(&self) -> DomRoot<TimeRanges> { + let mut buffered = TimeRangesContainer::new(); + if let Ok(ranges) = self.player.buffered() { + for range in ranges { + let _ = buffered.add(range.start as f64, range.end as f64); + } + } + TimeRanges::new(self.global().as_window(), buffered) } // https://html.spec.whatwg.org/multipage/#dom-media-texttracks diff --git a/components/script/dom/timeranges.rs b/components/script/dom/timeranges.rs index c82daac23a7..7b4d1978a60 100644 --- a/components/script/dom/timeranges.rs +++ b/components/script/dom/timeranges.rs @@ -2,7 +2,6 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::TimeRangesBinding; use crate::dom::bindings::codegen::Bindings::TimeRangesBinding::TimeRangesMethods; use crate::dom::bindings::error::{Error, Fallible}; @@ -12,9 +11,8 @@ use crate::dom::bindings::root::DomRoot; use crate::dom::window::Window; use dom_struct::dom_struct; use std::fmt; -use std::rc::Rc; -#[derive(JSTraceable, MallocSizeOf)] +#[derive(Clone, JSTraceable, MallocSizeOf)] struct TimeRange { start: f64, end: f64, @@ -57,7 +55,7 @@ pub enum TimeRangesError { OutOfRange, } -#[derive(Debug, JSTraceable, MallocSizeOf)] +#[derive(Clone, Debug, JSTraceable, MallocSizeOf)] pub struct TimeRangesContainer { ranges: Vec<TimeRange>, } @@ -128,25 +126,18 @@ impl TimeRangesContainer { #[dom_struct] pub struct TimeRanges { reflector_: Reflector, - #[ignore_malloc_size_of = "Rc"] - ranges: Rc<DomRefCell<TimeRangesContainer>>, + ranges: TimeRangesContainer, } -//XXX(ferjm) We'll get warnings about unused methods until we use this -// on the media element implementation. -#[allow(dead_code)] impl TimeRanges { - fn new_inherited(ranges: Rc<DomRefCell<TimeRangesContainer>>) -> TimeRanges { + fn new_inherited(ranges: TimeRangesContainer) -> TimeRanges { Self { reflector_: Reflector::new(), ranges, } } - pub fn new( - window: &Window, - ranges: Rc<DomRefCell<TimeRangesContainer>>, - ) -> DomRoot<TimeRanges> { + pub fn new(window: &Window, ranges: TimeRangesContainer) -> DomRoot<TimeRanges> { reflect_dom_object( Box::new(TimeRanges::new_inherited(ranges)), window, @@ -158,13 +149,12 @@ impl TimeRanges { impl TimeRangesMethods for TimeRanges { // https://html.spec.whatwg.org/multipage/#dom-timeranges-length fn Length(&self) -> u32 { - self.ranges.borrow().len() + self.ranges.len() } // https://html.spec.whatwg.org/multipage/#dom-timeranges-start fn Start(&self, index: u32) -> Fallible<Finite<f64>> { self.ranges - .borrow() .start(index) .map(Finite::wrap) .map_err(|_| Error::IndexSize) @@ -173,7 +163,6 @@ impl TimeRangesMethods for TimeRanges { // https://html.spec.whatwg.org/multipage/#dom-timeranges-end fn End(&self, index: u32) -> Fallible<Finite<f64>> { self.ranges - .borrow() .end(index) .map(Finite::wrap) .map_err(|_| Error::IndexSize) diff --git a/components/script/dom/webidls/HTMLMediaElement.webidl b/components/script/dom/webidls/HTMLMediaElement.webidl index d083b80ffff..0acd2a2c9a6 100644 --- a/components/script/dom/webidls/HTMLMediaElement.webidl +++ b/components/script/dom/webidls/HTMLMediaElement.webidl @@ -23,7 +23,7 @@ interface HTMLMediaElement : HTMLElement { const unsigned short NETWORK_NO_SOURCE = 3; readonly attribute unsigned short networkState; [CEReactions] attribute DOMString preload; - // readonly attribute TimeRanges buffered; + readonly attribute TimeRanges buffered; void load(); CanPlayTypeResult canPlayType(DOMString type); |