mirror of
https://github.com/servo/servo.git
synced 2025-07-24 15:50:21 +01:00
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:
parent
43a5f65940
commit
9b59b9602c
8 changed files with 58 additions and 8 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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"));
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue