shaka-player 3.3.0 → 3.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/pull_request_template.md +6 -34
  4. package/.github/workflows/build-and-test.yaml +130 -0
  5. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  6. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  7. package/.github/workflows/demo-version-index.yaml +29 -0
  8. package/.github/workflows/nightly-demo.yaml +42 -0
  9. package/.github/workflows/release-please.yaml +145 -0
  10. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  11. package/.github/workflows/selenium-lab-tests.yaml +93 -0
  12. package/AUTHORS +2 -0
  13. package/CHANGELOG.md +1722 -1640
  14. package/CONTRIBUTING.md +2 -2
  15. package/CONTRIBUTORS +2 -0
  16. package/README.md +7 -7
  17. package/app-engine/README.md +9 -0
  18. package/app-engine/demo-version-index/README.md +14 -0
  19. package/app-engine/demo-version-index/app.yaml +2 -0
  20. package/app-engine/demo-version-index/main.py +162 -0
  21. package/app-engine/demo-version-index/requirements.txt +6 -0
  22. package/app-engine/demo-version-index/templates/index.html +114 -0
  23. package/app-engine/shaka-player-demo/README.md +18 -0
  24. package/app-engine/shaka-player-demo/app.yaml +61 -0
  25. package/app-engine/shaka-player-demo/main.py +95 -0
  26. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  27. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  28. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  29. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  30. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  31. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  32. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  33. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  34. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  35. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  36. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  37. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  38. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  39. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  40. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  41. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  42. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  43. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  44. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  45. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  46. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  47. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  48. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  49. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  50. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  51. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  52. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  53. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  54. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  55. package/app-engine/shaka-player-demo/posters.py +110 -0
  56. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  57. package/app-engine/shaka-player-demo/time.txt +1 -0
  58. package/build/README.md +1 -1
  59. package/build/checkversion.py +1 -1
  60. package/build/conformance.textproto +196 -169
  61. package/build/docker/Dockerfile +20 -0
  62. package/build/docker/docker-compose.yml +10 -0
  63. package/build/gendeps.py +18 -15
  64. package/build/shaka-lab.yaml +163 -0
  65. package/build/shakaBuildHelpers.py +4 -29
  66. package/build/test.py +93 -28
  67. package/build/types/polyfill +1 -0
  68. package/build/wrapper.template.js +2 -2
  69. package/demo/TengwarTelcontar.woff2 +0 -0
  70. package/demo/asset_card.js +1 -2
  71. package/demo/cast_receiver/index.html +1 -1
  72. package/demo/cast_receiver/receiver_app.css +14 -14
  73. package/demo/common/assets.js +2 -0
  74. package/demo/config.js +0 -1
  75. package/demo/custom.js +0 -1
  76. package/demo/customWarning.txt +2 -2
  77. package/demo/demo.less +29 -18
  78. package/demo/demo_uncompiled.js +1 -13
  79. package/demo/index.html +1 -1
  80. package/demo/main.js +3 -3
  81. package/dist/controls.css +3 -3
  82. package/dist/controls.css.map +1 -1
  83. package/dist/demo.compiled.debug.js +191 -194
  84. package/dist/demo.compiled.debug.map +4 -4
  85. package/dist/demo.compiled.js +191 -194
  86. package/dist/demo.compiled.map +4 -4
  87. package/dist/demo.css +1 -1
  88. package/dist/demo.css.map +1 -1
  89. package/dist/deps.js +233 -226
  90. package/dist/locales.js +30 -30
  91. package/dist/receiver.compiled.debug.js +43 -45
  92. package/dist/receiver.compiled.debug.map +4 -4
  93. package/dist/receiver.compiled.js +43 -45
  94. package/dist/receiver.compiled.map +4 -4
  95. package/dist/shaka-player.compiled.d.ts +272 -238
  96. package/dist/shaka-player.compiled.debug.d.ts +272 -238
  97. package/dist/shaka-player.compiled.debug.externs.js +53 -16
  98. package/dist/shaka-player.compiled.debug.js +393 -394
  99. package/dist/shaka-player.compiled.debug.map +4 -4
  100. package/dist/shaka-player.compiled.externs.js +53 -16
  101. package/dist/shaka-player.compiled.js +840 -843
  102. package/dist/shaka-player.compiled.map +4 -4
  103. package/dist/shaka-player.ui.d.ts +318 -293
  104. package/dist/shaka-player.ui.debug.d.ts +318 -293
  105. package/dist/shaka-player.ui.debug.externs.js +55 -27
  106. package/dist/shaka-player.ui.debug.js +415 -417
  107. package/dist/shaka-player.ui.debug.map +4 -4
  108. package/dist/shaka-player.ui.externs.js +55 -27
  109. package/dist/shaka-player.ui.js +997 -1000
  110. package/dist/shaka-player.ui.map +4 -4
  111. package/docs/design/REDESIGN.md +33 -33
  112. package/docs/design/bg-fetch.md +2 -2
  113. package/docs/design/codec_preferences.md +1 -1
  114. package/docs/design/dash-audio-channels.md +3 -3
  115. package/docs/design/dash-manifests.md +1 -1
  116. package/docs/design/gap-jumping.md +3 -3
  117. package/docs/design/preload.md +2 -2
  118. package/docs/tutorials/faq.md +8 -8
  119. package/docs/tutorials/index.json +1 -0
  120. package/docs/tutorials/plugins.md +3 -3
  121. package/docs/tutorials/selenium-grid-config.md +122 -0
  122. package/docs/tutorials/welcome.md +10 -2
  123. package/externs/cmcd.js +186 -0
  124. package/externs/shaka/player.js +8 -0
  125. package/externs/shaka/text.js +10 -0
  126. package/karma.conf.js +156 -45
  127. package/lib/abr/simple_abr_manager.js +12 -6
  128. package/lib/ads/ad_manager.js +1 -0
  129. package/lib/cast/cast_proxy.js +6 -4
  130. package/lib/cast/cast_receiver.js +3 -0
  131. package/lib/cea/cea608_data_channel.js +2 -2
  132. package/lib/cea/cea708_service.js +5 -4
  133. package/lib/cea/mp4_cea_parser.js +11 -5
  134. package/lib/cea/sei_processor.js +6 -3
  135. package/lib/dash/dash_parser.js +40 -30
  136. package/lib/dash/mpd_utils.js +4 -5
  137. package/lib/dash/segment_list.js +1 -2
  138. package/lib/dash/segment_template.js +3 -3
  139. package/lib/hls/hls_parser.js +41 -9
  140. package/lib/hls/manifest_text_parser.js +4 -3
  141. package/lib/media/adaptation_set.js +1 -2
  142. package/lib/media/content_workarounds.js +2 -2
  143. package/lib/media/drm_engine.js +3 -2
  144. package/lib/media/media_source_engine.js +3 -2
  145. package/lib/media/mp4_segment_index_parser.js +1 -4
  146. package/lib/media/playhead.js +2 -2
  147. package/lib/media/presentation_timeline.js +18 -8
  148. package/lib/media/quality_observer.js +17 -34
  149. package/lib/media/region_observer.js +39 -33
  150. package/lib/media/region_timeline.js +17 -19
  151. package/lib/media/segment_index.js +2 -1
  152. package/lib/media/segment_reference.js +19 -1
  153. package/lib/media/streaming_engine.js +12 -9
  154. package/lib/media/time_ranges_utils.js +1 -3
  155. package/lib/media/video_wrapper.js +1 -1
  156. package/lib/net/networking_engine.js +5 -1
  157. package/lib/offline/storage.js +12 -13
  158. package/lib/player.js +87 -41
  159. package/lib/polyfill/all.js +2 -3
  160. package/lib/polyfill/encryption_scheme.js +1 -1
  161. package/lib/polyfill/media_capabilities.js +32 -17
  162. package/lib/polyfill/mediasource.js +1 -1
  163. package/lib/polyfill/symbol.js +46 -0
  164. package/lib/text/cue.js +7 -1
  165. package/lib/text/simple_text_displayer.js +2 -1
  166. package/lib/text/ttml_text_parser.js +92 -63
  167. package/lib/text/ui_text_displayer.js +18 -12
  168. package/lib/util/buffer_utils.js +1 -3
  169. package/lib/util/cmcd_manager.js +47 -201
  170. package/lib/util/ebml_parser.js +3 -3
  171. package/lib/util/error.js +1 -1
  172. package/lib/util/fake_event_target.js +21 -1
  173. package/lib/util/iterables.js +0 -46
  174. package/lib/util/mp4_box_parsers.js +1 -4
  175. package/lib/util/mp4_parser.js +5 -7
  176. package/lib/util/periods.js +10 -11
  177. package/lib/util/platform.js +3 -3
  178. package/lib/util/pssh.js +1 -4
  179. package/lib/util/stream_utils.js +88 -11
  180. package/lib/util/string_utils.js +3 -5
  181. package/lib/util/uint8array_utils.js +3 -5
  182. package/lib/util/xml_utils.js +34 -7
  183. package/package.json +62 -40
  184. package/roadmap.md +17 -17
  185. package/shaka-player.uncompiled.js +1 -0
  186. package/test/abr/simple_abr_manager_unit.js +3 -8
  187. package/test/ads/ad_manager_unit.js +0 -6
  188. package/test/cast/cast_proxy_unit.js +0 -8
  189. package/test/cast/cast_receiver_integration.js +1 -18
  190. package/test/cast/cast_receiver_unit.js +1 -9
  191. package/test/cast/cast_sender_unit.js +0 -6
  192. package/test/cast/cast_utils_unit.js +0 -13
  193. package/test/cea/cea608_memory_unit.js +0 -5
  194. package/test/cea/cea708_service_unit.js +0 -7
  195. package/test/cea/cea708_window_unit.js +0 -5
  196. package/test/cea/cea_decoder_unit.js +0 -6
  197. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  198. package/test/cea/dtvcc_packet_unit.js +0 -5
  199. package/test/cea/mp4_cea_parser_unit.js +0 -4
  200. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  201. package/test/dash/dash_parser_live_unit.js +45 -15
  202. package/test/dash/dash_parser_manifest_unit.js +4 -17
  203. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  204. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  205. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  206. package/test/dash/mpd_utils_unit.js +3 -11
  207. package/test/demo/demo_unit.js +0 -5
  208. package/test/deprecate/enforcer_unit.js +0 -4
  209. package/test/deprecate/version_unit.js +0 -2
  210. package/test/hls/hls_live_unit.js +2 -14
  211. package/test/hls/hls_parser_unit.js +76 -15
  212. package/test/hls/manifest_text_parser_unit.js +0 -10
  213. package/test/media/adaptation_set_criteria_unit.js +3 -7
  214. package/test/media/adaptation_set_unit.js +0 -2
  215. package/test/media/buffering_observer_unit.js +1 -4
  216. package/test/media/closed_caption_parser_unit.js +0 -3
  217. package/test/media/drm_engine_integration.js +2 -15
  218. package/test/media/drm_engine_unit.js +7 -27
  219. package/test/media/manifest_parser_unit.js +0 -4
  220. package/test/media/media_source_engine_integration.js +0 -7
  221. package/test/media/media_source_engine_unit.js +1 -14
  222. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  223. package/test/media/play_rate_controller_unit.js +0 -4
  224. package/test/media/playhead_unit.js +8 -16
  225. package/test/media/presentation_timeline_unit.js +4 -7
  226. package/test/media/quality_observer_unit.js +4 -5
  227. package/test/media/region_observer_unit.js +40 -10
  228. package/test/media/region_timeline_unit.js +40 -25
  229. package/test/media/segment_index_unit.js +0 -6
  230. package/test/media/segment_reference_unit.js +0 -3
  231. package/test/media/stall_detector_unit.js +0 -5
  232. package/test/media/streaming_engine_integration.js +11 -37
  233. package/test/media/streaming_engine_unit.js +155 -34
  234. package/test/media/time_ranges_utils_unit.js +0 -2
  235. package/test/media/transmuxer_integration.js +0 -6
  236. package/test/media/webm_segment_index_parser_unit.js +0 -4
  237. package/test/net/data_uri_plugin_unit.js +0 -7
  238. package/test/net/http_plugin_unit.js +0 -9
  239. package/test/net/networking_engine_unit.js +0 -11
  240. package/test/offline/download_progress_estimator_unit.js +0 -2
  241. package/test/offline/indexeddb_storage_unit.js +0 -6
  242. package/test/offline/manifest_convert_unit.js +0 -8
  243. package/test/offline/offline_integration.js +1 -10
  244. package/test/offline/offline_manifest_parser_unit.js +0 -6
  245. package/test/offline/offline_scheme_unit.js +0 -8
  246. package/test/offline/offline_uri_unit.js +0 -2
  247. package/test/offline/storage_compatibility_unit.js +1 -14
  248. package/test/offline/storage_integration.js +1 -27
  249. package/test/player_external.js +2 -10
  250. package/test/player_integration.js +63 -36
  251. package/test/player_load_graph_integration.js +1 -6
  252. package/test/player_src_equals_external.js +3 -9
  253. package/test/player_src_equals_integration.js +41 -15
  254. package/test/player_unit.js +71 -46
  255. package/test/routing/walker_unit.js +0 -8
  256. package/test/test/assets/chapters.vtt +2 -2
  257. package/test/test/assets/chapters2.vtt +10 -0
  258. package/test/test/assets/large_file.mpd +1 -1
  259. package/test/test/boot.js +75 -22
  260. package/test/test/externs/jasmine.js +2 -2
  261. package/test/test/externs/karma.js +4 -0
  262. package/test/test/namespace.js +10 -0
  263. package/test/test/util/canned_idb.js +0 -8
  264. package/test/test/util/cea_utils.js +0 -6
  265. package/test/test/util/dash_parser_util.js +0 -13
  266. package/test/test/util/fake_ad.js +0 -3
  267. package/test/test/util/fake_ad_manager.js +0 -9
  268. package/test/test/util/fake_demo_main.js +0 -5
  269. package/test/test/util/fake_drm_engine.js +0 -6
  270. package/test/test/util/fake_media_source_engine.js +0 -7
  271. package/test/test/util/fake_networking_engine.js +0 -5
  272. package/test/test/util/fake_text_displayer.js +0 -5
  273. package/test/test/util/indexeddb_utils.js +1 -10
  274. package/test/test/util/jasmine_fetch.js +0 -1
  275. package/test/test/util/loader.js +0 -18
  276. package/test/test/util/manifest_generator.js +9 -14
  277. package/test/test/util/manifest_parser_util.js +0 -6
  278. package/test/test/util/offline_utils.js +0 -5
  279. package/test/test/util/simple_fakes.js +9 -26
  280. package/test/test/util/stream_generator.js +0 -14
  281. package/test/test/util/streaming_engine_util.js +0 -15
  282. package/test/test/util/test_scheme.js +1 -19
  283. package/test/test/util/ttml_utils.js +79 -0
  284. package/test/test/util/ui_utils.js +0 -9
  285. package/test/test/util/util.js +15 -26
  286. package/test/test/util/waiter.js +84 -43
  287. package/test/text/cue_integration.js +0 -4
  288. package/test/text/lrc_text_parser_unit.js +0 -4
  289. package/test/text/mp4_ttml_parser_unit.js +10 -23
  290. package/test/text/mp4_vtt_parser_unit.js +1 -7
  291. package/test/text/sbv_text_parser_unit.js +0 -4
  292. package/test/text/simple_text_displayer_unit.js +1 -8
  293. package/test/text/srt_text_parser_unit.js +0 -4
  294. package/test/text/ssa_text_parser_unit.js +0 -5
  295. package/test/text/text_engine_unit.js +2 -7
  296. package/test/text/text_track_integration.js +0 -2
  297. package/test/text/ttml_text_parser_unit.js +499 -239
  298. package/test/text/ui_text_displayer_unit.js +44 -41
  299. package/test/text/vtt_text_parser_unit.js +0 -9
  300. package/test/text/web_vtt_generator_unit.js +0 -3
  301. package/test/ui/ad_ui_unit.js +0 -11
  302. package/test/ui/localization_unit.js +0 -3
  303. package/test/ui/text_displayer_layout_unit.js +9 -19
  304. package/test/ui/ui_customization_unit.js +0 -6
  305. package/test/ui/ui_integration.js +0 -16
  306. package/test/ui/ui_unit.js +1 -17
  307. package/test/util/abortable_operation_unit.js +4 -9
  308. package/test/util/array_utils_unit.js +0 -2
  309. package/test/util/buffer_utils_unit.js +0 -2
  310. package/test/util/cmcd_manager_unit.js +29 -18
  311. package/test/util/data_view_reader_unit.js +0 -4
  312. package/test/util/ebml_parser_unit.js +0 -4
  313. package/test/util/event_manager_unit.js +0 -3
  314. package/test/util/fake_event_target_unit.js +0 -5
  315. package/test/util/functional_unit.js +1 -1
  316. package/test/util/iterables_unit.js +0 -64
  317. package/test/util/language_utils_unit.js +0 -3
  318. package/test/util/manifest_parser_utils_unit.js +0 -2
  319. package/test/util/mp4_box_parsers_unit.js +0 -5
  320. package/test/util/mp4_parser_unit.js +0 -4
  321. package/test/util/multi_map_unit.js +0 -3
  322. package/test/util/object_utils_unit.js +0 -2
  323. package/test/util/periods_unit.js +14 -7
  324. package/test/util/pssh_unit.js +0 -5
  325. package/test/util/state_history_unit.js +0 -2
  326. package/test/util/stream_utils_unit.js +39 -38
  327. package/test/util/string_utils_unit.js +0 -6
  328. package/test/util/text_parser_unit.js +0 -2
  329. package/test/util/xml_utils_unit.js +0 -4
  330. package/third_party/closure-uri/uri.js +21 -0
  331. package/ui/controls.js +3 -0
  332. package/ui/less/ad_controls.less +4 -4
  333. package/ui/less/buttons.less +5 -5
  334. package/ui/less/containers.less +9 -11
  335. package/ui/less/overflow_menu.less +4 -4
  336. package/ui/less/range_elements.less +5 -0
  337. package/ui/less/tooltip.less +1 -1
  338. package/ui/locales/sjn-translations.yaml +257 -0
  339. package/ui/locales/sjn.json +42 -0
  340. package/ui/localization.js +12 -36
  341. package/ui/text_selection.js +1 -0
  342. package/externs/media_capabilities.js +0 -16
  343. package/externs/svgelement.js +0 -18
  344. package/externs/webcrypto.js +0 -18
package/lib/player.js CHANGED
@@ -787,6 +787,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
787
787
  await this.networkingEngine_.destroy();
788
788
  this.networkingEngine_ = null;
789
789
  }
790
+
791
+ // FakeEventTarget implements IReleasable
792
+ super.release();
790
793
  }
791
794
 
792
795
  /**
@@ -1691,17 +1694,26 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
1691
1694
  // initialize it now even through it appears a little out-of-place.
1692
1695
  this.regionTimeline_ =
1693
1696
  new shaka.media.RegionTimeline(() => this.seekRange());
1694
- this.regionTimeline_.setListeners(/* onRegionAdded= */ (region) => {
1697
+ this.regionTimeline_.addEventListener('regionadd', (event) => {
1698
+ /** @type {shaka.extern.TimelineRegionInfo} */
1699
+ const region = event['region'];
1695
1700
  this.onRegionEvent_(shaka.Player.EventName.TimelineRegionAdded, region);
1701
+
1696
1702
  if (this.adManager_) {
1697
1703
  this.adManager_.onDashTimedMetadata(region);
1698
1704
  }
1699
1705
  });
1706
+
1700
1707
  this.qualityObserver_ = null;
1701
1708
  if (this.config_.streaming.observeQualityChanges) {
1702
1709
  this.qualityObserver_ = new shaka.media.QualityObserver(
1703
1710
  () => this.getBufferedInfo());
1704
- this.qualityObserver_.setListeners((mediaQualityInfo, position) => {
1711
+
1712
+ this.qualityObserver_.addEventListener('qualitychange', (event) => {
1713
+ /** @type {shaka.extern.MediaQualityInfo} */
1714
+ const mediaQualityInfo = event['quality'];
1715
+ /** @type {number} */
1716
+ const position = event['position'];
1705
1717
  this.onMediaQualityChange_(mediaQualityInfo, position);
1706
1718
  });
1707
1719
  }
@@ -2205,6 +2217,14 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2205
2217
 
2206
2218
  this.playhead_ = new shaka.media.SrcEqualsPlayhead(has.mediaElement);
2207
2219
 
2220
+ // This flag is used below in the language preference setup and
2221
+ // track-management to check if this load was canceled before the necessary
2222
+ // events fired.
2223
+ let unloaded = false;
2224
+ this.cleanupOnUnload_.push(() => {
2225
+ unloaded = true;
2226
+ });
2227
+
2208
2228
  if (has.startTime != null) {
2209
2229
  this.playhead_.setStartTime(has.startTime);
2210
2230
  }
@@ -2232,7 +2252,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2232
2252
 
2233
2253
  // Wait for the 'loadedmetadata' event to measure load() latency, but only
2234
2254
  // if preload is set in a way that would result in this event firing
2235
- // automatically. See https://github.com/google/shaka-player/issues/2483
2255
+ // automatically.
2256
+ // See https://github.com/shaka-project/shaka-player/issues/2483
2236
2257
  if (this.video_.preload != 'none') {
2237
2258
  this.eventManager_.listenOnce(this.video_, 'loadedmetadata', () => {
2238
2259
  const now = Date.now() / 1000;
@@ -2255,6 +2276,12 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2255
2276
  }
2256
2277
  if (this.video_.textTracks) {
2257
2278
  this.eventManager_.listen(this.video_.textTracks, 'addtrack', (e) => {
2279
+ // If we have moved on to another piece of content while waiting for
2280
+ // the above event, we should not process tracks here.
2281
+ if (unloaded) {
2282
+ return;
2283
+ }
2284
+
2258
2285
  const trackEvent = /** @type {!TrackEvent} */(e);
2259
2286
  if (trackEvent.track) {
2260
2287
  const track = trackEvent.track;
@@ -2314,13 +2341,6 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2314
2341
  fullyLoaded.resolve();
2315
2342
  });
2316
2343
 
2317
- // This flag is used below in the language preference setup to check if this
2318
- // load was canceled before the necessary events fire.
2319
- let unloaded = false;
2320
- this.cleanupOnUnload_.push(() => {
2321
- unloaded = true;
2322
- });
2323
-
2324
2344
  // We can't switch to preferred languages, though, until the data is loaded.
2325
2345
  shaka.util.MediaReadyState.waitForReadyState(this.video_,
2326
2346
  HTMLMediaElement.HAVE_CURRENT_DATA,
@@ -2475,12 +2495,16 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2475
2495
  // In Safari the initial assignment does not always work, so we schedule
2476
2496
  // this process to be repeated several times to ensure that it has been put
2477
2497
  // in the correct mode.
2478
- new shaka.util.Timer(() => {
2498
+ const timer = new shaka.util.Timer(() => {
2479
2499
  const textTracks = this.getMetadataTracks_();
2480
2500
  for (const textTrack of textTracks) {
2481
2501
  textTrack.mode = 'hidden';
2482
2502
  }
2483
- }).tickNow().tickAfter(/* seconds= */ 0.5);
2503
+ }).tickNow().tickAfter(0.5);
2504
+
2505
+ this.cleanupOnUnload_.push(() => {
2506
+ timer.stop();
2507
+ });
2484
2508
  }
2485
2509
 
2486
2510
 
@@ -2548,12 +2572,16 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2548
2572
  // In Safari the initial assignment does not always work, so we schedule
2549
2573
  // this process to be repeated several times to ensure that it has been put
2550
2574
  // in the correct mode.
2551
- new shaka.util.Timer(() => {
2575
+ const timer = new shaka.util.Timer(() => {
2552
2576
  const chaptersTracks = this.getChaptersTracks_();
2553
2577
  for (const chaptersTrack of chaptersTracks) {
2554
2578
  chaptersTrack.mode = 'hidden';
2555
2579
  }
2556
- }).tickNow().tickAfter(/* seconds= */ 0.5);
2580
+ }).tickNow().tickAfter(0.5);
2581
+
2582
+ this.cleanupOnUnload_.push(() => {
2583
+ timer.stop();
2584
+ });
2557
2585
  }
2558
2586
 
2559
2587
  /**
@@ -2674,21 +2702,31 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2674
2702
  // Create the region observer. This will allow us to notify the app when we
2675
2703
  // move in and out of timeline regions.
2676
2704
  const regionObserver = new shaka.media.RegionObserver(this.regionTimeline_);
2677
- const onEnterRegion = (region, seeking) => {
2705
+
2706
+ regionObserver.addEventListener('enter', (event) => {
2707
+ /** @type {shaka.extern.TimelineRegionInfo} */
2708
+ const region = event['region'];
2678
2709
  this.onRegionEvent_(shaka.Player.EventName.TimelineRegionEnter, region);
2679
- };
2680
- const onExitRegion = (region, seeking) => {
2710
+ });
2711
+
2712
+ regionObserver.addEventListener('exit', (event) => {
2713
+ /** @type {shaka.extern.TimelineRegionInfo} */
2714
+ const region = event['region'];
2681
2715
  this.onRegionEvent_(shaka.Player.EventName.TimelineRegionExit, region);
2682
- };
2683
- const onSkipRegion = (region, seeking) => {
2716
+ });
2717
+
2718
+ regionObserver.addEventListener('skip', (event) => {
2719
+ /** @type {shaka.extern.TimelineRegionInfo} */
2720
+ const region = event['region'];
2721
+ /** @type {boolean} */
2722
+ const seeking = event['seeking'];
2684
2723
  // If we are seeking, we don't want to surface the enter/exit events since
2685
2724
  // they didn't play through them.
2686
2725
  if (!seeking) {
2687
2726
  this.onRegionEvent_(shaka.Player.EventName.TimelineRegionEnter, region);
2688
2727
  this.onRegionEvent_(shaka.Player.EventName.TimelineRegionExit, region);
2689
2728
  }
2690
- };
2691
- regionObserver.setListeners(onEnterRegion, onExitRegion, onSkipRegion);
2729
+ });
2692
2730
 
2693
2731
  // Now that we have all our observers, create a manager for them.
2694
2732
  const manager = new shaka.media.PlayheadObserverManager(this.video_);
@@ -2817,14 +2855,13 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2817
2855
  * @private
2818
2856
  */
2819
2857
  createCmcd_() {
2820
- const abr = this.abrManager_;
2821
-
2822
2858
  /** @type {shaka.util.CmcdManager.PlayerInterface} */
2823
2859
  const playerInterface = {
2824
- getBandwidthEstimate: () => abr ? abr.getBandwidthEstimate() : NaN,
2860
+ getBandwidthEstimate: () => this.abrManager_ ?
2861
+ this.abrManager_.getBandwidthEstimate() : NaN,
2825
2862
  getBufferedInfo: () => this.getBufferedInfo(),
2826
2863
  getCurrentTime: () => this.video_ ? this.video_.currentTime : 0,
2827
- getManifest: () => this.manifest_,
2864
+ getVariantTracks: () => this.getVariantTracks(),
2828
2865
  getPlaybackRate: () => this.getPlaybackRate(),
2829
2866
  isLive: () => this.isLive(),
2830
2867
  };
@@ -3613,7 +3650,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
3613
3650
  const height = fullImageHeight / rows;
3614
3651
  const totalImages = columns * rows;
3615
3652
  const segmentDuration = reference.trueEndTime - reference.startTime;
3616
- const thumbnailDuration = segmentDuration / totalImages;
3653
+ const thumbnailDuration =
3654
+ reference.getTileDuration() || (segmentDuration / totalImages);
3617
3655
  let thumbnailTime = reference.startTime;
3618
3656
  let positionX = 0;
3619
3657
  let positionY = 0;
@@ -3636,6 +3674,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
3636
3674
  positionY = Math.floor(thumbnailPosition / columns) * height;
3637
3675
  }
3638
3676
  return {
3677
+ imageHeight: fullImageHeight,
3678
+ imageWidth: fullImageWidth,
3639
3679
  height: height,
3640
3680
  positionX: positionX,
3641
3681
  positionY: positionY,
@@ -3680,7 +3720,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
3680
3720
  this.streamingEngine_.switchTextStream(stream);
3681
3721
  this.onTextChanged_();
3682
3722
 
3683
- // Workaround for https://github.com/google/shaka-player/issues/1299
3723
+ // Workaround for
3724
+ // https://github.com/shaka-project/shaka-player/issues/1299
3684
3725
  // When track is selected, back-propagate the language to
3685
3726
  // currentTextLanguage_.
3686
3727
  this.currentTextLanguage_ = stream.language;
@@ -3756,7 +3797,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
3756
3797
  this.switchVariant_(variant, /* fromAdaptation= */ false, clearBuffer,
3757
3798
  safeMargin);
3758
3799
 
3759
- // Workaround for https://github.com/google/shaka-player/issues/1299
3800
+ // Workaround for
3801
+ // https://github.com/shaka-project/shaka-player/issues/1299
3760
3802
  // When track is selected, back-propagate the language to
3761
3803
  // currentAudioLanguage_.
3762
3804
  this.currentAdaptationSetCriteria_ = new shaka.media.ExampleBasedCriteria(
@@ -4037,20 +4079,24 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
4037
4079
  const LanguageUtils = shaka.util.LanguageUtils;
4038
4080
  const inputlanguage = LanguageUtils.normalize(language);
4039
4081
  const chaptersTracks = this.getChaptersTracks_();
4040
- const chaptersTrack = chaptersTracks
4041
- .find((t) => LanguageUtils.normalize(t.language) == inputlanguage);
4042
- if (!chaptersTrack || !chaptersTrack.cues) {
4082
+ const chaptersTracksWithLanguage = chaptersTracks
4083
+ .filter((t) => LanguageUtils.normalize(t.language) == inputlanguage);
4084
+ if (!chaptersTracksWithLanguage || !chaptersTracksWithLanguage.length) {
4043
4085
  return [];
4044
4086
  }
4045
4087
  const chapters = [];
4046
- for (const cue of chaptersTrack.cues) {
4047
- /** @type {shaka.extern.Chapter} */
4048
- const chapter = {
4049
- title: cue.text,
4050
- startTime: cue.startTime,
4051
- endTime: cue.endTime,
4052
- };
4053
- chapters.push(chapter);
4088
+ for (const chaptersTrack of chaptersTracksWithLanguage) {
4089
+ if (chaptersTrack && chaptersTrack.cues) {
4090
+ for (const cue of chaptersTrack.cues) {
4091
+ /** @type {shaka.extern.Chapter} */
4092
+ const chapter = {
4093
+ title: cue.text,
4094
+ startTime: cue.startTime,
4095
+ endTime: cue.endTime,
4096
+ };
4097
+ chapters.push(chapter);
4098
+ }
4099
+ }
4054
4100
  }
4055
4101
  return chapters;
4056
4102
  }
@@ -5224,7 +5270,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
5224
5270
  // If the playback rate changes while seeking, Edge will cache the playback
5225
5271
  // rate and use it after seeking.
5226
5272
  //
5227
- // https://github.com/google/shaka-player/issues/951
5273
+ // https://github.com/shaka-project/shaka-player/issues/951
5228
5274
  if (newRate == 0) {
5229
5275
  return;
5230
5276
  }
@@ -6530,7 +6576,7 @@ shaka.Player.TYPICAL_BUFFERING_THRESHOLD_ = 0.5;
6530
6576
  * @define {string} A version number taken from git at compile time.
6531
6577
  * @export
6532
6578
  */
6533
- shaka.Player.version = 'v3.3.0-uncompiled';
6579
+ shaka.Player.version = 'v3.3.3-uncompiled';
6534
6580
 
6535
6581
  // Initialize the deprecation system using the version string we just set
6536
6582
  // on the player.
@@ -7,7 +7,6 @@
7
7
  goog.provide('shaka.polyfill');
8
8
 
9
9
  goog.require('shaka.log');
10
- goog.require('shaka.util.Iterables');
11
10
 
12
11
 
13
12
  /**
@@ -40,8 +39,8 @@ shaka.polyfill = class {
40
39
  */
41
40
  static register(polyfill, priority) {
42
41
  const newItem = {priority: priority || 0, callback: polyfill};
43
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
44
- for (const {i, item} of enumerate(shaka.polyfill.polyfills_)) {
42
+ for (let i = 0; i < shaka.polyfill.polyfills_.length; i++) {
43
+ const item = shaka.polyfill.polyfills_[i];
45
44
  if (item.priority < newItem.priority) {
46
45
  shaka.polyfill.polyfills_.splice(i, 0, newItem);
47
46
  return;
@@ -12,7 +12,7 @@ goog.require('shaka.polyfill');
12
12
  * @summary A polyfill to add support for EncryptionScheme queries in EME.
13
13
  * @see https://wicg.github.io/encrypted-media-encryption-scheme/
14
14
  * @see https://github.com/w3c/encrypted-media/pull/457
15
- * @see https://github.com/google/eme-encryption-scheme-polyfill
15
+ * @see https://github.com/shaka-project/eme-encryption-scheme-polyfill
16
16
  * @export
17
17
  */
18
18
  shaka.polyfill.EncryptionScheme = class {
@@ -24,37 +24,42 @@ shaka.polyfill.MediaCapabilities = class {
24
24
  * @export
25
25
  */
26
26
  static install() {
27
- shaka.log.debug('MediaCapabilities: install');
28
-
29
27
  // Since MediaCapabilities is not fully supported on Chromecast yet, we
30
28
  // should always install polyfill for Chromecast.
31
29
  // TODO: re-evaluate MediaCapabilities in the future versions of Chromecast.
32
30
  // Since MediaCapabilities implementation is buggy in Apple browsers, we
33
31
  // should always install polyfill for Apple browsers.
34
- // See: https://github.com/google/shaka-player/issues/3530
32
+ // See: https://github.com/shaka-project/shaka-player/issues/3530
35
33
  // TODO: re-evaluate MediaCapabilities in the future versions of Apple
36
34
  // Browsers.
37
35
  // Since MediaCapabilities implementation is buggy in PS5 browsers, we
38
36
  // should always install polyfill for PS5 browsers.
39
- // See: https://github.com/google/shaka-player/issues/3582
37
+ // See: https://github.com/shaka-project/shaka-player/issues/3582
40
38
  // TODO: re-evaluate MediaCapabilities in the future versions of PS5
41
39
  // Browsers.
42
40
  if (!shaka.util.Platform.isChromecast() &&
43
- !shaka.util.Platform.isApple() &&
44
- !shaka.util.Platform.isPS5() &&
45
- navigator.mediaCapabilities) {
46
- shaka.log.debug(
41
+ !shaka.util.Platform.isApple() &&
42
+ !shaka.util.Platform.isPS5() &&
43
+ navigator.mediaCapabilities) {
44
+ shaka.log.info(
47
45
  'MediaCapabilities: Native mediaCapabilities support found.');
48
- } else {
49
- if (!navigator.mediaCapabilities) {
50
- navigator.mediaCapabilities = /** @type {!MediaCapabilities} */ ({});
51
- }
52
- navigator.mediaCapabilities.decodingInfo =
53
- shaka.polyfill.MediaCapabilities.decodingInfo_;
46
+ return;
47
+ }
48
+
49
+ shaka.log.info('MediaCapabilities: install');
50
+
51
+ if (!navigator.mediaCapabilities) {
52
+ navigator.mediaCapabilities = /** @type {!MediaCapabilities} */ ({});
54
53
  }
55
- // Workaround because in Apple browsers there is no way to overwrite
56
- // MediaCapabilities.
57
- window.shakaMediaCapabilities = navigator.mediaCapabilities;
54
+
55
+ // Keep the patched MediaCapabilities object from being garbage-collected in
56
+ // Safari.
57
+ // See https://github.com/shaka-project/shaka-player/issues/3696#issuecomment-1009472718
58
+ shaka.polyfill.MediaCapabilities.originalMcap =
59
+ navigator.mediaCapabilities;
60
+
61
+ navigator.mediaCapabilities.decodingInfo =
62
+ shaka.polyfill.MediaCapabilities.decodingInfo_;
58
63
  }
59
64
 
60
65
  /**
@@ -182,6 +187,16 @@ shaka.polyfill.MediaCapabilities = class {
182
187
  }
183
188
  };
184
189
 
190
+ /**
191
+ * A copy of the MediaCapabilities instance, to prevent Safari from
192
+ * garbage-collecting the polyfilled method on it. We make it public and export
193
+ * it to ensure that it is not stripped out by the compiler.
194
+ *
195
+ * @type {MediaCapabilities}
196
+ * @export
197
+ */
198
+ shaka.polyfill.MediaCapabilities.originalMcap = null;
199
+
185
200
  // Install at a lower priority than MediaSource polyfill, so that we have
186
201
  // MediaSource available first.
187
202
  shaka.polyfill.register(shaka.polyfill.MediaCapabilities.install, -1);
@@ -39,7 +39,7 @@ shaka.polyfill.MediaSource = class {
39
39
  shaka.polyfill.MediaSource.patchCastIsTypeSupported_();
40
40
  } else if (safariVersion) {
41
41
  // TS content is broken on Safari in general.
42
- // See https://github.com/google/shaka-player/issues/743
42
+ // See https://github.com/shaka-project/shaka-player/issues/743
43
43
  // and https://bugs.webkit.org/show_bug.cgi?id=165342
44
44
  shaka.polyfill.MediaSource.rejectTsContent_();
45
45
 
@@ -0,0 +1,46 @@
1
+ /*! @license
2
+ * Shaka Player
3
+ * Copyright 2016 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ goog.provide('shaka.polyfill.Symbol');
7
+
8
+ goog.require('shaka.log');
9
+ goog.require('shaka.polyfill');
10
+
11
+ /**
12
+ * @summary A polyfill to provide Symbol.prototype.description in all browsers.
13
+ * See: https://caniuse.com/mdn-javascript_builtins_symbol_description
14
+ * @export
15
+ */
16
+ shaka.polyfill.Symbol = class {
17
+ /**
18
+ * Install the polyfill if needed.
19
+ * @export
20
+ */
21
+ static install() {
22
+ shaka.log.debug('Symbol.install');
23
+
24
+ // eslint-disable-next-line no-restricted-syntax
25
+ const proto = Symbol.prototype;
26
+
27
+ if (!('description' in proto)) {
28
+ Object.defineProperty(proto, 'description', {
29
+ get: shaka.polyfill.Symbol.getSymbolDescription_,
30
+ });
31
+ }
32
+ }
33
+
34
+ /**
35
+ * @this {Symbol}
36
+ * @return {(string|undefined)}
37
+ * @private
38
+ */
39
+ static getSymbolDescription_() {
40
+ const m = /\((.*)\)/.exec(this.toString());
41
+ return m ? m[1] : undefined;
42
+ }
43
+ };
44
+
45
+
46
+ shaka.polyfill.register(shaka.polyfill.Symbol.install);
package/lib/text/cue.js CHANGED
@@ -222,6 +222,12 @@ shaka.text.Cue = class {
222
222
  */
223
223
  this.nestedCues = [];
224
224
 
225
+ /**
226
+ * @override
227
+ * @exportInterface
228
+ */
229
+ this.isContainer = false;
230
+
225
231
  /**
226
232
  * @override
227
233
  * @exportInterface
@@ -288,7 +294,7 @@ shaka.text.Cue = class {
288
294
  // Compare the start time, end time and payload of the cues first for
289
295
  // performance optimization. We can avoid the more expensive recursive
290
296
  // checks if the top-level properties don't match.
291
- // See: https://github.com/google/shaka-player/issues/3018
297
+ // See: https://github.com/shaka-project/shaka-player/issues/3018
292
298
  if (cue1.startTime != cue2.startTime || cue1.endTime != cue2.endTime ||
293
299
  cue1.payload != cue2.payload) {
294
300
  return false;
@@ -178,7 +178,8 @@ shaka.text.SimpleTextDisplayer = class {
178
178
  // The browser will display cues with identical time ranges from the
179
179
  // bottom up. Reversing the order of equal cues means the first one
180
180
  // parsed will be at the top, as you would expect.
181
- // See https://github.com/google/shaka-player/issues/848 for more info.
181
+ // See https://github.com/shaka-project/shaka-player/issues/848 for
182
+ // more info.
182
183
  // However, this ordering behavior is part of VTTCue's "line" field.
183
184
  // Some platforms don't have a real VTTCue and use a polyfill instead.
184
185
  // When VTTCue is polyfilled or does not support "line", we should _not_