diff options
author | Dan Robertson <dan@dlrobertson.com> | 2019-01-07 23:21:30 +0000 |
---|---|---|
committer | Dan Robertson <dan@dlrobertson.com> | 2019-01-08 13:23:38 +0000 |
commit | c4802076b344f806e0a8d032b8f7f7c95d44cf45 (patch) | |
tree | 3b6a927e40138a0f405151a12f33946da2bdef80 /components/script/dom/htmltrackelement.rs | |
parent | 121cbd0078c5bd1693b040567e166a3ca55d7269 (diff) | |
download | servo-c4802076b344f806e0a8d032b8f7f7c95d44cf45.tar.gz servo-c4802076b344f806e0a8d032b8f7f7c95d44cf45.zip |
script: Implement the HTMLTrackElement API
Implement the basics of the HTMLTrackElement and update the wpt tests.
Diffstat (limited to 'components/script/dom/htmltrackelement.rs')
-rw-r--r-- | components/script/dom/htmltrackelement.rs | 100 |
1 files changed, 96 insertions, 4 deletions
diff --git a/components/script/dom/htmltrackelement.rs b/components/script/dom/htmltrackelement.rs index 53893215101..caa8932b415 100644 --- a/components/script/dom/htmltrackelement.rs +++ b/components/script/dom/htmltrackelement.rs @@ -2,17 +2,35 @@ * 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::codegen::Bindings::HTMLTrackElementBinding; -use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::codegen::Bindings::HTMLTrackElementBinding::{ + self, HTMLTrackElementConstants, HTMLTrackElementMethods, +}; +use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::document::Document; +use crate::dom::element::Element; use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; +use crate::dom::texttrack::TextTrack; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +#[derive(Clone, Copy, JSTraceable, MallocSizeOf, PartialEq)] +#[repr(u16)] +#[allow(unused)] +pub enum ReadyState { + None = HTMLTrackElementConstants::NONE, + Loading = HTMLTrackElementConstants::LOADING, + Loaded = HTMLTrackElementConstants::LOADED, + Error = HTMLTrackElementConstants::ERROR, +} + #[dom_struct] pub struct HTMLTrackElement { htmlelement: HTMLElement, + ready_state: ReadyState, + track: Dom<TextTrack>, } impl HTMLTrackElement { @@ -20,24 +38,98 @@ impl HTMLTrackElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + track: &TextTrack, ) -> HTMLTrackElement { HTMLTrackElement { htmlelement: HTMLElement::new_inherited(local_name, prefix, document), + ready_state: ReadyState::None, + track: Dom::from_ref(&track), } } - #[allow(unrooted_must_root)] pub fn new( local_name: LocalName, prefix: Option<Prefix>, document: &Document, ) -> DomRoot<HTMLTrackElement> { + let track = TextTrack::new( + &document.window(), + Default::default(), + Default::default(), + Default::default(), + Default::default(), + Default::default(), + ); Node::reflect_node( Box::new(HTMLTrackElement::new_inherited( - local_name, prefix, document, + local_name, prefix, document, &track, )), document, HTMLTrackElementBinding::Wrap, ) } } + +impl HTMLTrackElementMethods for HTMLTrackElement { + // https://html.spec.whatwg.org/multipage/#dom-track-kind + fn Kind(&self) -> DOMString { + let element = self.upcast::<Element>(); + // Get the value of "kind" and transform all uppercase + // chars into lowercase. + let kind = element + .get_string_attribute(&local_name!("kind")) + .to_lowercase(); + match &*kind { + "subtitles" | "captions" | "descriptions" | "chapters" | "metadata" => { + // The value of "kind" is valid. Return the lowercase version + // of it. + DOMString::from(kind) + }, + _ if kind.is_empty() => { + // The default value should be "subtitles". If "kind" has not + // been set, the real value for "kind" is "subtitles" + DOMString::from("subtitles") + }, + _ => { + // If "kind" has been set but it is not one of the valid + // values, return the default invalid value of "metadata" + DOMString::from("metadata") + }, + } + } + + // https://html.spec.whatwg.org/multipage/#dom-track-kind + // Do no transformations on the value of "kind" when setting it. + // All transformations should be done in the get method. + make_setter!(SetKind, "kind"); + + // https://html.spec.whatwg.org/multipage/#dom-track-src + make_url_getter!(Src, "src"); + // https://html.spec.whatwg.org/multipage/#dom-track-src + make_url_setter!(SetSrc, "src"); + + // https://html.spec.whatwg.org/multipage/#dom-track-srclang + make_getter!(Srclang, "srclang"); + // https://html.spec.whatwg.org/multipage/#dom-track-srclang + make_setter!(SetSrclang, "srclang"); + + // https://html.spec.whatwg.org/multipage/#dom-track-label + make_getter!(Label, "label"); + // https://html.spec.whatwg.org/multipage/#dom-track-label + make_setter!(SetLabel, "label"); + + // https://html.spec.whatwg.org/multipage/#dom-track-default + make_bool_getter!(Default, "default"); + // https://html.spec.whatwg.org/multipage/#dom-track-default + make_bool_setter!(SetDefault, "default"); + + // https://html.spec.whatwg.org/multipage/#dom-track-readystate + fn ReadyState(&self) -> u16 { + self.ready_state as u16 + } + + // https://html.spec.whatwg.org/multipage/#dom-track-track + fn Track(&self) -> DomRoot<TextTrack> { + DomRoot::from_ref(&*self.track) + } +} |