diff options
Diffstat (limited to 'components/script/dom/vttregion.rs')
-rw-r--r-- | components/script/dom/vttregion.rs | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/components/script/dom/vttregion.rs b/components/script/dom/vttregion.rs new file mode 100644 index 00000000000..987af730f14 --- /dev/null +++ b/components/script/dom/vttregion.rs @@ -0,0 +1,161 @@ +/* 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::{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<DOMString>, + width: Cell<f64>, + lines: Cell<u32>, + region_anchor_x: Cell<f64>, + region_anchor_y: Cell<f64>, + viewport_anchor_x: Cell<f64>, + viewport_anchor_y: Cell<f64>, + scroll: Cell<ScrollSetting>, +} + +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<Self> { + reflect_dom_object(Box::new(Self::new_inherited()), global) + } + + #[allow(non_snake_case)] + pub fn Constructor(window: &Window) -> Fallible<DomRoot<Self>> { + 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<f64> { + Finite::wrap(self.width.get()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-width + fn SetWidth(&self, value: Finite<f64>) -> 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<f64> { + Finite::wrap(self.region_anchor_x.get()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-regionanchorx + fn SetRegionAnchorX(&self, value: Finite<f64>) -> 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<f64> { + Finite::wrap(self.region_anchor_y.get()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-regionanchory + fn SetRegionAnchorY(&self, value: Finite<f64>) -> 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<f64> { + Finite::wrap(self.viewport_anchor_x.get()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-viewportanchorx + fn SetViewportAnchorX(&self, value: Finite<f64>) -> 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<f64> { + Finite::wrap(self.viewport_anchor_y.get()) + } + + // https://w3c.github.io/webvtt/#dom-vttregion-viewportanchory + fn SetViewportAnchorY(&self, value: Finite<f64>) -> 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); + } +} |