summaryrefslogtreecommitdiff
path: root/javascript/videojs/src/js/tracks/html-track-element-list.js
diff options
context:
space:
mode:
Diffstat (limited to 'javascript/videojs/src/js/tracks/html-track-element-list.js')
-rw-r--r--javascript/videojs/src/js/tracks/html-track-element-list.js112
1 files changed, 112 insertions, 0 deletions
diff --git a/javascript/videojs/src/js/tracks/html-track-element-list.js b/javascript/videojs/src/js/tracks/html-track-element-list.js
new file mode 100644
index 0000000..3c8107c
--- /dev/null
+++ b/javascript/videojs/src/js/tracks/html-track-element-list.js
@@ -0,0 +1,112 @@
+/**
+ * @file html-track-element-list.js
+ */
+
+/**
+ * The current list of {@link HtmlTrackElement}s.
+ */
+class HtmlTrackElementList {
+
+ /**
+ * Create an instance of this class.
+ *
+ * @param {HtmlTrackElement[]} [tracks=[]]
+ * A list of `HtmlTrackElement` to instantiate the list with.
+ */
+ constructor(trackElements = []) {
+ this.trackElements_ = [];
+
+ /**
+ * @memberof HtmlTrackElementList
+ * @member {number} length
+ * The current number of `Track`s in the this Trackist.
+ * @instance
+ */
+ Object.defineProperty(this, 'length', {
+ get() {
+ return this.trackElements_.length;
+ }
+ });
+
+ for (let i = 0, length = trackElements.length; i < length; i++) {
+ this.addTrackElement_(trackElements[i]);
+ }
+ }
+
+ /**
+ * Add an {@link HtmlTrackElement} to the `HtmlTrackElementList`
+ *
+ * @param {HtmlTrackElement} trackElement
+ * The track element to add to the list.
+ *
+ * @private
+ */
+ addTrackElement_(trackElement) {
+ const index = this.trackElements_.length;
+
+ if (!('' + index in this)) {
+ Object.defineProperty(this, index, {
+ get() {
+ return this.trackElements_[index];
+ }
+ });
+ }
+
+ // Do not add duplicate elements
+ if (this.trackElements_.indexOf(trackElement) === -1) {
+ this.trackElements_.push(trackElement);
+ }
+ }
+
+ /**
+ * Get an {@link HtmlTrackElement} from the `HtmlTrackElementList` given an
+ * {@link TextTrack}.
+ *
+ * @param {TextTrack} track
+ * The track associated with a track element.
+ *
+ * @return {HtmlTrackElement|undefined}
+ * The track element that was found or undefined.
+ *
+ * @private
+ */
+ getTrackElementByTrack_(track) {
+ let trackElement_;
+
+ for (let i = 0, length = this.trackElements_.length; i < length; i++) {
+ if (track === this.trackElements_[i].track) {
+ trackElement_ = this.trackElements_[i];
+
+ break;
+ }
+ }
+
+ return trackElement_;
+ }
+
+ /**
+ * Remove a {@link HtmlTrackElement} from the `HtmlTrackElementList`
+ *
+ * @param {HtmlTrackElement} trackElement
+ * The track element to remove from the list.
+ *
+ * @private
+ */
+ removeTrackElement_(trackElement) {
+ for (let i = 0, length = this.trackElements_.length; i < length; i++) {
+ if (trackElement === this.trackElements_[i]) {
+ if (this.trackElements_[i].track && typeof this.trackElements_[i].track.off === 'function') {
+ this.trackElements_[i].track.off();
+ }
+
+ if (typeof this.trackElements_[i].off === 'function') {
+ this.trackElements_[i].off();
+ }
+ this.trackElements_.splice(i, 1);
+ break;
+ }
+ }
+ }
+}
+
+export default HtmlTrackElementList;