1. 1 : /**
  2. 2 : * @file html-track-element-list.js
  3. 3 : */
  4. 4 :
  5. 5 : /**
  6. 6 : * The current list of {@link HtmlTrackElement}s.
  7. 7 : */
  8. 8 : class HtmlTrackElementList {
  9. 9 :
  10. 10 : /**
  11. 11 : * Create an instance of this class.
  12. 12 : *
  13. 13 : * @param {HtmlTrackElement[]} [tracks=[]]
  14. 14 : * A list of `HtmlTrackElement` to instantiate the list with.
  15. 15 : */
  16. 16 : constructor(trackElements = []) {
  17. 17 : this.trackElements_ = [];
  18. 18 :
  19. 19 : /**
  20. 20 : * @memberof HtmlTrackElementList
  21. 21 : * @member {number} length
  22. 22 : * The current number of `Track`s in the this Trackist.
  23. 23 : * @instance
  24. 24 : */
  25. 25 : Object.defineProperty(this, 'length', {
  26. 26 : get() {
  27. 27 : return this.trackElements_.length;
  28. 28 : }
  29. 29 : });
  30. 30 :
  31. 31 : for (let i = 0, length = trackElements.length; i < length; i++) {
  32. 32 : this.addTrackElement_(trackElements[i]);
  33. 33 : }
  34. 34 : }
  35. 35 :
  36. 36 : /**
  37. 37 : * Add an {@link HtmlTrackElement} to the `HtmlTrackElementList`
  38. 38 : *
  39. 39 : * @param {HtmlTrackElement} trackElement
  40. 40 : * The track element to add to the list.
  41. 41 : *
  42. 42 : * @private
  43. 43 : */
  44. 44 : addTrackElement_(trackElement) {
  45. 45 : const index = this.trackElements_.length;
  46. 46 :
  47. 47 : if (!('' + index in this)) {
  48. 48 : Object.defineProperty(this, index, {
  49. 49 : get() {
  50. 50 : return this.trackElements_[index];
  51. 51 : }
  52. 52 : });
  53. 53 : }
  54. 54 :
  55. 55 : // Do not add duplicate elements
  56. 56 : if (this.trackElements_.indexOf(trackElement) === -1) {
  57. 57 : this.trackElements_.push(trackElement);
  58. 58 : }
  59. 59 : }
  60. 60 :
  61. 61 : /**
  62. 62 : * Get an {@link HtmlTrackElement} from the `HtmlTrackElementList` given an
  63. 63 : * {@link TextTrack}.
  64. 64 : *
  65. 65 : * @param {TextTrack} track
  66. 66 : * The track associated with a track element.
  67. 67 : *
  68. 68 : * @return {HtmlTrackElement|undefined}
  69. 69 : * The track element that was found or undefined.
  70. 70 : *
  71. 71 : * @private
  72. 72 : */
  73. 73 : getTrackElementByTrack_(track) {
  74. 74 : let trackElement_;
  75. 75 :
  76. 76 : for (let i = 0, length = this.trackElements_.length; i < length; i++) {
  77. 77 : if (track === this.trackElements_[i].track) {
  78. 78 : trackElement_ = this.trackElements_[i];
  79. 79 :
  80. 80 : break;
  81. 81 : }
  82. 82 : }
  83. 83 :
  84. 84 : return trackElement_;
  85. 85 : }
  86. 86 :
  87. 87 : /**
  88. 88 : * Remove a {@link HtmlTrackElement} from the `HtmlTrackElementList`
  89. 89 : *
  90. 90 : * @param {HtmlTrackElement} trackElement
  91. 91 : * The track element to remove from the list.
  92. 92 : *
  93. 93 : * @private
  94. 94 : */
  95. 95 : removeTrackElement_(trackElement) {
  96. 96 : for (let i = 0, length = this.trackElements_.length; i < length; i++) {
  97. 97 : if (trackElement === this.trackElements_[i]) {
  98. 98 : if (this.trackElements_[i].track && typeof this.trackElements_[i].track.off === 'function') {
  99. 99 : this.trackElements_[i].track.off();
  100. 100 : }
  101. 101 :
  102. 102 : if (typeof this.trackElements_[i].off === 'function') {
  103. 103 : this.trackElements_[i].off();
  104. 104 : }
  105. 105 : this.trackElements_.splice(i, 1);
  106. 106 : break;
  107. 107 : }
  108. 108 : }
  109. 109 : }
  110. 110 : }
  111. 111 :
  112. 112 : export default HtmlTrackElementList;