diff options
author | Iulian Gabriel Radu <iulian.radu67@gmail.com> | 2020-03-08 00:15:20 +0200 |
---|---|---|
committer | Iulian Gabriel Radu <iulian.radu67@gmail.com> | 2020-03-08 00:15:20 +0200 |
commit | 911b1306cac7b3a6d048227ef0bf5de54836aedc (patch) | |
tree | 512ad344a7e3a0e89440ec7430c0017f07a727cc /components/script | |
parent | 30b148c90f77057883e9cfe0b4edd0a6a883a9b6 (diff) | |
download | servo-911b1306cac7b3a6d048227ef0bf5de54836aedc.tar.gz servo-911b1306cac7b3a6d048227ef0bf5de54836aedc.zip |
Add base of VTTCue DOM interface
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/mod.rs | 1 | ||||
-rw-r--r-- | components/script/dom/texttrackcue.rs | 24 | ||||
-rw-r--r-- | components/script/dom/vttcue.rs | 232 | ||||
-rw-r--r-- | components/script/dom/webidls/VTTCue.webidl | 30 |
4 files changed, 279 insertions, 8 deletions
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index 47b9bed795f..0e1b4789ad4 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -538,6 +538,7 @@ pub mod vrfieldofview; pub mod vrframedata; pub mod vrpose; pub mod vrstageparameters; +pub mod vttcue; pub mod vttregion; pub mod webgl_extensions; pub use self::webgl_extensions::ext::*; diff --git a/components/script/dom/texttrackcue.rs b/components/script/dom/texttrackcue.rs index ce55cdf3259..61a07d2cb3c 100644 --- a/components/script/dom/texttrackcue.rs +++ b/components/script/dom/texttrackcue.rs @@ -25,24 +25,32 @@ pub struct TextTrackCue { } impl TextTrackCue { - // FIXME(#22314, dlrobertson) implement VTTCue. - #[allow(dead_code)] - pub fn new_inherited(id: DOMString, track: Option<&TextTrack>) -> TextTrackCue { + pub fn new_inherited( + id: DOMString, + start_time: f64, + end_time: f64, + track: Option<&TextTrack>, + ) -> TextTrackCue { TextTrackCue { eventtarget: EventTarget::new_inherited(), id: DomRefCell::new(id), track: track.map(Dom::from_ref), - start_time: Cell::new(0.), - end_time: Cell::new(0.), + start_time: Cell::new(start_time), + end_time: Cell::new(end_time), pause_on_exit: Cell::new(false), } } - // FIXME(#22314, dlrobertson) implement VTTCue. #[allow(dead_code)] - pub fn new(window: &Window, id: DOMString, track: Option<&TextTrack>) -> DomRoot<TextTrackCue> { + pub fn new( + window: &Window, + id: DOMString, + start_time: f64, + end_time: f64, + track: Option<&TextTrack>, + ) -> DomRoot<TextTrackCue> { reflect_dom_object( - Box::new(TextTrackCue::new_inherited(id, track)), + Box::new(TextTrackCue::new_inherited(id, start_time, end_time, track)), window, TextTrackCueBinding::Wrap, ) diff --git a/components/script/dom/vttcue.rs b/components/script/dom/vttcue.rs new file mode 100644 index 00000000000..82ffb36c473 --- /dev/null +++ b/components/script/dom/vttcue.rs @@ -0,0 +1,232 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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::VTTCueBinding::{ + self, AlignSetting, AutoKeyword, DirectionSetting, LineAlignSetting, PositionAlignSetting, + VTTCueMethods, +}; +use crate::dom::bindings::error::{Error, ErrorResult}; +use crate::dom::bindings::num::Finite; +use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::bindings::str::DOMString; +use crate::dom::documentfragment::DocumentFragment; +use crate::dom::globalscope::GlobalScope; +use crate::dom::texttrackcue::TextTrackCue; +use crate::dom::vttregion::VTTRegion; +use crate::dom::window::Window; +use dom_struct::dom_struct; +use std::cell::Cell; + +#[dom_struct] +pub struct VTTCue { + texttrackcue: TextTrackCue, + region: DomRefCell<Option<Dom<VTTRegion>>>, + vertical: Cell<DirectionSetting>, + snap_to_lines: Cell<bool>, + line: DomRefCell<LineAndPositionSetting>, + line_align: Cell<LineAlignSetting>, + position: DomRefCell<LineAndPositionSetting>, + position_align: Cell<PositionAlignSetting>, + size: Cell<f64>, + align: Cell<AlignSetting>, + text: DomRefCell<DOMString>, +} + +impl VTTCue { + pub fn new_inherited(start_time: f64, end_time: f64, text: DOMString) -> Self { + VTTCue { + texttrackcue: TextTrackCue::new_inherited( + DOMString::default(), + start_time, + end_time, + None, + ), + region: DomRefCell::new(None), + vertical: Cell::new(DirectionSetting::default()), + snap_to_lines: Cell::new(true), + line: DomRefCell::new(LineAndPositionSetting::Auto), + line_align: Cell::new(LineAlignSetting::Start), + position: DomRefCell::new(LineAndPositionSetting::Auto), + position_align: Cell::new(PositionAlignSetting::Auto), + size: Cell::new(100_f64), + align: Cell::new(AlignSetting::Center), + text: DomRefCell::new(text), + } + } + + pub fn new( + global: &GlobalScope, + start_time: f64, + end_time: f64, + text: DOMString, + ) -> DomRoot<Self> { + reflect_dom_object( + Box::new(Self::new_inherited(start_time, end_time, text)), + global, + VTTCueBinding::Wrap, + ) + } + + #[allow(non_snake_case)] + pub fn Constructor( + window: &Window, + start_time: Finite<f64>, + end_time: Finite<f64>, + text: DOMString, + ) -> DomRoot<Self> { + VTTCue::new(&window.global(), *start_time, *end_time, text) + } +} + +impl VTTCueMethods for VTTCue { + // https://w3c.github.io/webvtt/#dom-vttcue-region + fn GetRegion(&self) -> Option<DomRoot<VTTRegion>> { + self.region + .borrow() + .as_ref() + .map(|r| DomRoot::from_ref(&**r)) + } + + // https://w3c.github.io/webvtt/#dom-vttcue-region + fn SetRegion(&self, value: Option<&VTTRegion>) { + *self.region.borrow_mut() = value.map(|r| Dom::from_ref(r)) + } + + // https://w3c.github.io/webvtt/#dom-vttcue-vertical + fn Vertical(&self) -> DirectionSetting { + self.vertical.get() + } + + // https://w3c.github.io/webvtt/#dom-vttcue-vertical + fn SetVertical(&self, value: DirectionSetting) { + self.vertical.set(value); + } + + // https://w3c.github.io/webvtt/#dom-vttcue-snaptolines + fn SnapToLines(&self) -> bool { + self.snap_to_lines.get() + } + + // https://w3c.github.io/webvtt/#dom-vttcue-snaptolines + fn SetSnapToLines(&self, value: bool) { + self.snap_to_lines.set(value) + } + + // https://w3c.github.io/webvtt/#dom-vttcue-line + fn Line(&self) -> VTTCueBinding::LineAndPositionSetting { + VTTCueBinding::LineAndPositionSetting::from(self.line.borrow().clone()) + } + + // https://w3c.github.io/webvtt/#dom-vttcue-line + fn SetLine(&self, value: VTTCueBinding::LineAndPositionSetting) { + *self.line.borrow_mut() = value.into(); + } + + // https://w3c.github.io/webvtt/#dom-vttcue-linealign + fn LineAlign(&self) -> LineAlignSetting { + self.line_align.get() + } + + // https://w3c.github.io/webvtt/#dom-vttcue-linealign + fn SetLineAlign(&self, value: LineAlignSetting) { + self.line_align.set(value); + } + + // https://w3c.github.io/webvtt/#dom-vttcue-position + fn Position(&self) -> VTTCueBinding::LineAndPositionSetting { + VTTCueBinding::LineAndPositionSetting::from(self.position.borrow().clone()) + } + + // https://w3c.github.io/webvtt/#dom-vttcue-position + fn SetPosition(&self, value: VTTCueBinding::LineAndPositionSetting) -> ErrorResult { + if let VTTCueBinding::LineAndPositionSetting::Double(x) = value { + if *x < 0_f64 || *x > 100_f64 { + return Err(Error::IndexSize); + } + } + + *self.position.borrow_mut() = value.into(); + Ok(()) + } + + // https://w3c.github.io/webvtt/#dom-vttcue-positionalign + fn PositionAlign(&self) -> PositionAlignSetting { + self.position_align.get() + } + + // https://w3c.github.io/webvtt/#dom-vttcue-positionalign + fn SetPositionAlign(&self, value: PositionAlignSetting) { + self.position_align.set(value); + } + + // https://w3c.github.io/webvtt/#dom-vttcue-size + fn Size(&self) -> Finite<f64> { + Finite::wrap(self.size.get()) + } + + // https://w3c.github.io/webvtt/#dom-vttcue-size + fn SetSize(&self, value: Finite<f64>) -> ErrorResult { + if *value < 0_f64 || *value > 100_f64 { + return Err(Error::IndexSize); + } + + self.size.set(*value); + Ok(()) + } + + // https://w3c.github.io/webvtt/#dom-vttcue-align + fn Align(&self) -> AlignSetting { + self.align.get() + } + + // https://w3c.github.io/webvtt/#dom-vttcue-align + fn SetAlign(&self, value: AlignSetting) { + self.align.set(value); + } + + // https://w3c.github.io/webvtt/#dom-vttcue-text + fn Text(&self) -> DOMString { + self.text.borrow().clone() + } + + // https://w3c.github.io/webvtt/#dom-vttcue-text + fn SetText(&self, value: DOMString) { + *self.text.borrow_mut() = value; + } + + // https://w3c.github.io/webvtt/#dom-vttcue-getcueashtml + fn GetCueAsHTML(&self) -> DomRoot<DocumentFragment> { + todo!() + } +} + +#[derive(Clone, JSTraceable, MallocSizeOf)] +enum LineAndPositionSetting { + Double(f64), + Auto, +} + +impl From<VTTCueBinding::LineAndPositionSetting> for LineAndPositionSetting { + fn from(value: VTTCueBinding::LineAndPositionSetting) -> Self { + match value { + VTTCueBinding::LineAndPositionSetting::Double(x) => LineAndPositionSetting::Double(*x), + VTTCueBinding::LineAndPositionSetting::AutoKeyword(_) => LineAndPositionSetting::Auto, + } + } +} + +impl From<LineAndPositionSetting> for VTTCueBinding::LineAndPositionSetting { + fn from(value: LineAndPositionSetting) -> Self { + match value { + LineAndPositionSetting::Double(x) => { + VTTCueBinding::LineAndPositionSetting::Double(Finite::wrap(x)) + }, + LineAndPositionSetting::Auto => { + VTTCueBinding::LineAndPositionSetting::AutoKeyword(AutoKeyword::Auto) + }, + } + } +} diff --git a/components/script/dom/webidls/VTTCue.webidl b/components/script/dom/webidls/VTTCue.webidl new file mode 100644 index 00000000000..073aa12f79b --- /dev/null +++ b/components/script/dom/webidls/VTTCue.webidl @@ -0,0 +1,30 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +// https://w3c.github.io/webvtt/#the-vttcue-interface + +enum AutoKeyword { "auto"}; +typedef (double or AutoKeyword) LineAndPositionSetting; +enum DirectionSetting { "" /* horizontal */, "rl", "lr" }; +enum LineAlignSetting { "start", "center", "end" }; +enum PositionAlignSetting { "line-left", "center", "line-right", "auto" }; +enum AlignSetting { "start", "center", "end", "left", "right" }; + +[Pref="dom.webvtt.enabled", Exposed=Window] +interface VTTCue : TextTrackCue { + constructor(double startTime, double endTime, DOMString text); + attribute VTTRegion? region; + attribute DirectionSetting vertical; + attribute boolean snapToLines; + attribute LineAndPositionSetting line; + attribute LineAlignSetting lineAlign; + [SetterThrows] + attribute LineAndPositionSetting position; + attribute PositionAlignSetting positionAlign; + [SetterThrows] + attribute double size; + attribute AlignSetting align; + attribute DOMString text; + DocumentFragment getCueAsHTML(); +}; |