aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/audiotrack.rs15
-rw-r--r--components/script/dom/audiotracklist.rs5
-rw-r--r--components/script/dom/htmlmediaelement.rs1
-rw-r--r--components/script/dom/htmltrackelement.rs1
-rw-r--r--components/script/dom/texttrack.rs20
-rw-r--r--components/script/dom/texttracklist.rs4
-rw-r--r--components/script/dom/videotrack.rs15
-rw-r--r--components/script/dom/videotracklist.rs5
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();
}
}