script/dom/audio/
audiotrack.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 std::cell::Cell;
6
7use dom_struct::dom_struct;
8
9use crate::dom::audio::audiotracklist::AudioTrackList;
10use crate::dom::bindings::cell::DomRefCell;
11use crate::dom::bindings::codegen::Bindings::AudioTrackBinding::AudioTrackMethods;
12use crate::dom::bindings::reflector::{Reflector, reflect_dom_object};
13use crate::dom::bindings::root::{Dom, DomRoot};
14use crate::dom::bindings::str::DOMString;
15use crate::dom::window::Window;
16use crate::script_runtime::CanGc;
17
18#[dom_struct]
19pub(crate) struct AudioTrack {
20    reflector_: Reflector,
21    id: DOMString,
22    kind: DOMString,
23    label: DOMString,
24    language: DOMString,
25    enabled: Cell<bool>,
26    track_list: DomRefCell<Option<Dom<AudioTrackList>>>,
27}
28
29impl AudioTrack {
30    pub(crate) fn new_inherited(
31        id: DOMString,
32        kind: DOMString,
33        label: DOMString,
34        language: DOMString,
35        track_list: Option<&AudioTrackList>,
36    ) -> AudioTrack {
37        AudioTrack {
38            reflector_: Reflector::new(),
39            id,
40            kind,
41            label,
42            language,
43            enabled: Cell::new(false),
44            track_list: DomRefCell::new(track_list.map(Dom::from_ref)),
45        }
46    }
47
48    pub(crate) fn new(
49        window: &Window,
50        id: DOMString,
51        kind: DOMString,
52        label: DOMString,
53        language: DOMString,
54        track_list: Option<&AudioTrackList>,
55        can_gc: CanGc,
56    ) -> DomRoot<AudioTrack> {
57        reflect_dom_object(
58            Box::new(AudioTrack::new_inherited(
59                id, kind, label, language, track_list,
60            )),
61            window,
62            can_gc,
63        )
64    }
65
66    pub(crate) fn id(&self) -> DOMString {
67        self.id.clone()
68    }
69
70    pub(crate) fn kind(&self) -> DOMString {
71        self.kind.clone()
72    }
73
74    pub(crate) fn enabled(&self) -> bool {
75        self.enabled.get()
76    }
77
78    pub(crate) fn set_enabled(&self, value: bool) {
79        self.enabled.set(value);
80    }
81
82    pub(crate) fn add_track_list(&self, track_list: &AudioTrackList) {
83        *self.track_list.borrow_mut() = Some(Dom::from_ref(track_list));
84    }
85
86    pub(crate) fn remove_track_list(&self) {
87        *self.track_list.borrow_mut() = None;
88    }
89}
90
91impl AudioTrackMethods<crate::DomTypeHolder> for AudioTrack {
92    // https://html.spec.whatwg.org/multipage/#dom-audiotrack-id
93    fn Id(&self) -> DOMString {
94        self.id()
95    }
96
97    // https://html.spec.whatwg.org/multipage/#dom-audiotrack-kind
98    fn Kind(&self) -> DOMString {
99        self.kind()
100    }
101
102    // https://html.spec.whatwg.org/multipage/#dom-audiotrack-label
103    fn Label(&self) -> DOMString {
104        self.label.clone()
105    }
106
107    // https://html.spec.whatwg.org/multipage/#dom-audiotrack-language
108    fn Language(&self) -> DOMString {
109        self.language.clone()
110    }
111
112    // https://html.spec.whatwg.org/multipage/#dom-audiotrack-enabled
113    fn Enabled(&self) -> bool {
114        self.enabled()
115    }
116
117    // https://html.spec.whatwg.org/multipage/#dom-audiotrack-enabled
118    fn SetEnabled(&self, value: bool) {
119        if let Some(list) = self.track_list.borrow().as_ref() {
120            if let Some(idx) = list.find(self) {
121                list.set_enabled(idx, value);
122            }
123        }
124        self.set_enabled(value);
125    }
126}