shaka-player 3.2.2 → 3.2.5

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 (331) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/workflows/build-and-test.yaml +130 -0
  4. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  5. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  6. package/.github/workflows/demo-version-index.yaml +29 -0
  7. package/.github/workflows/nightly-demo.yaml +42 -0
  8. package/.github/workflows/release-please.yaml +145 -0
  9. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  10. package/.github/workflows/selenium-lab-tests.yaml +93 -0
  11. package/AUTHORS +2 -0
  12. package/CHANGELOG.md +1598 -1525
  13. package/CONTRIBUTING.md +2 -2
  14. package/CONTRIBUTORS +2 -0
  15. package/README.md +7 -7
  16. package/app-engine/README.md +9 -0
  17. package/app-engine/demo-version-index/README.md +14 -0
  18. package/app-engine/demo-version-index/app.yaml +2 -0
  19. package/app-engine/demo-version-index/main.py +162 -0
  20. package/app-engine/demo-version-index/requirements.txt +6 -0
  21. package/app-engine/demo-version-index/templates/index.html +114 -0
  22. package/app-engine/shaka-player-demo/README.md +18 -0
  23. package/app-engine/shaka-player-demo/app.yaml +61 -0
  24. package/app-engine/shaka-player-demo/main.py +95 -0
  25. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  26. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  27. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  28. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  29. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  30. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  31. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  32. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  33. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  34. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  35. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  36. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  37. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  38. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  39. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  40. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  41. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  42. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  43. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  44. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  45. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  46. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  47. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  48. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  49. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  50. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  51. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  52. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  53. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  54. package/app-engine/shaka-player-demo/posters.py +110 -0
  55. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  56. package/app-engine/shaka-player-demo/time.txt +1 -0
  57. package/build/README.md +1 -1
  58. package/build/checkversion.py +1 -1
  59. package/build/conformance.textproto +13 -0
  60. package/build/docker/Dockerfile +20 -0
  61. package/build/docker/docker-compose.yml +10 -0
  62. package/build/gendeps.py +18 -15
  63. package/build/shaka-lab.yaml +163 -0
  64. package/build/shakaBuildHelpers.py +4 -29
  65. package/build/test.py +93 -28
  66. package/build/wrapper.template.js +2 -2
  67. package/demo/TengwarTelcontar.woff2 +0 -0
  68. package/demo/asset_card.js +1 -2
  69. package/demo/cast_receiver/index.html +1 -1
  70. package/demo/cast_receiver/receiver_app.css +14 -14
  71. package/demo/common/assets.js +2 -0
  72. package/demo/config.js +0 -1
  73. package/demo/custom.js +0 -1
  74. package/demo/customWarning.txt +2 -2
  75. package/demo/demo.less +29 -18
  76. package/demo/demo_uncompiled.js +1 -13
  77. package/demo/index.html +1 -1
  78. package/demo/main.js +3 -3
  79. package/dist/controls.css +2 -2
  80. package/dist/controls.css.map +1 -1
  81. package/dist/demo.compiled.debug.js +191 -194
  82. package/dist/demo.compiled.debug.map +4 -4
  83. package/dist/demo.compiled.js +191 -194
  84. package/dist/demo.compiled.map +4 -4
  85. package/dist/demo.css +1 -1
  86. package/dist/demo.css.map +1 -1
  87. package/dist/deps.js +225 -219
  88. package/dist/locales.js +31 -31
  89. package/dist/receiver.compiled.debug.js +43 -45
  90. package/dist/receiver.compiled.debug.map +4 -4
  91. package/dist/receiver.compiled.js +43 -45
  92. package/dist/receiver.compiled.map +4 -4
  93. package/dist/shaka-player.compiled.d.ts +247 -227
  94. package/dist/shaka-player.compiled.debug.d.ts +247 -227
  95. package/dist/shaka-player.compiled.debug.externs.js +43 -16
  96. package/dist/shaka-player.compiled.debug.js +384 -388
  97. package/dist/shaka-player.compiled.debug.map +4 -4
  98. package/dist/shaka-player.compiled.externs.js +43 -16
  99. package/dist/shaka-player.compiled.js +818 -817
  100. package/dist/shaka-player.compiled.map +4 -4
  101. package/dist/shaka-player.ui.d.ts +291 -280
  102. package/dist/shaka-player.ui.debug.d.ts +291 -280
  103. package/dist/shaka-player.ui.debug.externs.js +45 -27
  104. package/dist/shaka-player.ui.debug.js +389 -394
  105. package/dist/shaka-player.ui.debug.map +4 -4
  106. package/dist/shaka-player.ui.externs.js +45 -27
  107. package/dist/shaka-player.ui.js +964 -965
  108. package/dist/shaka-player.ui.map +4 -4
  109. package/docs/design/REDESIGN.md +33 -33
  110. package/docs/design/codec_preferences.md +1 -1
  111. package/docs/design/dash-audio-channels.md +3 -3
  112. package/docs/design/dash-manifests.md +1 -1
  113. package/docs/design/gap-jumping.md +3 -3
  114. package/docs/design/preload.md +2 -2
  115. package/docs/tutorials/faq.md +8 -8
  116. package/docs/tutorials/index.json +1 -0
  117. package/docs/tutorials/plugins.md +3 -3
  118. package/docs/tutorials/selenium-grid-config.md +122 -0
  119. package/docs/tutorials/welcome.md +10 -2
  120. package/externs/shaka/player.js +8 -0
  121. package/externs/shaka/text.js +10 -0
  122. package/karma.conf.js +156 -45
  123. package/lib/abr/simple_abr_manager.js +12 -6
  124. package/lib/ads/ad_manager.js +1 -0
  125. package/lib/cast/cast_proxy.js +6 -4
  126. package/lib/cast/cast_receiver.js +3 -0
  127. package/lib/cea/cea608_data_channel.js +2 -2
  128. package/lib/cea/cea708_service.js +5 -4
  129. package/lib/cea/mp4_cea_parser.js +11 -5
  130. package/lib/cea/sei_processor.js +6 -3
  131. package/lib/dash/dash_parser.js +43 -31
  132. package/lib/dash/mpd_utils.js +4 -5
  133. package/lib/dash/segment_list.js +1 -2
  134. package/lib/dash/segment_template.js +3 -3
  135. package/lib/hls/hls_parser.js +41 -9
  136. package/lib/hls/manifest_text_parser.js +4 -3
  137. package/lib/media/adaptation_set.js +1 -2
  138. package/lib/media/content_workarounds.js +2 -2
  139. package/lib/media/drm_engine.js +3 -2
  140. package/lib/media/media_source_engine.js +3 -2
  141. package/lib/media/mp4_segment_index_parser.js +1 -4
  142. package/lib/media/playhead.js +2 -2
  143. package/lib/media/presentation_timeline.js +18 -8
  144. package/lib/media/region_observer.js +39 -33
  145. package/lib/media/region_timeline.js +17 -19
  146. package/lib/media/segment_index.js +2 -1
  147. package/lib/media/segment_reference.js +19 -1
  148. package/lib/media/streaming_engine.js +12 -9
  149. package/lib/media/time_ranges_utils.js +1 -3
  150. package/lib/media/video_wrapper.js +1 -1
  151. package/lib/net/networking_engine.js +5 -1
  152. package/lib/offline/storage.js +12 -13
  153. package/lib/player.js +77 -36
  154. package/lib/polyfill/all.js +2 -3
  155. package/lib/polyfill/encryption_scheme.js +1 -1
  156. package/lib/polyfill/media_capabilities.js +32 -17
  157. package/lib/polyfill/mediasource.js +1 -1
  158. package/lib/text/cue.js +7 -1
  159. package/lib/text/simple_text_displayer.js +2 -1
  160. package/lib/text/ttml_text_parser.js +92 -63
  161. package/lib/text/ui_text_displayer.js +18 -12
  162. package/lib/util/buffer_utils.js +1 -3
  163. package/lib/util/ebml_parser.js +3 -3
  164. package/lib/util/error.js +1 -1
  165. package/lib/util/fake_event_target.js +21 -1
  166. package/lib/util/iterables.js +0 -46
  167. package/lib/util/mp4_box_parsers.js +1 -4
  168. package/lib/util/mp4_parser.js +5 -7
  169. package/lib/util/periods.js +8 -9
  170. package/lib/util/platform.js +3 -3
  171. package/lib/util/pssh.js +1 -4
  172. package/lib/util/stream_utils.js +88 -11
  173. package/lib/util/string_utils.js +3 -5
  174. package/lib/util/uint8array_utils.js +3 -5
  175. package/lib/util/xml_utils.js +34 -7
  176. package/package.json +62 -40
  177. package/roadmap.md +17 -17
  178. package/test/abr/simple_abr_manager_unit.js +3 -8
  179. package/test/ads/ad_manager_unit.js +0 -6
  180. package/test/cast/cast_proxy_unit.js +0 -8
  181. package/test/cast/cast_receiver_integration.js +1 -18
  182. package/test/cast/cast_receiver_unit.js +1 -9
  183. package/test/cast/cast_sender_unit.js +0 -6
  184. package/test/cast/cast_utils_unit.js +0 -13
  185. package/test/cea/cea608_memory_unit.js +0 -5
  186. package/test/cea/cea708_service_unit.js +0 -7
  187. package/test/cea/cea708_window_unit.js +0 -5
  188. package/test/cea/cea_decoder_unit.js +0 -6
  189. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  190. package/test/cea/dtvcc_packet_unit.js +0 -5
  191. package/test/cea/mp4_cea_parser_unit.js +0 -4
  192. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  193. package/test/dash/dash_parser_live_unit.js +45 -15
  194. package/test/dash/dash_parser_manifest_unit.js +37 -18
  195. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  196. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  197. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  198. package/test/dash/mpd_utils_unit.js +3 -11
  199. package/test/demo/demo_unit.js +0 -5
  200. package/test/deprecate/enforcer_unit.js +0 -4
  201. package/test/deprecate/version_unit.js +0 -2
  202. package/test/hls/hls_live_unit.js +2 -14
  203. package/test/hls/hls_parser_unit.js +76 -15
  204. package/test/hls/manifest_text_parser_unit.js +0 -10
  205. package/test/media/adaptation_set_criteria_unit.js +3 -7
  206. package/test/media/adaptation_set_unit.js +0 -2
  207. package/test/media/buffering_observer_unit.js +1 -4
  208. package/test/media/closed_caption_parser_unit.js +0 -3
  209. package/test/media/drm_engine_integration.js +2 -15
  210. package/test/media/drm_engine_unit.js +7 -27
  211. package/test/media/manifest_parser_unit.js +0 -4
  212. package/test/media/media_source_engine_integration.js +0 -7
  213. package/test/media/media_source_engine_unit.js +1 -14
  214. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  215. package/test/media/play_rate_controller_unit.js +0 -4
  216. package/test/media/playhead_unit.js +8 -16
  217. package/test/media/presentation_timeline_unit.js +4 -7
  218. package/test/media/region_observer_unit.js +40 -10
  219. package/test/media/region_timeline_unit.js +40 -25
  220. package/test/media/segment_index_unit.js +0 -6
  221. package/test/media/segment_reference_unit.js +0 -3
  222. package/test/media/stall_detector_unit.js +0 -5
  223. package/test/media/streaming_engine_integration.js +11 -37
  224. package/test/media/streaming_engine_unit.js +155 -34
  225. package/test/media/time_ranges_utils_unit.js +0 -2
  226. package/test/media/transmuxer_integration.js +0 -6
  227. package/test/media/webm_segment_index_parser_unit.js +0 -4
  228. package/test/net/data_uri_plugin_unit.js +0 -7
  229. package/test/net/http_plugin_unit.js +0 -9
  230. package/test/net/networking_engine_unit.js +0 -11
  231. package/test/offline/download_progress_estimator_unit.js +0 -2
  232. package/test/offline/indexeddb_storage_unit.js +0 -6
  233. package/test/offline/manifest_convert_unit.js +0 -8
  234. package/test/offline/offline_integration.js +1 -10
  235. package/test/offline/offline_manifest_parser_unit.js +0 -6
  236. package/test/offline/offline_scheme_unit.js +0 -8
  237. package/test/offline/offline_uri_unit.js +0 -2
  238. package/test/offline/storage_compatibility_unit.js +1 -14
  239. package/test/offline/storage_integration.js +1 -25
  240. package/test/player_external.js +2 -10
  241. package/test/player_integration.js +62 -36
  242. package/test/player_load_graph_integration.js +1 -6
  243. package/test/player_src_equals_external.js +3 -9
  244. package/test/player_src_equals_integration.js +41 -15
  245. package/test/player_unit.js +71 -46
  246. package/test/routing/walker_unit.js +0 -8
  247. package/test/test/assets/chapters.vtt +2 -2
  248. package/test/test/assets/chapters2.vtt +10 -0
  249. package/test/test/assets/large_file.mpd +1 -1
  250. package/test/test/boot.js +75 -22
  251. package/test/test/externs/jasmine.js +2 -2
  252. package/test/test/externs/karma.js +4 -0
  253. package/test/test/namespace.js +10 -0
  254. package/test/test/util/canned_idb.js +0 -8
  255. package/test/test/util/cea_utils.js +0 -6
  256. package/test/test/util/dash_parser_util.js +0 -13
  257. package/test/test/util/fake_ad.js +0 -3
  258. package/test/test/util/fake_ad_manager.js +0 -9
  259. package/test/test/util/fake_demo_main.js +0 -5
  260. package/test/test/util/fake_drm_engine.js +0 -6
  261. package/test/test/util/fake_media_source_engine.js +0 -7
  262. package/test/test/util/fake_networking_engine.js +0 -5
  263. package/test/test/util/fake_text_displayer.js +0 -5
  264. package/test/test/util/indexeddb_utils.js +1 -10
  265. package/test/test/util/jasmine_fetch.js +0 -1
  266. package/test/test/util/loader.js +0 -18
  267. package/test/test/util/manifest_generator.js +9 -14
  268. package/test/test/util/manifest_parser_util.js +0 -6
  269. package/test/test/util/offline_utils.js +0 -5
  270. package/test/test/util/simple_fakes.js +9 -26
  271. package/test/test/util/stream_generator.js +0 -14
  272. package/test/test/util/streaming_engine_util.js +0 -15
  273. package/test/test/util/test_scheme.js +1 -19
  274. package/test/test/util/ttml_utils.js +79 -0
  275. package/test/test/util/ui_utils.js +0 -9
  276. package/test/test/util/util.js +15 -26
  277. package/test/test/util/waiter.js +84 -43
  278. package/test/text/cue_integration.js +0 -4
  279. package/test/text/lrc_text_parser_unit.js +0 -4
  280. package/test/text/mp4_ttml_parser_unit.js +10 -23
  281. package/test/text/mp4_vtt_parser_unit.js +1 -7
  282. package/test/text/sbv_text_parser_unit.js +0 -4
  283. package/test/text/simple_text_displayer_unit.js +1 -8
  284. package/test/text/srt_text_parser_unit.js +0 -4
  285. package/test/text/ssa_text_parser_unit.js +0 -5
  286. package/test/text/text_engine_unit.js +2 -7
  287. package/test/text/text_track_integration.js +0 -2
  288. package/test/text/ttml_text_parser_unit.js +495 -237
  289. package/test/text/ui_text_displayer_unit.js +44 -41
  290. package/test/text/vtt_text_parser_unit.js +0 -9
  291. package/test/text/web_vtt_generator_unit.js +0 -3
  292. package/test/ui/ad_ui_unit.js +0 -11
  293. package/test/ui/localization_unit.js +0 -3
  294. package/test/ui/text_displayer_layout_unit.js +9 -19
  295. package/test/ui/ui_customization_unit.js +0 -6
  296. package/test/ui/ui_integration.js +0 -16
  297. package/test/ui/ui_unit.js +1 -17
  298. package/test/util/abortable_operation_unit.js +4 -9
  299. package/test/util/array_utils_unit.js +0 -2
  300. package/test/util/buffer_utils_unit.js +0 -2
  301. package/test/util/data_view_reader_unit.js +0 -4
  302. package/test/util/ebml_parser_unit.js +0 -4
  303. package/test/util/event_manager_unit.js +0 -3
  304. package/test/util/fake_event_target_unit.js +0 -5
  305. package/test/util/functional_unit.js +1 -1
  306. package/test/util/iterables_unit.js +0 -64
  307. package/test/util/language_utils_unit.js +0 -3
  308. package/test/util/manifest_parser_utils_unit.js +0 -2
  309. package/test/util/mp4_box_parsers_unit.js +0 -5
  310. package/test/util/mp4_parser_unit.js +0 -4
  311. package/test/util/multi_map_unit.js +0 -3
  312. package/test/util/object_utils_unit.js +0 -2
  313. package/test/util/periods_unit.js +14 -7
  314. package/test/util/pssh_unit.js +0 -5
  315. package/test/util/state_history_unit.js +0 -2
  316. package/test/util/stream_utils_unit.js +39 -38
  317. package/test/util/string_utils_unit.js +0 -6
  318. package/test/util/text_parser_unit.js +0 -2
  319. package/test/util/xml_utils_unit.js +0 -4
  320. package/ui/controls.js +3 -0
  321. package/ui/less/ad_controls.less +4 -4
  322. package/ui/less/buttons.less +5 -9
  323. package/ui/less/containers.less +5 -7
  324. package/ui/less/overflow_menu.less +4 -4
  325. package/ui/less/range_elements.less +5 -0
  326. package/ui/locales/sjn-translations.yaml +257 -0
  327. package/ui/locales/sjn.json +42 -0
  328. package/ui/localization.js +12 -36
  329. package/ui/text_selection.js +1 -0
  330. package/externs/media_capabilities.js +0 -16
  331. package/externs/svgelement.js +0 -18
package/lib/player.js CHANGED
@@ -728,6 +728,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
728
728
  await this.networkingEngine_.destroy();
729
729
  this.networkingEngine_ = null;
730
730
  }
731
+
732
+ // FakeEventTarget implements IReleasable
733
+ super.release();
731
734
  }
732
735
 
733
736
  /**
@@ -1611,8 +1614,11 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
1611
1614
  // initialize it now even through it appears a little out-of-place.
1612
1615
  this.regionTimeline_ =
1613
1616
  new shaka.media.RegionTimeline(() => this.seekRange());
1614
- this.regionTimeline_.setListeners(/* onRegionAdded= */ (region) => {
1617
+ this.regionTimeline_.addEventListener('regionadd', (event) => {
1618
+ /** @type {shaka.extern.TimelineRegionInfo} */
1619
+ const region = event['region'];
1615
1620
  this.onRegionEvent_(shaka.Player.EventName.TimelineRegionAdded, region);
1621
+
1616
1622
  if (this.adManager_) {
1617
1623
  this.adManager_.onDashTimedMetadata(region);
1618
1624
  }
@@ -2104,6 +2110,14 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2104
2110
 
2105
2111
  this.playhead_ = new shaka.media.SrcEqualsPlayhead(has.mediaElement);
2106
2112
 
2113
+ // This flag is used below in the language preference setup and
2114
+ // track-management to check if this load was canceled before the necessary
2115
+ // events fired.
2116
+ let unloaded = false;
2117
+ this.cleanupOnUnload_.push(() => {
2118
+ unloaded = true;
2119
+ });
2120
+
2107
2121
  if (has.startTime != null) {
2108
2122
  this.playhead_.setStartTime(has.startTime);
2109
2123
  }
@@ -2131,7 +2145,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2131
2145
 
2132
2146
  // Wait for the 'loadedmetadata' event to measure load() latency, but only
2133
2147
  // if preload is set in a way that would result in this event firing
2134
- // automatically. See https://github.com/google/shaka-player/issues/2483
2148
+ // automatically.
2149
+ // See https://github.com/shaka-project/shaka-player/issues/2483
2135
2150
  if (this.video_.preload != 'none') {
2136
2151
  this.eventManager_.listenOnce(this.video_, 'loadedmetadata', () => {
2137
2152
  const now = Date.now() / 1000;
@@ -2154,6 +2169,12 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2154
2169
  }
2155
2170
  if (this.video_.textTracks) {
2156
2171
  this.eventManager_.listen(this.video_.textTracks, 'addtrack', (e) => {
2172
+ // If we have moved on to another piece of content while waiting for
2173
+ // the above event, we should not process tracks here.
2174
+ if (unloaded) {
2175
+ return;
2176
+ }
2177
+
2157
2178
  const trackEvent = /** @type {!TrackEvent} */(e);
2158
2179
  if (trackEvent.track) {
2159
2180
  const track = trackEvent.track;
@@ -2209,13 +2230,6 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2209
2230
  fullyLoaded.resolve();
2210
2231
  });
2211
2232
 
2212
- // This flag is used below in the language preference setup to check if this
2213
- // load was canceled before the necessary events fire.
2214
- let unloaded = false;
2215
- this.cleanupOnUnload_.push(() => {
2216
- unloaded = true;
2217
- });
2218
-
2219
2233
  // We can't switch to preferred languages, though, until the data is loaded.
2220
2234
  shaka.util.MediaReadyState.waitForReadyState(this.video_,
2221
2235
  HTMLMediaElement.HAVE_CURRENT_DATA,
@@ -2370,12 +2384,16 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2370
2384
  // In Safari the initial assignment does not always work, so we schedule
2371
2385
  // this process to be repeated several times to ensure that it has been put
2372
2386
  // in the correct mode.
2373
- new shaka.util.Timer(() => {
2387
+ const timer = new shaka.util.Timer(() => {
2374
2388
  const textTracks = this.getMetadataTracks_();
2375
2389
  for (const textTrack of textTracks) {
2376
2390
  textTrack.mode = 'hidden';
2377
2391
  }
2378
- }).tickNow().tickAfter(/* seconds= */ 0.5);
2392
+ }).tickNow().tickAfter(0.5);
2393
+
2394
+ this.cleanupOnUnload_.push(() => {
2395
+ timer.stop();
2396
+ });
2379
2397
  }
2380
2398
 
2381
2399
 
@@ -2443,12 +2461,16 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2443
2461
  // In Safari the initial assignment does not always work, so we schedule
2444
2462
  // this process to be repeated several times to ensure that it has been put
2445
2463
  // in the correct mode.
2446
- new shaka.util.Timer(() => {
2464
+ const timer = new shaka.util.Timer(() => {
2447
2465
  const chaptersTracks = this.getChaptersTracks_();
2448
2466
  for (const chaptersTrack of chaptersTracks) {
2449
2467
  chaptersTrack.mode = 'hidden';
2450
2468
  }
2451
- }).tickNow().tickAfter(/* seconds= */ 0.5);
2469
+ }).tickNow().tickAfter(0.5);
2470
+
2471
+ this.cleanupOnUnload_.push(() => {
2472
+ timer.stop();
2473
+ });
2452
2474
  }
2453
2475
 
2454
2476
  /**
@@ -2547,21 +2569,31 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2547
2569
  // Create the region observer. This will allow us to notify the app when we
2548
2570
  // move in and out of timeline regions.
2549
2571
  const regionObserver = new shaka.media.RegionObserver(this.regionTimeline_);
2550
- const onEnterRegion = (region, seeking) => {
2572
+
2573
+ regionObserver.addEventListener('enter', (event) => {
2574
+ /** @type {shaka.extern.TimelineRegionInfo} */
2575
+ const region = event['region'];
2551
2576
  this.onRegionEvent_(shaka.Player.EventName.TimelineRegionEnter, region);
2552
- };
2553
- const onExitRegion = (region, seeking) => {
2577
+ });
2578
+
2579
+ regionObserver.addEventListener('exit', (event) => {
2580
+ /** @type {shaka.extern.TimelineRegionInfo} */
2581
+ const region = event['region'];
2554
2582
  this.onRegionEvent_(shaka.Player.EventName.TimelineRegionExit, region);
2555
- };
2556
- const onSkipRegion = (region, seeking) => {
2583
+ });
2584
+
2585
+ regionObserver.addEventListener('skip', (event) => {
2586
+ /** @type {shaka.extern.TimelineRegionInfo} */
2587
+ const region = event['region'];
2588
+ /** @type {boolean} */
2589
+ const seeking = event['seeking'];
2557
2590
  // If we are seeking, we don't want to surface the enter/exit events since
2558
2591
  // they didn't play through them.
2559
2592
  if (!seeking) {
2560
2593
  this.onRegionEvent_(shaka.Player.EventName.TimelineRegionEnter, region);
2561
2594
  this.onRegionEvent_(shaka.Player.EventName.TimelineRegionExit, region);
2562
2595
  }
2563
- };
2564
- regionObserver.setListeners(onEnterRegion, onExitRegion, onSkipRegion);
2596
+ });
2565
2597
 
2566
2598
  // Now that we have all our observers, create a manager for them.
2567
2599
  const manager = new shaka.media.PlayheadObserverManager(this.video_);
@@ -3454,7 +3486,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
3454
3486
  const height = fullImageHeight / rows;
3455
3487
  const totalImages = columns * rows;
3456
3488
  const segmentDuration = reference.trueEndTime - reference.startTime;
3457
- const thumbnailDuration = segmentDuration / totalImages;
3489
+ const thumbnailDuration =
3490
+ reference.getTileDuration() || (segmentDuration / totalImages);
3458
3491
  let thumbnailTime = reference.startTime;
3459
3492
  let positionX = 0;
3460
3493
  let positionY = 0;
@@ -3477,6 +3510,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
3477
3510
  positionY = Math.floor(thumbnailPosition / columns) * height;
3478
3511
  }
3479
3512
  return {
3513
+ imageHeight: fullImageHeight,
3514
+ imageWidth: fullImageWidth,
3480
3515
  height: height,
3481
3516
  positionX: positionX,
3482
3517
  positionY: positionY,
@@ -3521,7 +3556,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
3521
3556
  this.streamingEngine_.switchTextStream(stream);
3522
3557
  this.onTextChanged_();
3523
3558
 
3524
- // Workaround for https://github.com/google/shaka-player/issues/1299
3559
+ // Workaround for
3560
+ // https://github.com/shaka-project/shaka-player/issues/1299
3525
3561
  // When track is selected, back-propagate the language to
3526
3562
  // currentTextLanguage_.
3527
3563
  this.currentTextLanguage_ = stream.language;
@@ -3597,7 +3633,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
3597
3633
  this.switchVariant_(variant, /* fromAdaptation= */ false, clearBuffer,
3598
3634
  safeMargin);
3599
3635
 
3600
- // Workaround for https://github.com/google/shaka-player/issues/1299
3636
+ // Workaround for
3637
+ // https://github.com/shaka-project/shaka-player/issues/1299
3601
3638
  // When track is selected, back-propagate the language to
3602
3639
  // currentAudioLanguage_.
3603
3640
  this.currentAdaptationSetCriteria_ = new shaka.media.ExampleBasedCriteria(
@@ -3878,20 +3915,24 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
3878
3915
  const LanguageUtils = shaka.util.LanguageUtils;
3879
3916
  const inputlanguage = LanguageUtils.normalize(language);
3880
3917
  const chaptersTracks = this.getChaptersTracks_();
3881
- const chaptersTrack = chaptersTracks
3882
- .find((t) => LanguageUtils.normalize(t.language) == inputlanguage);
3883
- if (!chaptersTrack || !chaptersTrack.cues) {
3918
+ const chaptersTracksWithLanguage = chaptersTracks
3919
+ .filter((t) => LanguageUtils.normalize(t.language) == inputlanguage);
3920
+ if (!chaptersTracksWithLanguage || !chaptersTracksWithLanguage.length) {
3884
3921
  return [];
3885
3922
  }
3886
3923
  const chapters = [];
3887
- for (const cue of chaptersTrack.cues) {
3888
- /** @type {shaka.extern.Chapter} */
3889
- const chapter = {
3890
- title: cue.text,
3891
- startTime: cue.startTime,
3892
- endTime: cue.endTime,
3893
- };
3894
- chapters.push(chapter);
3924
+ for (const chaptersTrack of chaptersTracksWithLanguage) {
3925
+ if (chaptersTrack && chaptersTrack.cues) {
3926
+ for (const cue of chaptersTrack.cues) {
3927
+ /** @type {shaka.extern.Chapter} */
3928
+ const chapter = {
3929
+ title: cue.text,
3930
+ startTime: cue.startTime,
3931
+ endTime: cue.endTime,
3932
+ };
3933
+ chapters.push(chapter);
3934
+ }
3935
+ }
3895
3936
  }
3896
3937
  return chapters;
3897
3938
  }
@@ -5060,7 +5101,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
5060
5101
  // If the playback rate changes while seeking, Edge will cache the playback
5061
5102
  // rate and use it after seeking.
5062
5103
  //
5063
- // https://github.com/google/shaka-player/issues/951
5104
+ // https://github.com/shaka-project/shaka-player/issues/951
5064
5105
  if (newRate == 0) {
5065
5106
  return;
5066
5107
  }
@@ -6331,7 +6372,7 @@ shaka.Player.TYPICAL_BUFFERING_THRESHOLD_ = 0.5;
6331
6372
  * @define {string} A version number taken from git at compile time.
6332
6373
  * @export
6333
6374
  */
6334
- shaka.Player.version = 'v3.2.2-uncompiled';
6375
+ shaka.Player.version = 'v3.2.5-uncompiled';
6335
6376
 
6336
6377
  // Initialize the deprecation system using the version string we just set
6337
6378
  // 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
 
package/lib/text/cue.js CHANGED
@@ -210,6 +210,12 @@ shaka.text.Cue = class {
210
210
  */
211
211
  this.nestedCues = [];
212
212
 
213
+ /**
214
+ * @override
215
+ * @exportInterface
216
+ */
217
+ this.isContainer = false;
218
+
213
219
  /**
214
220
  * @override
215
221
  * @exportInterface
@@ -276,7 +282,7 @@ shaka.text.Cue = class {
276
282
  // Compare the start time, end time and payload of the cues first for
277
283
  // performance optimization. We can avoid the more expensive recursive
278
284
  // checks if the top-level properties don't match.
279
- // See: https://github.com/google/shaka-player/issues/3018
285
+ // See: https://github.com/shaka-project/shaka-player/issues/3018
280
286
  if (cue1.startTime != cue2.startTime || cue1.endTime != cue2.endTime ||
281
287
  cue1.payload != cue2.payload) {
282
288
  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_