Add track_list member to AudioTrack, VideoTrack, TextTrack structs

Add member to the track structs pointing at their associated tracklist
and update it when the track is added or removed from a tracklist.
This commit is contained in:
Kunal Mohan 2019-12-22 21:00:10 +05:30
parent 43a5f65940
commit 9b59b9602c
No known key found for this signature in database
GPG key ID: 2B475A4524237BAC
8 changed files with 58 additions and 8 deletions

View file

@ -3,6 +3,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use crate::dom::audiotracklist::AudioTrackList; use crate::dom::audiotracklist::AudioTrackList;
use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::AudioTrackBinding::{self, AudioTrackMethods}; use crate::dom::bindings::codegen::Bindings::AudioTrackBinding::{self, AudioTrackMethods};
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::root::{Dom, DomRoot};
@ -19,7 +20,7 @@ pub struct AudioTrack {
label: DOMString, label: DOMString,
language: DOMString, language: DOMString,
enabled: Cell<bool>, enabled: Cell<bool>,
track_list: Option<Dom<AudioTrackList>>, track_list: DomRefCell<Option<Dom<AudioTrackList>>>,
} }
impl AudioTrack { impl AudioTrack {
@ -37,7 +38,7 @@ impl AudioTrack {
label: label.into(), label: label.into(),
language: language.into(), language: language.into(),
enabled: Cell::new(false), 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) { pub fn set_enabled(&self, value: bool) {
self.enabled.set(value); 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 { impl AudioTrackMethods for AudioTrack {
@ -103,7 +112,7 @@ impl AudioTrackMethods for AudioTrack {
// https://html.spec.whatwg.org/multipage/#dom-audiotrack-enabled // https://html.spec.whatwg.org/multipage/#dom-audiotrack-enabled
fn SetEnabled(&self, value: bool) { 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) { if let Some(idx) = list.find(self) {
list.set_enabled(idx, value); list.set_enabled(idx, value);
} }

View file

@ -104,9 +104,14 @@ impl AudioTrackList {
pub fn add(&self, track: &AudioTrack) { pub fn add(&self, track: &AudioTrack) {
self.tracks.borrow_mut().push(Dom::from_ref(track)); self.tracks.borrow_mut().push(Dom::from_ref(track));
track.add_track_list(self);
} }
pub fn clear(&self) { pub fn clear(&self) {
self.tracks
.borrow()
.iter()
.for_each(|t| t.remove_track_list());
self.tracks.borrow_mut().clear(); self.tracks.borrow_mut().clear();
} }
} }

View file

@ -2362,6 +2362,7 @@ impl HTMLMediaElementMethods for HTMLMediaElement {
label, label,
language, language,
TextTrackMode::Hidden, TextTrackMode::Hidden,
None,
); );
// Step 3 & 4 // Step 3 & 4
self.TextTracks().add(&track); self.TextTracks().add(&track);

View file

@ -59,6 +59,7 @@ impl HTMLTrackElement {
Default::default(), Default::default(),
Default::default(), Default::default(),
Default::default(), Default::default(),
None,
); );
Node::reflect_node( Node::reflect_node(
Box::new(HTMLTrackElement::new_inherited( Box::new(HTMLTrackElement::new_inherited(

View file

@ -2,16 +2,18 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * 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::{ use crate::dom::bindings::codegen::Bindings::TextTrackBinding::{
self, TextTrackKind, TextTrackMethods, TextTrackMode, self, TextTrackKind, TextTrackMethods, TextTrackMode,
}; };
use crate::dom::bindings::error::{Error, ErrorResult}; use crate::dom::bindings::error::{Error, ErrorResult};
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; 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::bindings::str::DOMString;
use crate::dom::eventtarget::EventTarget; use crate::dom::eventtarget::EventTarget;
use crate::dom::texttrackcue::TextTrackCue; use crate::dom::texttrackcue::TextTrackCue;
use crate::dom::texttrackcuelist::TextTrackCueList; use crate::dom::texttrackcuelist::TextTrackCueList;
use crate::dom::texttracklist::TextTrackList;
use crate::dom::window::Window; use crate::dom::window::Window;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use std::cell::Cell; use std::cell::Cell;
@ -25,6 +27,7 @@ pub struct TextTrack {
id: String, id: String,
mode: Cell<TextTrackMode>, mode: Cell<TextTrackMode>,
cue_list: MutNullableDom<TextTrackCueList>, cue_list: MutNullableDom<TextTrackCueList>,
track_list: DomRefCell<Option<Dom<TextTrackList>>>,
} }
impl TextTrack { impl TextTrack {
@ -34,6 +37,7 @@ impl TextTrack {
label: DOMString, label: DOMString,
language: DOMString, language: DOMString,
mode: TextTrackMode, mode: TextTrackMode,
track_list: Option<&TextTrackList>,
) -> TextTrack { ) -> TextTrack {
TextTrack { TextTrack {
eventtarget: EventTarget::new_inherited(), eventtarget: EventTarget::new_inherited(),
@ -43,6 +47,7 @@ impl TextTrack {
id: id.into(), id: id.into(),
mode: Cell::new(mode), mode: Cell::new(mode),
cue_list: Default::default(), cue_list: Default::default(),
track_list: DomRefCell::new(track_list.map(|t| Dom::from_ref(t))),
} }
} }
@ -53,9 +58,12 @@ impl TextTrack {
label: DOMString, label: DOMString,
language: DOMString, language: DOMString,
mode: TextTrackMode, mode: TextTrackMode,
track_list: Option<&TextTrackList>,
) -> DomRoot<TextTrack> { ) -> DomRoot<TextTrack> {
reflect_dom_object( 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, window,
TextTrackBinding::Wrap, TextTrackBinding::Wrap,
) )
@ -69,6 +77,14 @@ impl TextTrack {
pub fn id(&self) -> &str { pub fn id(&self) -> &str {
&self.id &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 { impl TextTrackMethods for TextTrack {

View file

@ -94,6 +94,7 @@ impl TextTrackList {
}), }),
&canceller, &canceller,
); );
track.add_track_list(self);
} }
} }
@ -101,6 +102,9 @@ impl TextTrackList {
// removed from the TextTrackList. // removed from the TextTrackList.
#[allow(dead_code)] #[allow(dead_code)]
pub fn remove(&self, idx: usize) { 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.dom_tracks.borrow_mut().remove(idx);
self.upcast::<EventTarget>() self.upcast::<EventTarget>()
.fire_event(atom!("removetrack")); .fire_event(atom!("removetrack"));

View file

@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * 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::codegen::Bindings::VideoTrackBinding::{self, VideoTrackMethods};
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::root::{Dom, DomRoot};
@ -19,7 +20,7 @@ pub struct VideoTrack {
label: DOMString, label: DOMString,
language: DOMString, language: DOMString,
selected: Cell<bool>, selected: Cell<bool>,
track_list: Option<Dom<VideoTrackList>>, track_list: DomRefCell<Option<Dom<VideoTrackList>>>,
} }
impl VideoTrack { impl VideoTrack {
@ -37,7 +38,7 @@ impl VideoTrack {
label: label.into(), label: label.into(),
language: language.into(), language: language.into(),
selected: Cell::new(false), 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) { pub fn set_selected(&self, value: bool) {
self.selected.set(value); 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 { impl VideoTrackMethods for VideoTrack {
@ -103,7 +112,7 @@ impl VideoTrackMethods for VideoTrack {
// https://html.spec.whatwg.org/multipage/#dom-videotrack-selected // https://html.spec.whatwg.org/multipage/#dom-videotrack-selected
fn SetSelected(&self, value: bool) { 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) { if let Some(idx) = list.find(self) {
list.set_selected(idx, value); list.set_selected(idx, value);
} }

View file

@ -113,9 +113,14 @@ impl VideoTrackList {
self.set_selected(idx, false); self.set_selected(idx, false);
} }
} }
track.add_track_list(self);
} }
pub fn clear(&self) { pub fn clear(&self) {
self.tracks
.borrow()
.iter()
.for_each(|t| t.remove_track_list());
self.tracks.borrow_mut().clear(); self.tracks.borrow_mut().clear();
} }
} }