diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/audiotrack.rs | 15 | ||||
-rw-r--r-- | components/script/dom/audiotracklist.rs | 5 | ||||
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 1 | ||||
-rw-r--r-- | components/script/dom/htmltrackelement.rs | 1 | ||||
-rw-r--r-- | components/script/dom/texttrack.rs | 20 | ||||
-rw-r--r-- | components/script/dom/texttracklist.rs | 4 | ||||
-rw-r--r-- | components/script/dom/videotrack.rs | 15 | ||||
-rw-r--r-- | components/script/dom/videotracklist.rs | 5 |
8 files changed, 58 insertions, 8 deletions
diff --git a/components/script/dom/audiotrack.rs b/components/script/dom/audiotrack.rs index b66ea5bf4cc..af237bc8b1a 100644 --- a/components/script/dom/audiotrack.rs +++ b/components/script/dom/audiotrack.rs @@ -3,6 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::audiotracklist::AudioTrackList; +use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::AudioTrackBinding::{self, AudioTrackMethods}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; @@ -19,7 +20,7 @@ pub struct AudioTrack { label: DOMString, language: DOMString, enabled: Cell<bool>, - track_list: Option<Dom<AudioTrackList>>, + track_list: DomRefCell<Option<Dom<AudioTrackList>>>, } impl AudioTrack { @@ -37,7 +38,7 @@ impl AudioTrack { label: label.into(), language: language.into(), enabled: Cell::new(false), - track_list: track_list.map(|t| Dom::from_ref(t)), + track_list: DomRefCell::new(track_list.map(|t| Dom::from_ref(t))), } } @@ -73,6 +74,14 @@ impl AudioTrack { pub fn set_enabled(&self, value: bool) { self.enabled.set(value); } + + pub fn add_track_list(&self, track_list: &AudioTrackList) { + *self.track_list.borrow_mut() = Some(Dom::from_ref(track_list)); + } + + pub fn remove_track_list(&self) { + *self.track_list.borrow_mut() = None; + } } impl AudioTrackMethods for AudioTrack { @@ -103,7 +112,7 @@ impl AudioTrackMethods for AudioTrack { // https://html.spec.whatwg.org/multipage/#dom-audiotrack-enabled fn SetEnabled(&self, value: bool) { - if let Some(list) = self.track_list.as_ref() { + if let Some(list) = self.track_list.borrow().as_ref() { if let Some(idx) = list.find(self) { list.set_enabled(idx, value); } diff --git a/components/script/dom/audiotracklist.rs b/components/script/dom/audiotracklist.rs index e26f23cb2a8..5191221b7d9 100644 --- a/components/script/dom/audiotracklist.rs +++ b/components/script/dom/audiotracklist.rs @@ -104,9 +104,14 @@ impl AudioTrackList { pub fn add(&self, track: &AudioTrack) { self.tracks.borrow_mut().push(Dom::from_ref(track)); + track.add_track_list(self); } pub fn clear(&self) { + self.tracks + .borrow() + .iter() + .for_each(|t| t.remove_track_list()); self.tracks.borrow_mut().clear(); } } diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 91acd4b97e7..cb93a77a90d 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -2362,6 +2362,7 @@ impl HTMLMediaElementMethods for HTMLMediaElement { label, language, TextTrackMode::Hidden, + None, ); // Step 3 & 4 self.TextTracks().add(&track); diff --git a/components/script/dom/htmltrackelement.rs b/components/script/dom/htmltrackelement.rs index caa8932b415..c67701b3894 100644 --- a/components/script/dom/htmltrackelement.rs +++ b/components/script/dom/htmltrackelement.rs @@ -59,6 +59,7 @@ impl HTMLTrackElement { Default::default(), Default::default(), Default::default(), + None, ); Node::reflect_node( Box::new(HTMLTrackElement::new_inherited( diff --git a/components/script/dom/texttrack.rs b/components/script/dom/texttrack.rs index 88c4859e05e..7c2b54adcd9 100644 --- a/components/script/dom/texttrack.rs +++ b/components/script/dom/texttrack.rs @@ -2,16 +2,18 @@ * 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::TextTrackBinding::{ self, TextTrackKind, TextTrackMethods, TextTrackMode, }; use crate::dom::bindings::error::{Error, ErrorResult}; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; -use crate::dom::bindings::root::{DomRoot, MutNullableDom}; +use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::eventtarget::EventTarget; use crate::dom::texttrackcue::TextTrackCue; use crate::dom::texttrackcuelist::TextTrackCueList; +use crate::dom::texttracklist::TextTrackList; use crate::dom::window::Window; use dom_struct::dom_struct; use std::cell::Cell; @@ -25,6 +27,7 @@ pub struct TextTrack { id: String, mode: Cell<TextTrackMode>, cue_list: MutNullableDom<TextTrackCueList>, + track_list: DomRefCell<Option<Dom<TextTrackList>>>, } impl TextTrack { @@ -34,6 +37,7 @@ impl TextTrack { label: DOMString, language: DOMString, mode: TextTrackMode, + track_list: Option<&TextTrackList>, ) -> TextTrack { TextTrack { eventtarget: EventTarget::new_inherited(), @@ -43,6 +47,7 @@ impl TextTrack { id: id.into(), mode: Cell::new(mode), cue_list: Default::default(), + track_list: DomRefCell::new(track_list.map(|t| Dom::from_ref(t))), } } @@ -53,9 +58,12 @@ impl TextTrack { label: DOMString, language: DOMString, mode: TextTrackMode, + track_list: Option<&TextTrackList>, ) -> DomRoot<TextTrack> { reflect_dom_object( - Box::new(TextTrack::new_inherited(id, kind, label, language, mode)), + Box::new(TextTrack::new_inherited( + id, kind, label, language, mode, track_list, + )), window, TextTrackBinding::Wrap, ) @@ -69,6 +77,14 @@ impl TextTrack { pub fn id(&self) -> &str { &self.id } + + pub fn add_track_list(&self, track_list: &TextTrackList) { + *self.track_list.borrow_mut() = Some(Dom::from_ref(track_list)); + } + + pub fn remove_track_list(&self) { + *self.track_list.borrow_mut() = None; + } } impl TextTrackMethods for TextTrack { diff --git a/components/script/dom/texttracklist.rs b/components/script/dom/texttracklist.rs index f6f9037902e..0e978972d69 100644 --- a/components/script/dom/texttracklist.rs +++ b/components/script/dom/texttracklist.rs @@ -94,6 +94,7 @@ impl TextTrackList { }), &canceller, ); + track.add_track_list(self); } } @@ -101,6 +102,9 @@ impl TextTrackList { // removed from the TextTrackList. #[allow(dead_code)] pub fn remove(&self, idx: usize) { + if let Some(track) = self.dom_tracks.borrow().get(idx) { + track.remove_track_list(); + } self.dom_tracks.borrow_mut().remove(idx); self.upcast::<EventTarget>() .fire_event(atom!("removetrack")); diff --git a/components/script/dom/videotrack.rs b/components/script/dom/videotrack.rs index b1453da0df4..18a383ab816 100644 --- a/components/script/dom/videotrack.rs +++ b/components/script/dom/videotrack.rs @@ -2,6 +2,7 @@ * 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::VideoTrackBinding::{self, VideoTrackMethods}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; @@ -19,7 +20,7 @@ pub struct VideoTrack { label: DOMString, language: DOMString, selected: Cell<bool>, - track_list: Option<Dom<VideoTrackList>>, + track_list: DomRefCell<Option<Dom<VideoTrackList>>>, } impl VideoTrack { @@ -37,7 +38,7 @@ impl VideoTrack { label: label.into(), language: language.into(), selected: Cell::new(false), - track_list: track_list.map(|t| Dom::from_ref(t)), + track_list: DomRefCell::new(track_list.map(|t| Dom::from_ref(t))), } } @@ -73,6 +74,14 @@ impl VideoTrack { pub fn set_selected(&self, value: bool) { self.selected.set(value); } + + pub fn add_track_list(&self, track_list: &VideoTrackList) { + *self.track_list.borrow_mut() = Some(Dom::from_ref(track_list)); + } + + pub fn remove_track_list(&self) { + *self.track_list.borrow_mut() = None; + } } impl VideoTrackMethods for VideoTrack { @@ -103,7 +112,7 @@ impl VideoTrackMethods for VideoTrack { // https://html.spec.whatwg.org/multipage/#dom-videotrack-selected fn SetSelected(&self, value: bool) { - if let Some(list) = self.track_list.as_ref() { + if let Some(list) = self.track_list.borrow().as_ref() { if let Some(idx) = list.find(self) { list.set_selected(idx, value); } diff --git a/components/script/dom/videotracklist.rs b/components/script/dom/videotracklist.rs index 9654123d3f3..98fa495bfdd 100644 --- a/components/script/dom/videotracklist.rs +++ b/components/script/dom/videotracklist.rs @@ -113,9 +113,14 @@ impl VideoTrackList { self.set_selected(idx, false); } } + track.add_track_list(self); } pub fn clear(&self) { + self.tracks + .borrow() + .iter() + .for_each(|t| t.remove_track_list()); self.tracks.borrow_mut().clear(); } } |