script/dom/html/
htmltrackelement.rs1use 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 fn Kind(&self) -> DOMString {
84 let element = self.upcast::<Element>();
85 let kind = element
88 .get_string_attribute(&local_name!("kind"))
89 .to_lowercase();
90 match &*kind {
91 "subtitles" | "captions" | "descriptions" | "chapters" | "metadata" => {
92 DOMString::from(kind)
95 },
96 _ if kind.is_empty() => {
97 DOMString::from("subtitles")
100 },
101 _ => {
102 DOMString::from("metadata")
105 },
106 }
107 }
108
109 make_setter!(SetKind, "kind");
113
114 make_url_getter!(Src, "src");
116 make_url_setter!(SetSrc, "src");
118
119 make_getter!(Srclang, "srclang");
121 make_setter!(SetSrclang, "srclang");
123
124 make_getter!(Label, "label");
126 make_setter!(SetLabel, "label");
128
129 make_bool_getter!(Default, "default");
131 make_bool_setter!(SetDefault, "default");
133
134 fn ReadyState(&self) -> u16 {
136 self.ready_state as u16
137 }
138
139 fn Track(&self) -> DomRoot<TextTrack> {
141 DomRoot::from_ref(&*self.track)
142 }
143}