summaryrefslogtreecommitdiff
path: root/javascript/videojs/src/js/tracks/text-track-list.js
diff options
context:
space:
mode:
Diffstat (limited to 'javascript/videojs/src/js/tracks/text-track-list.js')
-rw-r--r--javascript/videojs/src/js/tracks/text-track-list.js70
1 files changed, 70 insertions, 0 deletions
diff --git a/javascript/videojs/src/js/tracks/text-track-list.js b/javascript/videojs/src/js/tracks/text-track-list.js
new file mode 100644
index 0000000..0fd6c35
--- /dev/null
+++ b/javascript/videojs/src/js/tracks/text-track-list.js
@@ -0,0 +1,70 @@
+/**
+ * @file text-track-list.js
+ */
+import TrackList from './track-list';
+
+/** @import TextTrack from './text-track' */
+
+/**
+ * The current list of {@link TextTrack} for a media file.
+ *
+ * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist}
+ * @extends TrackList
+ */
+class TextTrackList extends TrackList {
+
+ /**
+ * Add a {@link TextTrack} to the `TextTrackList`
+ *
+ * @param {TextTrack} track
+ * The text track to add to the list.
+ *
+ * @fires TrackList#addtrack
+ */
+ addTrack(track) {
+ super.addTrack(track);
+
+ if (!this.queueChange_) {
+ this.queueChange_ = () => this.queueTrigger('change');
+ }
+ if (!this.triggerSelectedlanguagechange) {
+ this.triggerSelectedlanguagechange_ = () => this.trigger('selectedlanguagechange');
+ }
+
+ /**
+ * @listens TextTrack#modechange
+ * @fires TrackList#change
+ */
+ track.addEventListener('modechange', this.queueChange_);
+ const nonLanguageTextTrackKind = ['metadata', 'chapters'];
+
+ if (nonLanguageTextTrackKind.indexOf(track.kind) === -1) {
+ track.addEventListener('modechange', this.triggerSelectedlanguagechange_);
+ }
+ }
+
+ removeTrack(rtrack) {
+ super.removeTrack(rtrack);
+
+ // manually remove the event handlers we added
+ if (rtrack.removeEventListener) {
+ if (this.queueChange_) {
+ rtrack.removeEventListener('modechange', this.queueChange_);
+ }
+ if (this.selectedlanguagechange_) {
+ rtrack.removeEventListener('modechange', this.triggerSelectedlanguagechange_);
+ }
+ }
+ }
+
+ /**
+ * Creates a serializable array of objects that contains serialized copies
+ * of each text track.
+ *
+ * @return {Object[]} A serializable list of objects for the text track list
+ */
+ toJSON() {
+ return this.tracks_.map((track) => track.toJSON());
+ }
+}
+export default TextTrackList;