From 30b148c90f77057883e9cfe0b4edd0a6a883a9b6 Mon Sep 17 00:00:00 2001 From: Iulian Gabriel Radu Date: Wed, 4 Mar 2020 23:36:35 +0200 Subject: [PATCH] Add VTTRegion DOM interface --- components/config/prefs.rs | 3 + components/script/dom/mod.rs | 1 + components/script/dom/vttregion.rs | 167 ++++++++++++++++++ .../script/dom/webidls/VTTRegion.webidl | 26 +++ resources/prefs.json | 1 + .../non-visible-cue-with-region.html.ini | 4 + 6 files changed, 202 insertions(+) create mode 100644 components/script/dom/vttregion.rs create mode 100644 components/script/dom/webidls/VTTRegion.webidl create mode 100644 tests/wpt/metadata/webvtt/api/VTTRegion/non-visible-cue-with-region.html.ini diff --git a/components/config/prefs.rs b/components/config/prefs.rs index 841e244d51c..b4cc22a705b 100644 --- a/components/config/prefs.rs +++ b/components/config/prefs.rs @@ -294,6 +294,9 @@ mod gen { event_polling_interval: i64, test: bool, }, + webvtt: { + enabled: bool, + }, webxr: { #[serde(default)] enabled: bool, diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index fba7200c892..47b9bed795f 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 vttregion; pub mod webgl_extensions; pub use self::webgl_extensions::ext::*; pub mod webgl2renderingcontext; diff --git a/components/script/dom/vttregion.rs b/components/script/dom/vttregion.rs new file mode 100644 index 00000000000..167e9fa37bf --- /dev/null +++ b/components/script/dom/vttregion.rs @@ -0,0 +1,167 @@ +/* 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::VTTRegionBinding::{ + self, ScrollSetting, VTTRegionMethods, +}; +use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; +use crate::dom::bindings::num::Finite; +use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::str::DOMString; +use crate::dom::globalscope::GlobalScope; +use crate::dom::window::Window; +use dom_struct::dom_struct; +use std::cell::Cell; + +#[dom_struct] +pub struct VTTRegion { + reflector_: Reflector, + id: DomRefCell, + width: Cell, + lines: Cell, + region_anchor_x: Cell, + region_anchor_y: Cell, + viewport_anchor_x: Cell, + viewport_anchor_y: Cell, + scroll: Cell, +} + +impl VTTRegion { + pub fn new_inherited() -> Self { + VTTRegion { + reflector_: Reflector::new(), + id: DomRefCell::new(DOMString::default()), + width: Cell::new(100_f64), + lines: Cell::new(3), + region_anchor_x: Cell::new(0_f64), + region_anchor_y: Cell::new(100_f64), + viewport_anchor_x: Cell::new(0_f64), + viewport_anchor_y: Cell::new(100_f64), + scroll: Cell::new(Default::default()), + } + } + + pub fn new(global: &GlobalScope) -> DomRoot { + reflect_dom_object( + Box::new(Self::new_inherited()), + global, + VTTRegionBinding::Wrap, + ) + } + + #[allow(non_snake_case)] + pub fn Constructor(window: &Window) -> Fallible> { + Ok(VTTRegion::new(&window.global())) + } +} + +impl VTTRegionMethods for VTTRegion { + // https://w3c.github.io/webvtt/#dom-vttregion-id + fn Id(&self) -> DOMString { + self.id.borrow().clone() + } + + // https://w3c.github.io/webvtt/#dom-vttregion-id + fn SetId(&self, value: DOMString) { + *self.id.borrow_mut() = value; + } + + // https://w3c.github.io/webvtt/#dom-vttregion-width + fn Width(&self) -> Finite { + Finite::wrap(self.width.get()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-width + fn SetWidth(&self, value: Finite) -> ErrorResult { + if *value < 0_f64 || *value > 100_f64 { + return Err(Error::IndexSize); + } + + self.width.set(*value); + Ok(()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-lines + fn Lines(&self) -> u32 { + self.lines.get() + } + + // https://w3c.github.io/webvtt/#dom-vttregion-lines + fn SetLines(&self, value: u32) -> ErrorResult { + self.lines.set(value); + Ok(()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-regionanchorx + fn RegionAnchorX(&self) -> Finite { + Finite::wrap(self.region_anchor_x.get()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-regionanchorx + fn SetRegionAnchorX(&self, value: Finite) -> ErrorResult { + if *value < 0_f64 || *value > 100_f64 { + return Err(Error::IndexSize); + } + + self.region_anchor_x.set(*value); + Ok(()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-regionanchory + fn RegionAnchorY(&self) -> Finite { + Finite::wrap(self.region_anchor_y.get()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-regionanchory + fn SetRegionAnchorY(&self, value: Finite) -> ErrorResult { + if *value < 0_f64 || *value > 100_f64 { + return Err(Error::IndexSize); + } + + self.region_anchor_y.set(*value); + Ok(()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-viewportanchorx + fn ViewportAnchorX(&self) -> Finite { + Finite::wrap(self.viewport_anchor_x.get()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-viewportanchorx + fn SetViewportAnchorX(&self, value: Finite) -> ErrorResult { + if *value < 0_f64 || *value > 100_f64 { + return Err(Error::IndexSize); + } + + self.viewport_anchor_x.set(*value); + Ok(()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-viewportanchory + fn ViewportAnchorY(&self) -> Finite { + Finite::wrap(self.viewport_anchor_y.get()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-viewportanchory + fn SetViewportAnchorY(&self, value: Finite) -> ErrorResult { + if *value < 0_f64 || *value > 100_f64 { + return Err(Error::IndexSize); + } + + self.viewport_anchor_y.set(*value); + Ok(()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-scroll + fn Scroll(&self) -> ScrollSetting { + self.scroll.get() + } + + // https://w3c.github.io/webvtt/#dom-vttregion-scroll + fn SetScroll(&self, value: ScrollSetting) { + self.scroll.set(value); + } +} diff --git a/components/script/dom/webidls/VTTRegion.webidl b/components/script/dom/webidls/VTTRegion.webidl new file mode 100644 index 00000000000..12fbe16170b --- /dev/null +++ b/components/script/dom/webidls/VTTRegion.webidl @@ -0,0 +1,26 @@ +/* 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-vttregion-interface + +enum ScrollSetting { "" /* none */, "up"}; + +[Pref="dom.webvtt.enabled", Exposed=Window] +interface VTTRegion { + [Throws] constructor(); + attribute DOMString id; + [SetterThrows] + attribute double width; + [SetterThrows] + attribute unsigned long lines; + [SetterThrows] + attribute double regionAnchorX; + [SetterThrows] + attribute double regionAnchorY; + [SetterThrows] + attribute double viewportAnchorX; + [SetterThrows] + attribute double viewportAnchorY; + attribute ScrollSetting scroll; +}; diff --git a/resources/prefs.json b/resources/prefs.json index 2f2c6e2271c..3bcf60d36df 100644 --- a/resources/prefs.json +++ b/resources/prefs.json @@ -31,6 +31,7 @@ "dom.webvr.enabled": false, "dom.webvr.event_polling_interval": 500, "dom.webvr.test": false, + "dom.webvtt.enabled": false, "dom.webxr.enabled": true, "dom.webxr.glwindow": true, "dom.webxr.test": false, diff --git a/tests/wpt/metadata/webvtt/api/VTTRegion/non-visible-cue-with-region.html.ini b/tests/wpt/metadata/webvtt/api/VTTRegion/non-visible-cue-with-region.html.ini new file mode 100644 index 00000000000..4e08b00712f --- /dev/null +++ b/tests/wpt/metadata/webvtt/api/VTTRegion/non-visible-cue-with-region.html.ini @@ -0,0 +1,4 @@ +[non-visible-cue-with-region.html] + [Box-less VTTCue attached to VTTRegion] + expected: FAIL +