script/dom/html/
htmltrackelement.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use dom_struct::dom_struct;
6use html5ever::{LocalName, Prefix, local_name};
7use js::rust::HandleObject;
8
9use crate::dom::bindings::codegen::Bindings::HTMLTrackElementBinding::{
10    HTMLTrackElementConstants, HTMLTrackElementMethods,
11};
12use crate::dom::bindings::inheritance::Castable;
13use crate::dom::bindings::root::{Dom, DomRoot};
14use crate::dom::bindings::str::{DOMString, USVString};
15use crate::dom::document::Document;
16use crate::dom::element::Element;
17use crate::dom::html::htmlelement::HTMLElement;
18use crate::dom::node::Node;
19use crate::dom::texttrack::TextTrack;
20use crate::script_runtime::CanGc;
21
22#[derive(Clone, Copy, JSTraceable, MallocSizeOf, PartialEq)]
23#[repr(u16)]
24#[allow(unused)]
25pub(crate) enum ReadyState {
26    None = HTMLTrackElementConstants::NONE,
27    Loading = HTMLTrackElementConstants::LOADING,
28    Loaded = HTMLTrackElementConstants::LOADED,
29    Error = HTMLTrackElementConstants::ERROR,
30}
31
32#[dom_struct]
33pub(crate) struct HTMLTrackElement {
34    htmlelement: HTMLElement,
35    ready_state: ReadyState,
36    track: Dom<TextTrack>,
37}
38
39impl HTMLTrackElement {
40    fn new_inherited(
41        local_name: LocalName,
42        prefix: Option<Prefix>,
43        document: &Document,
44        track: &TextTrack,
45    ) -> HTMLTrackElement {
46        HTMLTrackElement {
47            htmlelement: HTMLElement::new_inherited(local_name, prefix, document),
48            ready_state: ReadyState::None,
49            track: Dom::from_ref(track),
50        }
51    }
52
53    pub(crate) fn new(
54        local_name: LocalName,
55        prefix: Option<Prefix>,
56        document: &Document,
57        proto: Option<HandleObject>,
58        can_gc: CanGc,
59    ) -> DomRoot<HTMLTrackElement> {
60        let track = TextTrack::new(
61            document.window(),
62            Default::default(),
63            Default::default(),
64            Default::default(),
65            Default::default(),
66            Default::default(),
67            None,
68            can_gc,
69        );
70        Node::reflect_node_with_proto(
71            Box::new(HTMLTrackElement::new_inherited(
72                local_name, prefix, document, &track,
73            )),
74            document,
75            proto,
76            can_gc,
77        )
78    }
79}
80
81impl HTMLTrackElementMethods<crate::DomTypeHolder> for HTMLTrackElement {
82    // https://html.spec.whatwg.org/multipage/#dom-track-kind
83    fn Kind(&self) -> DOMString {
84        let element = self.upcast::<Element>();
85        // Get the value of "kind" and transform all uppercase
86        // chars into lowercase.
87        let kind = element
88            .get_string_attribute(&local_name!("kind"))
89            .to_lowercase();
90        match &*kind {
91            "subtitles" | "captions" | "descriptions" | "chapters" | "metadata" => {
92                // The value of "kind" is valid. Return the lowercase version
93                // of it.
94                DOMString::from(kind)
95            },
96            _ if kind.is_empty() => {
97                // The default value should be "subtitles". If "kind" has not
98                // been set, the real value for "kind" is "subtitles"
99                DOMString::from("subtitles")
100            },
101            _ => {
102                // If "kind" has been set but it is not one of the valid
103                // values, return the default invalid value of "metadata"
104                DOMString::from("metadata")
105            },
106        }
107    }
108
109    // https://html.spec.whatwg.org/multipage/#dom-track-kind
110    // Do no transformations on the value of "kind" when setting it.
111    // All transformations should be done in the get method.
112    make_setter!(SetKind, "kind");
113
114    // https://html.spec.whatwg.org/multipage/#dom-track-src
115    make_url_getter!(Src, "src");
116    // https://html.spec.whatwg.org/multipage/#dom-track-src
117    make_url_setter!(SetSrc, "src");
118
119    // https://html.spec.whatwg.org/multipage/#dom-track-srclang
120    make_getter!(Srclang, "srclang");
121    // https://html.spec.whatwg.org/multipage/#dom-track-srclang
122    make_setter!(SetSrclang, "srclang");
123
124    // https://html.spec.whatwg.org/multipage/#dom-track-label
125    make_getter!(Label, "label");
126    // https://html.spec.whatwg.org/multipage/#dom-track-label
127    make_setter!(SetLabel, "label");
128
129    // https://html.spec.whatwg.org/multipage/#dom-track-default
130    make_bool_getter!(Default, "default");
131    // https://html.spec.whatwg.org/multipage/#dom-track-default
132    make_bool_setter!(SetDefault, "default");
133
134    // https://html.spec.whatwg.org/multipage/#dom-track-readystate
135    fn ReadyState(&self) -> u16 {
136        self.ready_state as u16
137    }
138
139    // https://html.spec.whatwg.org/multipage/#dom-track-track
140    fn Track(&self) -> DomRoot<TextTrack> {
141        DomRoot::from_ref(&*self.track)
142    }
143}