shaka-player 3.1.4 → 3.1.7

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 (332) 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 +1540 -1474
  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 +224 -218
  88. package/dist/locales.js +30 -30
  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 +237 -222
  94. package/dist/shaka-player.compiled.debug.d.ts +237 -222
  95. package/dist/shaka-player.compiled.debug.externs.js +20 -3
  96. package/dist/shaka-player.compiled.debug.js +361 -365
  97. package/dist/shaka-player.compiled.debug.map +4 -4
  98. package/dist/shaka-player.compiled.externs.js +20 -3
  99. package/dist/shaka-player.compiled.js +811 -815
  100. package/dist/shaka-player.compiled.map +4 -4
  101. package/dist/shaka-player.ui.d.ts +281 -275
  102. package/dist/shaka-player.ui.debug.d.ts +281 -275
  103. package/dist/shaka-player.ui.debug.externs.js +34 -26
  104. package/dist/shaka-player.ui.debug.js +384 -389
  105. package/dist/shaka-player.ui.debug.map +4 -4
  106. package/dist/shaka-player.ui.externs.js +34 -26
  107. package/dist/shaka-player.ui.js +945 -950
  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/text.js +10 -0
  121. package/karma.conf.js +156 -45
  122. package/lib/abr/simple_abr_manager.js +12 -6
  123. package/lib/ads/ad_manager.js +1 -0
  124. package/lib/cast/cast_proxy.js +6 -4
  125. package/lib/cast/cast_receiver.js +3 -0
  126. package/lib/cea/cea608_data_channel.js +3 -3
  127. package/lib/cea/cea608_memory.js +1 -1
  128. package/lib/cea/cea708_service.js +6 -5
  129. package/lib/cea/cea_decoder.js +1 -1
  130. package/lib/cea/i_caption_decoder.js +2 -3
  131. package/lib/cea/mp4_cea_parser.js +11 -5
  132. package/lib/cea/sei_processor.js +6 -3
  133. package/lib/dash/dash_parser.js +43 -31
  134. package/lib/dash/mpd_utils.js +4 -5
  135. package/lib/dash/segment_list.js +1 -2
  136. package/lib/dash/segment_template.js +3 -3
  137. package/lib/hls/hls_parser.js +11 -9
  138. package/lib/hls/manifest_text_parser.js +4 -3
  139. package/lib/media/adaptation_set.js +1 -2
  140. package/lib/media/closed_caption_parser.js +0 -1
  141. package/lib/media/content_workarounds.js +2 -2
  142. package/lib/media/drm_engine.js +3 -2
  143. package/lib/media/media_source_engine.js +3 -2
  144. package/lib/media/mp4_segment_index_parser.js +1 -4
  145. package/lib/media/playhead.js +2 -2
  146. package/lib/media/presentation_timeline.js +18 -8
  147. package/lib/media/region_observer.js +39 -33
  148. package/lib/media/region_timeline.js +17 -19
  149. package/lib/media/streaming_engine.js +12 -9
  150. package/lib/media/time_ranges_utils.js +1 -3
  151. package/lib/media/video_wrapper.js +1 -1
  152. package/lib/net/networking_engine.js +5 -1
  153. package/lib/offline/storage.js +14 -15
  154. package/lib/player.js +52 -22
  155. package/lib/polyfill/all.js +2 -3
  156. package/lib/polyfill/encryption_scheme.js +1 -1
  157. package/lib/polyfill/media_capabilities.js +32 -17
  158. package/lib/polyfill/mediasource.js +1 -1
  159. package/lib/routing/walker.js +2 -3
  160. package/lib/text/cue.js +7 -1
  161. package/lib/text/simple_text_displayer.js +2 -1
  162. package/lib/text/text_engine.js +1 -1
  163. package/lib/text/ttml_text_parser.js +92 -63
  164. package/lib/text/ui_text_displayer.js +18 -12
  165. package/lib/util/buffer_utils.js +1 -3
  166. package/lib/util/ebml_parser.js +3 -3
  167. package/lib/util/error.js +1 -1
  168. package/lib/util/fake_event_target.js +21 -1
  169. package/lib/util/iterables.js +0 -46
  170. package/lib/util/mp4_box_parsers.js +1 -4
  171. package/lib/util/mp4_parser.js +5 -7
  172. package/lib/util/periods.js +8 -9
  173. package/lib/util/platform.js +3 -3
  174. package/lib/util/pssh.js +1 -4
  175. package/lib/util/stream_utils.js +60 -8
  176. package/lib/util/string_utils.js +3 -5
  177. package/lib/util/uint8array_utils.js +3 -5
  178. package/lib/util/xml_utils.js +34 -7
  179. package/package.json +62 -40
  180. package/roadmap.md +17 -17
  181. package/test/abr/simple_abr_manager_unit.js +3 -8
  182. package/test/ads/ad_manager_unit.js +0 -6
  183. package/test/cast/cast_proxy_unit.js +0 -8
  184. package/test/cast/cast_receiver_integration.js +1 -18
  185. package/test/cast/cast_receiver_unit.js +1 -9
  186. package/test/cast/cast_sender_unit.js +0 -6
  187. package/test/cast/cast_utils_unit.js +0 -13
  188. package/test/cea/cea608_memory_unit.js +0 -5
  189. package/test/cea/cea708_service_unit.js +0 -7
  190. package/test/cea/cea708_window_unit.js +0 -5
  191. package/test/cea/cea_decoder_unit.js +0 -6
  192. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  193. package/test/cea/dtvcc_packet_unit.js +0 -5
  194. package/test/cea/mp4_cea_parser_unit.js +0 -4
  195. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  196. package/test/dash/dash_parser_live_unit.js +45 -15
  197. package/test/dash/dash_parser_manifest_unit.js +37 -18
  198. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  199. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  200. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  201. package/test/dash/mpd_utils_unit.js +3 -11
  202. package/test/demo/demo_unit.js +0 -5
  203. package/test/deprecate/enforcer_unit.js +0 -4
  204. package/test/deprecate/version_unit.js +0 -2
  205. package/test/hls/hls_live_unit.js +2 -14
  206. package/test/hls/hls_parser_unit.js +76 -15
  207. package/test/hls/manifest_text_parser_unit.js +0 -10
  208. package/test/media/adaptation_set_criteria_unit.js +3 -7
  209. package/test/media/adaptation_set_unit.js +0 -2
  210. package/test/media/buffering_observer_unit.js +1 -4
  211. package/test/media/closed_caption_parser_unit.js +0 -3
  212. package/test/media/drm_engine_integration.js +3 -17
  213. package/test/media/drm_engine_unit.js +7 -26
  214. package/test/media/manifest_parser_unit.js +0 -4
  215. package/test/media/media_source_engine_integration.js +0 -7
  216. package/test/media/media_source_engine_unit.js +1 -14
  217. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  218. package/test/media/play_rate_controller_unit.js +0 -4
  219. package/test/media/playhead_unit.js +8 -16
  220. package/test/media/presentation_timeline_unit.js +4 -7
  221. package/test/media/region_observer_unit.js +40 -10
  222. package/test/media/region_timeline_unit.js +40 -25
  223. package/test/media/segment_index_unit.js +0 -6
  224. package/test/media/segment_reference_unit.js +0 -3
  225. package/test/media/stall_detector_unit.js +0 -5
  226. package/test/media/streaming_engine_integration.js +11 -37
  227. package/test/media/streaming_engine_unit.js +155 -34
  228. package/test/media/time_ranges_utils_unit.js +0 -2
  229. package/test/media/transmuxer_integration.js +0 -6
  230. package/test/media/webm_segment_index_parser_unit.js +0 -4
  231. package/test/net/data_uri_plugin_unit.js +0 -7
  232. package/test/net/http_plugin_unit.js +0 -9
  233. package/test/net/networking_engine_unit.js +0 -11
  234. package/test/offline/download_progress_estimator_unit.js +0 -2
  235. package/test/offline/indexeddb_storage_unit.js +0 -6
  236. package/test/offline/manifest_convert_unit.js +0 -8
  237. package/test/offline/offline_integration.js +1 -10
  238. package/test/offline/offline_manifest_parser_unit.js +0 -6
  239. package/test/offline/offline_scheme_unit.js +0 -8
  240. package/test/offline/offline_uri_unit.js +0 -2
  241. package/test/offline/storage_compatibility_unit.js +1 -14
  242. package/test/offline/storage_integration.js +1 -25
  243. package/test/player_external.js +2 -10
  244. package/test/player_integration.js +21 -28
  245. package/test/player_load_graph_integration.js +1 -6
  246. package/test/player_src_equals_external.js +3 -9
  247. package/test/player_src_equals_integration.js +0 -7
  248. package/test/player_unit.js +57 -42
  249. package/test/routing/walker_unit.js +0 -8
  250. package/test/test/assets/large_file.mpd +1 -1
  251. package/test/test/boot.js +75 -22
  252. package/test/test/externs/jasmine.js +2 -2
  253. package/test/test/externs/karma.js +4 -0
  254. package/test/test/namespace.js +10 -0
  255. package/test/test/util/canned_idb.js +0 -8
  256. package/test/test/util/cea_utils.js +0 -6
  257. package/test/test/util/dash_parser_util.js +0 -13
  258. package/test/test/util/fake_ad.js +0 -3
  259. package/test/test/util/fake_ad_manager.js +0 -9
  260. package/test/test/util/fake_demo_main.js +0 -5
  261. package/test/test/util/fake_drm_engine.js +0 -6
  262. package/test/test/util/fake_media_source_engine.js +0 -7
  263. package/test/test/util/fake_networking_engine.js +0 -5
  264. package/test/test/util/fake_text_displayer.js +0 -5
  265. package/test/test/util/indexeddb_utils.js +1 -10
  266. package/test/test/util/jasmine_fetch.js +0 -1
  267. package/test/test/util/loader.js +0 -18
  268. package/test/test/util/manifest_generator.js +9 -14
  269. package/test/test/util/manifest_parser_util.js +0 -6
  270. package/test/test/util/offline_utils.js +0 -5
  271. package/test/test/util/simple_fakes.js +9 -26
  272. package/test/test/util/stream_generator.js +0 -14
  273. package/test/test/util/streaming_engine_util.js +0 -15
  274. package/test/test/util/test_scheme.js +1 -19
  275. package/test/test/util/ttml_utils.js +79 -0
  276. package/test/test/util/ui_utils.js +0 -9
  277. package/test/test/util/util.js +15 -26
  278. package/test/test/util/waiter.js +84 -43
  279. package/test/text/cue_integration.js +0 -4
  280. package/test/text/lrc_text_parser_unit.js +0 -4
  281. package/test/text/mp4_ttml_parser_unit.js +10 -23
  282. package/test/text/mp4_vtt_parser_unit.js +1 -7
  283. package/test/text/sbv_text_parser_unit.js +0 -4
  284. package/test/text/simple_text_displayer_unit.js +1 -8
  285. package/test/text/srt_text_parser_unit.js +0 -4
  286. package/test/text/ssa_text_parser_unit.js +0 -5
  287. package/test/text/text_engine_unit.js +2 -7
  288. package/test/text/text_track_integration.js +0 -2
  289. package/test/text/ttml_text_parser_unit.js +495 -237
  290. package/test/text/ui_text_displayer_unit.js +44 -41
  291. package/test/text/vtt_text_parser_unit.js +0 -9
  292. package/test/text/web_vtt_generator_unit.js +0 -3
  293. package/test/ui/ad_ui_unit.js +0 -11
  294. package/test/ui/localization_unit.js +0 -3
  295. package/test/ui/text_displayer_layout_unit.js +9 -19
  296. package/test/ui/ui_customization_unit.js +0 -6
  297. package/test/ui/ui_integration.js +0 -16
  298. package/test/ui/ui_unit.js +1 -17
  299. package/test/util/abortable_operation_unit.js +4 -9
  300. package/test/util/array_utils_unit.js +0 -2
  301. package/test/util/buffer_utils_unit.js +0 -2
  302. package/test/util/data_view_reader_unit.js +0 -4
  303. package/test/util/ebml_parser_unit.js +0 -4
  304. package/test/util/event_manager_unit.js +0 -3
  305. package/test/util/fake_event_target_unit.js +0 -5
  306. package/test/util/functional_unit.js +1 -1
  307. package/test/util/iterables_unit.js +0 -64
  308. package/test/util/language_utils_unit.js +0 -3
  309. package/test/util/manifest_parser_utils_unit.js +0 -2
  310. package/test/util/mp4_box_parsers_unit.js +0 -5
  311. package/test/util/mp4_parser_unit.js +0 -4
  312. package/test/util/multi_map_unit.js +0 -3
  313. package/test/util/object_utils_unit.js +0 -2
  314. package/test/util/periods_unit.js +14 -7
  315. package/test/util/pssh_unit.js +0 -5
  316. package/test/util/state_history_unit.js +0 -2
  317. package/test/util/stream_utils_unit.js +38 -37
  318. package/test/util/string_utils_unit.js +0 -6
  319. package/test/util/text_parser_unit.js +0 -2
  320. package/test/util/xml_utils_unit.js +0 -4
  321. package/ui/controls.js +3 -0
  322. package/ui/less/ad_controls.less +4 -4
  323. package/ui/less/buttons.less +5 -9
  324. package/ui/less/containers.less +5 -7
  325. package/ui/less/overflow_menu.less +4 -4
  326. package/ui/less/range_elements.less +5 -0
  327. package/ui/locales/sjn-translations.yaml +257 -0
  328. package/ui/locales/sjn.json +42 -0
  329. package/ui/localization.js +12 -36
  330. package/ui/text_selection.js +1 -0
  331. package/externs/media_capabilities.js +0 -16
  332. package/externs/svgelement.js +0 -18
@@ -4,19 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('goog.asserts');
8
- goog.require('shaka.hls.HlsParser');
9
- goog.require('shaka.log');
10
- goog.require('shaka.net.NetworkingEngine');
11
- goog.require('shaka.test.FakeNetworkingEngine');
12
- goog.require('shaka.test.ManifestGenerator');
13
- goog.require('shaka.test.ManifestParser');
14
- goog.require('shaka.test.Util');
15
- goog.require('shaka.util.Error');
16
- goog.require('shaka.util.ManifestParserUtils');
17
- goog.require('shaka.util.PlayerConfiguration');
18
- goog.require('shaka.util.Uint8ArrayUtils');
19
-
20
7
  describe('HlsParser', () => {
21
8
  const ContentType = shaka.util.ManifestParserUtils.ContentType;
22
9
  const ManifestParser = shaka.test.ManifestParser;
@@ -209,6 +196,80 @@ describe('HlsParser', () => {
209
196
  expect(actual).toEqual(manifest);
210
197
  });
211
198
 
199
+ it('parses manifest attributes with space', async () => {
200
+ const master = [
201
+ '#EXTM3U\n',
202
+ '#EXT-X-MEDIA:TYPE=AUDIO, GROUP-ID="aud1", LANGUAGE="eng", ',
203
+ 'CHANNELS="16/JOC", URI="audio"\n',
204
+ '#EXT-X-MEDIA:TYPE=SUBTITLES, GROUP-ID="sub1", LANGUAGE="eng", ',
205
+ 'URI="text"\n',
206
+ '#EXT-X-MEDIA:TYPE=SUBTITLES, GROUP-ID="sub2", LANGUAGE="es", ',
207
+ 'URI="text2"\n',
208
+ '#EXT-X-STREAM-INF:BANDWIDTH=200, CODECS="avc1,mp4a", ',
209
+ 'RESOLUTION=960x540, FRAME-RATE=60, AUDIO="aud1"\n',
210
+ 'video\n',
211
+ ].join('');
212
+
213
+ const media = [
214
+ '#EXTM3U\n',
215
+ '#EXT-X-PLAYLIST-TYPE:VOD\n',
216
+ '#EXT-X-MAP:URI="init.mp4",BYTERANGE="616@0"\n',
217
+ '#EXTINF:5,\n',
218
+ '#EXT-X-BYTERANGE:121090@616\n',
219
+ 'main.mp4',
220
+ ].join('');
221
+
222
+ const textMedia = [
223
+ '#EXTM3U\n',
224
+ '#EXT-X-PLAYLIST-TYPE:VOD\n',
225
+ '#EXTINF:5,\n',
226
+ '#EXT-X-BYTERANGE:121090@616\n',
227
+ 'main.vtt',
228
+ ].join('');
229
+
230
+ const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
231
+ manifest.anyTimeline();
232
+ manifest.addPartialVariant((variant) => {
233
+ variant.language = 'en';
234
+ variant.bandwidth = 200;
235
+ variant.addPartialStream(ContentType.VIDEO, (stream) => {
236
+ stream.frameRate = 60;
237
+ stream.mime('video/mp4', 'avc1');
238
+ stream.size(960, 540);
239
+ });
240
+ variant.addPartialStream(ContentType.AUDIO, (stream) => {
241
+ stream.language = 'en';
242
+ stream.channelsCount = 16;
243
+ stream.spatialAudio = true;
244
+ stream.mime('audio/mp4', 'mp4a');
245
+ });
246
+ });
247
+ manifest.addPartialTextStream((stream) => {
248
+ stream.language = 'en';
249
+ stream.kind = TextStreamKind.SUBTITLE;
250
+ stream.mime('text/vtt', '');
251
+ });
252
+ manifest.addPartialTextStream((stream) => {
253
+ stream.language = 'es';
254
+ stream.kind = TextStreamKind.SUBTITLE;
255
+ stream.mime('text/vtt', '');
256
+ });
257
+ });
258
+
259
+ fakeNetEngine
260
+ .setResponseText('test:/master', master)
261
+ .setResponseText('test:/audio', media)
262
+ .setResponseText('test:/video', media)
263
+ .setResponseText('test:/text', textMedia)
264
+ .setResponseText('test:/text2', textMedia)
265
+ .setResponseText('test:/main.vtt', vttText)
266
+ .setResponseValue('test:/init.mp4', initSegmentData)
267
+ .setResponseValue('test:/main.mp4', segmentData);
268
+
269
+ const actual = await parser.start('test:/master', playerInterface);
270
+ expect(actual).toEqual(manifest);
271
+ });
272
+
212
273
  it('prioritize AVERAGE-BANDWIDTH to BANDWIDTH', async () => {
213
274
  const master = [
214
275
  '#EXTM3U\n',
@@ -2618,7 +2679,7 @@ describe('HlsParser', () => {
2618
2679
  expect(audio0).toBe(audio1);
2619
2680
  });
2620
2681
 
2621
- // https://github.com/google/shaka-player/issues/1664
2682
+ // https://github.com/shaka-project/shaka-player/issues/1664
2622
2683
  it('correctly resolves relative playlist URIs', async () => {
2623
2684
  const master = [
2624
2685
  '#EXTM3U\n',
@@ -2661,7 +2722,7 @@ describe('HlsParser', () => {
2661
2722
  expect(manifest.variants.length).toBe(1);
2662
2723
  });
2663
2724
 
2664
- // https://github.com/google/shaka-player/issues/1908
2725
+ // https://github.com/shaka-project/shaka-player/issues/1908
2665
2726
  it('correctly pairs variants with multiple video and audio', async () => {
2666
2727
  const master = [
2667
2728
  '#EXTM3U\n',
@@ -4,16 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
-
8
- goog.require('shaka.hls.Attribute');
9
- goog.require('shaka.hls.ManifestTextParser');
10
- goog.require('shaka.hls.PlaylistType');
11
- goog.require('shaka.hls.Segment');
12
- goog.require('shaka.hls.Tag');
13
- goog.require('shaka.test.Util');
14
- goog.require('shaka.util.Error');
15
- goog.require('shaka.util.StringUtils');
16
-
17
7
  describe('ManifestTextParser', () => {
18
8
  /** @type {!shaka.hls.ManifestTextParser} */
19
9
  let parser;
@@ -4,10 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.media.PreferenceBasedCriteria');
8
- goog.require('shaka.test.ManifestGenerator');
9
- goog.requireType('shaka.media.AdaptationSet');
10
-
11
7
  describe('AdaptationSetCriteria', () => {
12
8
  describe('preference based selection', () => {
13
9
  it('chooses variants in user\'s preferred language', () => {
@@ -84,7 +80,7 @@ describe('AdaptationSetCriteria', () => {
84
80
  });
85
81
 
86
82
  it('chooses only one role, even if none is preferred', () => {
87
- // Regression test for https://github.com/google/shaka-player/issues/949
83
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/949
88
84
  const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
89
85
  manifest.addVariant(1, (variant) => {
90
86
  variant.language = 'en';
@@ -136,7 +132,7 @@ describe('AdaptationSetCriteria', () => {
136
132
  });
137
133
 
138
134
  it('chooses only one role, even if all are primary', () => {
139
- // Regression test for https://github.com/google/shaka-player/issues/949
135
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/949
140
136
  const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
141
137
  manifest.addVariant(1, (variant) => {
142
138
  variant.language = 'en';
@@ -194,7 +190,7 @@ describe('AdaptationSetCriteria', () => {
194
190
  });
195
191
 
196
192
  it('chooses only one language, even if all are primary', () => {
197
- // Regression test for https://github.com/google/shaka-player/issues/918
193
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/918
198
194
  const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
199
195
  manifest.addVariant(1, (variant) => {
200
196
  variant.language = 'en';
@@ -4,8 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.media.AdaptationSet');
8
-
9
7
  describe('AdaptationSet', () => {
10
8
  describe('roles', () => {
11
9
  const mimeType = 'mime-type';
@@ -4,9 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.media.BufferingObserver');
8
- goog.require('shaka.util.Iterables');
9
-
10
7
  describe('BufferingObserver', () => {
11
8
  const BufferingObserver = shaka.media.BufferingObserver;
12
9
  const State = shaka.media.BufferingObserver.State;
@@ -115,7 +112,7 @@ describe('BufferingObserver', () => {
115
112
  /** @type {boolean} */
116
113
  let changed;
117
114
 
118
- for (const lead of shaka.util.Iterables.range(5)) {
115
+ for (let lead = 0; lead < 5; lead++) {
119
116
  changed = controller.update(lead, /* toEnd= */ false);
120
117
  expect(changed).toBeFalsy();
121
118
  }
@@ -4,9 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.media.ClosedCaptionParser');
8
- goog.require('shaka.test.Util');
9
-
10
7
  describe('ClosedCaptionParser', () => {
11
8
  it('can handle empty caption packets', async () => {
12
9
  const initSegment = await shaka.test.Util.fetch(
@@ -4,21 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.media.DrmEngine');
8
- goog.require('shaka.media.MediaSourceEngine');
9
- goog.require('shaka.net.NetworkingEngine');
10
- goog.require('shaka.test.FakeClosedCaptionParser');
11
- goog.require('shaka.test.FakeTextDisplayer');
12
- goog.require('shaka.test.ManifestGenerator');
13
- goog.require('shaka.test.UiUtils');
14
- goog.require('shaka.test.Util');
15
- goog.require('shaka.test.Waiter');
16
- goog.require('shaka.util.EventManager');
17
- goog.require('shaka.util.ManifestParserUtils');
18
- goog.require('shaka.util.Platform');
19
- goog.require('shaka.util.PlayerConfiguration');
20
- goog.require('shaka.util.PublicPromise');
21
-
22
7
  describe('DrmEngine', () => {
23
8
  const ContentType = shaka.util.ManifestParserUtils.ContentType;
24
9
 
@@ -277,11 +262,12 @@ describe('DrmEngine', () => {
277
262
  video.play();
278
263
 
279
264
  const waiter = new shaka.test.Waiter(eventManager).timeoutAfter(15);
265
+ waiter.setMediaSourceEngine(mediaSourceEngine);
280
266
  await waiter.waitForMovement(video);
281
267
 
282
268
  // Something should have played by now.
283
269
  expect(video.readyState).toBeGreaterThan(1);
284
270
  expect(video.currentTime).toBeGreaterThan(0);
285
- });
286
- } // describe('basic flow')
271
+ }); // describe('basic flow')
272
+ }
287
273
  });
@@ -4,25 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.log');
8
- goog.require('shaka.media.DrmEngine');
9
- goog.require('shaka.media.Transmuxer');
10
- goog.require('shaka.net.DataUriPlugin');
11
- goog.require('shaka.net.NetworkingEngine');
12
- goog.require('shaka.test.FakeNetworkingEngine');
13
- goog.require('shaka.test.FakeVideo');
14
- goog.require('shaka.test.ManifestGenerator');
15
- goog.require('shaka.test.Util');
16
- goog.require('shaka.util.AbortableOperation');
17
- goog.require('shaka.util.BufferUtils');
18
- goog.require('shaka.util.Error');
19
- goog.require('shaka.util.Platform');
20
- goog.require('shaka.util.PlayerConfiguration');
21
- goog.require('shaka.util.Platform');
22
- goog.require('shaka.util.PublicPromise');
23
- goog.require('shaka.util.StringUtils');
24
- goog.require('shaka.util.Uint8ArrayUtils');
25
-
26
7
  for (const useMediaCapabilities of [true, false]) {
27
8
  const isEnabled = useMediaCapabilities ? 'enabled' : 'disabled';
28
9
  describe('DrmEngine with MediaCapabilities ' + isEnabled, () => {
@@ -37,7 +18,7 @@ function testDrmEngine(useMediaCapabilities) {
37
18
  navigator.requestMediaKeySystemAccess;
38
19
  const originalLogError = shaka.log.error;
39
20
  const originalBatchTime = shaka.media.DrmEngine.KEY_STATUS_BATCH_TIME;
40
- const originalDecodingInfo = window.shakaMediaCapabilities.decodingInfo;
21
+ const originalDecodingInfo = navigator.mediaCapabilities.decodingInfo;
41
22
 
42
23
  /** @type {!jasmine.Spy} */
43
24
  let requestMediaKeySystemAccessSpy;
@@ -88,7 +69,7 @@ function testDrmEngine(useMediaCapabilities) {
88
69
  navigator.requestMediaKeySystemAccess =
89
70
  shaka.test.Util.spyFunc(requestMediaKeySystemAccessSpy);
90
71
  decodingInfoSpy = jasmine.createSpy('decodingInfo');
91
- window.shakaMediaCapabilities.decodingInfo =
72
+ navigator.mediaCapabilities.decodingInfo =
92
73
  shaka.test.Util.spyFunc(decodingInfoSpy);
93
74
 
94
75
  logErrorSpy = jasmine.createSpy('shaka.log.error');
@@ -165,7 +146,7 @@ function testDrmEngine(useMediaCapabilities) {
165
146
 
166
147
  navigator.requestMediaKeySystemAccess =
167
148
  originalRequestMediaKeySystemAccess;
168
- window.shakaMediaCapabilities.decodingInfo = originalDecodingInfo;
149
+ navigator.mediaCapabilities.decodingInfo = originalDecodingInfo;
169
150
  shaka.log.error = originalLogError;
170
151
  });
171
152
 
@@ -1054,7 +1035,7 @@ function testDrmEngine(useMediaCapabilities) {
1054
1035
  .toHaveBeenCalledWith('cenc', initData1);
1055
1036
  });
1056
1037
 
1057
- // https://github.com/google/shaka-player/issues/2754
1038
+ // https://github.com/shaka-project/shaka-player/issues/2754
1058
1039
  it('ignores duplicate init data from newInitData', async () => {
1059
1040
  /** @type {!Uint8Array} */
1060
1041
  const initData = new Uint8Array(1);
@@ -1440,7 +1421,7 @@ function testDrmEngine(useMediaCapabilities) {
1440
1421
  expect(onKeyStatusSpy).toHaveBeenCalled();
1441
1422
  });
1442
1423
 
1443
- // See https://github.com/google/shaka-player/issues/1541
1424
+ // See https://github.com/shaka-project/shaka-player/issues/1541
1444
1425
  it('does not update public key statuses before callback', async () => {
1445
1426
  await initAndAttach();
1446
1427
 
@@ -1478,7 +1459,7 @@ function testDrmEngine(useMediaCapabilities) {
1478
1459
  expect(keyIds.length).toBe(2);
1479
1460
  });
1480
1461
 
1481
- // See https://github.com/google/shaka-player/issues/1541
1462
+ // See https://github.com/shaka-project/shaka-player/issues/1541
1482
1463
  it('does not invoke callback until all sessions are loaded', async () => {
1483
1464
  // Set up init data overrides in the manifest so that we get multiple
1484
1465
  // sessions.
@@ -2113,7 +2094,7 @@ function testDrmEngine(useMediaCapabilities) {
2113
2094
  // this doesn't work if the session is not callable (no license request
2114
2095
  // sent). So |session.closed| should never resolve and |session.close()|
2115
2096
  // should be rejected and destroy() should still succeed.
2116
- // https://github.com/google/shaka-player/issues/664
2097
+ // https://github.com/shaka-project/shaka-player/issues/664
2117
2098
  await initAndAttach();
2118
2099
  session1.closed = new shaka.util.PublicPromise();
2119
2100
  session2.closed = new shaka.util.PublicPromise();
@@ -4,10 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.media.ManifestParser');
8
- goog.require('shaka.net.NetworkingEngine');
9
- goog.require('shaka.test.FakeNetworkingEngine');
10
-
11
7
  const testGetMimeType = async (expertedMimeType, contentType) => {
12
8
  const netEngine = new shaka.test.FakeNetworkingEngine()
13
9
  .setHeaders('dummy://foo', {'content-type': contentType});
@@ -4,13 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.media.ClosedCaptionParser');
8
- goog.require('shaka.media.MediaSourceEngine');
9
- goog.require('shaka.test.FakeTextDisplayer');
10
- goog.require('shaka.test.TestScheme');
11
- goog.require('shaka.test.UiUtils');
12
- goog.require('shaka.util.ManifestParserUtils');
13
-
14
7
  describe('MediaSourceEngine', () => {
15
8
  const ContentType = shaka.util.ManifestParserUtils.ContentType;
16
9
  const presentationDuration = 840;
@@ -4,19 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
-
8
- goog.require('goog.asserts');
9
- goog.require('shaka.media.MediaSourceEngine');
10
- goog.require('shaka.media.Transmuxer');
11
- goog.require('shaka.test.FakeClosedCaptionParser');
12
- goog.require('shaka.test.FakeTextDisplayer');
13
- goog.require('shaka.test.FakeTransmuxer');
14
- goog.require('shaka.test.StatusPromise');
15
- goog.require('shaka.test.Util');
16
- goog.require('shaka.text.TextEngine');
17
- goog.require('shaka.util.Error');
18
- goog.require('shaka.util.ManifestParserUtils');
19
-
20
7
  /**
21
8
  * @typedef {{
22
9
  * length: number,
@@ -1127,7 +1114,7 @@ describe('MediaSourceEngine', () => {
1127
1114
  expect(mockTextEngine.destroy).toHaveBeenCalled();
1128
1115
  });
1129
1116
 
1130
- // Regression test for https://github.com/google/shaka-player/issues/984
1117
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/984
1131
1118
  it('destroys TextDisplayer on destroy', async () => {
1132
1119
  await mediaSourceEngine.destroy();
1133
1120
  expect(mockTextDisplayer.destroySpy).toHaveBeenCalled();
@@ -4,10 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.media.Mp4SegmentIndexParser');
8
- goog.require('shaka.test.Util');
9
- goog.require('shaka.util.Error');
10
-
11
7
  describe('Mp4SegmentIndexParser', () => {
12
8
  const Util = shaka.test.Util;
13
9
 
@@ -4,10 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
-
8
- goog.require('shaka.media.PlayRateController');
9
- goog.require('shaka.test.Util');
10
-
11
7
  describe('PlayRateController', () => {
12
8
  /** @type {!jasmine.Spy} */
13
9
  let getPlayRateSpy;
@@ -4,14 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
-
8
- goog.require('shaka.media.MediaSourcePlayhead');
9
- goog.require('shaka.test.FakePresentationTimeline');
10
- goog.require('shaka.test.FakeVideo');
11
- goog.require('shaka.test.Util');
12
- goog.require('shaka.util.PlayerConfiguration');
13
- goog.requireType('shaka.media.Playhead');
14
-
15
7
  /**
16
8
  * @typedef {{start: number, end: number}}
17
9
  *
@@ -332,8 +324,8 @@ describe('Playhead', () => {
332
324
  });
333
325
 
334
326
  // This is important for recovering from drift.
335
- // See: https://github.com/google/shaka-player/issues/1105
336
- // TODO: Re-evaluate after https://github.com/google/shaka-player/issues/999
327
+ // See: https://github.com/shaka-project/shaka-player/issues/1105
328
+ // TODO: Re-evaluate after https://github.com/shaka-project/shaka-player/issues/999
337
329
  it('does not change once the initial position is set', () => {
338
330
  timeline.isLive.and.returnValue(true);
339
331
  timeline.getDuration.and.returnValue(Infinity);
@@ -781,9 +773,9 @@ describe('Playhead', () => {
781
773
  }); // clamps playhead even before seeking completes
782
774
 
783
775
  // Regression test for:
784
- // - https://github.com/google/shaka-player/pull/2849
785
- // - https://github.com/google/shaka-player/issues/2748
786
- // - https://github.com/google/shaka-player/issues/2848
776
+ // - https://github.com/shaka-project/shaka-player/pull/2849
777
+ // - https://github.com/shaka-project/shaka-player/issues/2748
778
+ // - https://github.com/shaka-project/shaka-player/issues/2848
787
779
  it('does not apply seek range before initial seek has completed', () => {
788
780
  // These attributes allow the seek range callback to do its thing.
789
781
  video.readyState = HTMLMediaElement.HAVE_METADATA;
@@ -1236,7 +1228,7 @@ describe('Playhead', () => {
1236
1228
  it('works with rounding errors when seeking', () => {
1237
1229
  // If the browser sets the time to slightly before where we seek to, we
1238
1230
  // shouldn't get stuck in an infinite loop trying to jump the tiny gap.
1239
- // https://github.com/google/shaka-player/issues/1309
1231
+ // https://github.com/shaka-project/shaka-player/issues/1309
1240
1232
  const buffered = [{start: 10, end: 20}];
1241
1233
  video.buffered = createFakeBuffered(buffered);
1242
1234
  video.readyState = HTMLMediaElement.HAVE_METADATA;
@@ -1295,7 +1287,7 @@ describe('Playhead', () => {
1295
1287
  expect(video.currentTime).toBe(5);
1296
1288
  });
1297
1289
 
1298
- // Regression test for https://github.com/google/shaka-player/issues/2987
1290
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/2987
1299
1291
  it('does gap jump if paused at 0 and has autoplay', () => {
1300
1292
  const buffered = [{start: 10, end: 20}];
1301
1293
  video.buffered = createFakeBuffered(buffered);
@@ -1320,7 +1312,7 @@ describe('Playhead', () => {
1320
1312
  expect(video.currentTime).toBe(10);
1321
1313
  });
1322
1314
 
1323
- // Regression test for https://github.com/google/shaka-player/issues/3451
1315
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/3451
1324
1316
  it('doesn\'t gap jump if paused at 0 and hasn\'t autoplay', () => {
1325
1317
  const buffered = [{start: 10, end: 20}];
1326
1318
  video.buffered = createFakeBuffered(buffered);
@@ -4,9 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.media.PresentationTimeline');
8
- goog.require('shaka.test.ManifestParser');
9
-
10
7
  describe('PresentationTimeline', () => {
11
8
  const originalDateNow = Date.now;
12
9
  const makeSegmentReference = (startTime, endTime) => {
@@ -183,7 +180,7 @@ describe('PresentationTimeline', () => {
183
180
 
184
181
  // In spite of the current time, the explicit segment times will decide
185
182
  // the availability window.
186
- // See https://github.com/google/shaka-player/issues/999
183
+ // See https://github.com/shaka-project/shaka-player/issues/999
187
184
  setElapsed(1000);
188
185
  timeline.notifySegments([ref1, ref2, ref3, ref4, ref5]);
189
186
 
@@ -283,7 +280,7 @@ describe('PresentationTimeline', () => {
283
280
 
284
281
  // In spite of the current time, the explicit segment times will decide
285
282
  // the availability window.
286
- // See https://github.com/google/shaka-player/issues/999
283
+ // See https://github.com/shaka-project/shaka-player/issues/999
287
284
  setElapsed(1000);
288
285
  timeline.notifySegments([ref1, ref2, ref3, ref4, ref5]);
289
286
 
@@ -396,12 +393,12 @@ describe('PresentationTimeline', () => {
396
393
  expect(timeline.getSafeSeekRangeStart(25)).toBe(5);
397
394
  });
398
395
 
399
- // Regression test for https://github.com/google/shaka-player/issues/2831
396
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/2831
400
397
  it('will round up to the nearest ms', () => {
401
398
  const timeline = makeVodTimeline(/* duration= */ 60);
402
399
  // Seeking to this exact number may result in seeking to slightly less
403
400
  // than that, due to rounding.
404
- timeline.setUserSeekStart(1.458666666666666666666666);
401
+ timeline.setUserSeekStart(1.458666666666666);
405
402
  // So the safe range start should be slightly higher, with fewer digits.
406
403
  expect(timeline.getSafeSeekRangeStart(0)).toBe(1.459);
407
404
  });
@@ -4,17 +4,15 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.media.RegionObserver');
8
- goog.require('shaka.media.RegionTimeline');
9
- goog.require('shaka.test.Util');
10
- goog.requireType('shaka.media.IPlayheadObserver');
11
-
12
7
  describe('RegionObserver', () => {
13
8
  /** @type {!shaka.media.RegionTimeline} */
14
9
  let timeline;
15
10
  /** @type {!shaka.media.RegionObserver} */
16
11
  let observer;
17
12
 
13
+ /** @type {!jasmine.Spy} */
14
+ let onSeekRange;
15
+
18
16
  /** @type {!jasmine.Spy} */
19
17
  let onEnterRegion;
20
18
  /** @type {!jasmine.Spy} */
@@ -23,18 +21,26 @@ describe('RegionObserver', () => {
23
21
  let onSkipRegion;
24
22
 
25
23
  beforeEach(() => {
24
+ onSeekRange = jasmine.createSpy('onSeekRange');
25
+ onSeekRange.and.returnValue({start: 0, end: 100});
26
+
26
27
  onEnterRegion = jasmine.createSpy('onEnterRegion');
27
28
  onExitRegion = jasmine.createSpy('onExitRegion');
28
29
  onSkipRegion = jasmine.createSpy('onSkipRegion');
29
30
 
30
31
  timeline = new shaka.media.RegionTimeline(
31
- () => { return {start: 0, end: 100}; });
32
+ shaka.test.Util.spyFunc(onSeekRange));
32
33
 
33
34
  observer = new shaka.media.RegionObserver(timeline);
34
- observer.setListeners(
35
- /* onEnter= */ shaka.test.Util.spyFunc(onEnterRegion),
36
- /* onExit= */ shaka.test.Util.spyFunc(onExitRegion),
37
- /* onSkip= */ shaka.test.Util.spyFunc(onSkipRegion));
35
+ observer.addEventListener('enter', (event) => {
36
+ shaka.test.Util.spyFunc(onEnterRegion)(event['region'], event['seeking']);
37
+ });
38
+ observer.addEventListener('exit', (event) => {
39
+ shaka.test.Util.spyFunc(onExitRegion)(event['region'], event['seeking']);
40
+ });
41
+ observer.addEventListener('skip', (event) => {
42
+ shaka.test.Util.spyFunc(onSkipRegion)(event['region'], event['seeking']);
43
+ });
38
44
  });
39
45
 
40
46
  it('fires enter event when adding a region the playhead is in', () => {
@@ -313,6 +319,30 @@ describe('RegionObserver', () => {
313
319
  expect(onSkipRegion).not.toHaveBeenCalled();
314
320
  });
315
321
 
322
+ // See https://github.com/shaka-project/shaka-player/issues/3949
323
+ it('cleans up references to regions', async () => {
324
+ const region = createRegion('my-region', 0, 10);
325
+ timeline.addRegion(region);
326
+
327
+ // Poll so that RegionObserver will store regions.
328
+ poll(observer,
329
+ /* timeInSeconds= */ 5,
330
+ /* seeking= */ false);
331
+
332
+ // Hack to get a private member without the compiler complaining:
333
+ /** @type {Map} */
334
+ const regionMap = (/** @type {?} */(observer))['oldPosition_'];
335
+ expect(regionMap.size).not.toBe(0);
336
+
337
+ // Move the seek range so that the region will be removed.
338
+ onSeekRange.and.returnValue({start: 20, end: 100});
339
+ // Give the timeline time to filter regions
340
+ await shaka.test.Util.delay(
341
+ shaka.media.RegionTimeline.REGION_FILTER_INTERVAL * 2);
342
+
343
+ expect(regionMap.size).toBe(0);
344
+ });
345
+
316
346
  /**
317
347
  * @param {string} id
318
348
  * @param {number} startTimeSeconds