shaka-player 3.2.4 → 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 (317) 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 +1571 -1556
  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/conformance.textproto +13 -0
  59. package/build/docker/Dockerfile +20 -0
  60. package/build/docker/docker-compose.yml +10 -0
  61. package/build/gendeps.py +18 -15
  62. package/build/shaka-lab.yaml +163 -0
  63. package/build/shakaBuildHelpers.py +4 -29
  64. package/build/test.py +87 -28
  65. package/build/wrapper.template.js +2 -2
  66. package/demo/TengwarTelcontar.woff2 +0 -0
  67. package/demo/asset_card.js +1 -2
  68. package/demo/cast_receiver/index.html +1 -1
  69. package/demo/cast_receiver/receiver_app.css +14 -14
  70. package/demo/common/assets.js +2 -0
  71. package/demo/config.js +0 -1
  72. package/demo/custom.js +0 -1
  73. package/demo/customWarning.txt +2 -2
  74. package/demo/demo.less +29 -18
  75. package/demo/demo_uncompiled.js +1 -13
  76. package/demo/index.html +1 -1
  77. package/demo/main.js +3 -3
  78. package/dist/controls.css +2 -2
  79. package/dist/controls.css.map +1 -1
  80. package/dist/demo.compiled.debug.js +191 -194
  81. package/dist/demo.compiled.debug.map +4 -4
  82. package/dist/demo.compiled.js +191 -194
  83. package/dist/demo.compiled.map +4 -4
  84. package/dist/demo.css +1 -1
  85. package/dist/demo.css.map +1 -1
  86. package/dist/deps.js +225 -219
  87. package/dist/locales.js +28 -28
  88. package/dist/receiver.compiled.debug.js +43 -45
  89. package/dist/receiver.compiled.debug.map +4 -4
  90. package/dist/receiver.compiled.js +43 -45
  91. package/dist/receiver.compiled.map +4 -4
  92. package/dist/shaka-player.compiled.d.ts +224 -224
  93. package/dist/shaka-player.compiled.debug.d.ts +224 -224
  94. package/dist/shaka-player.compiled.debug.externs.js +4 -3
  95. package/dist/shaka-player.compiled.debug.js +294 -303
  96. package/dist/shaka-player.compiled.debug.map +4 -4
  97. package/dist/shaka-player.compiled.externs.js +4 -3
  98. package/dist/shaka-player.compiled.js +817 -822
  99. package/dist/shaka-player.compiled.map +4 -4
  100. package/dist/shaka-player.ui.d.ts +266 -266
  101. package/dist/shaka-player.ui.debug.d.ts +266 -266
  102. package/dist/shaka-player.ui.debug.externs.js +4 -3
  103. package/dist/shaka-player.ui.debug.js +220 -229
  104. package/dist/shaka-player.ui.debug.map +4 -4
  105. package/dist/shaka-player.ui.externs.js +4 -3
  106. package/dist/shaka-player.ui.js +964 -970
  107. package/dist/shaka-player.ui.map +4 -4
  108. package/docs/design/REDESIGN.md +33 -33
  109. package/docs/design/codec_preferences.md +1 -1
  110. package/docs/design/dash-audio-channels.md +3 -3
  111. package/docs/design/dash-manifests.md +1 -1
  112. package/docs/design/gap-jumping.md +3 -3
  113. package/docs/design/preload.md +2 -2
  114. package/docs/tutorials/faq.md +8 -8
  115. package/docs/tutorials/index.json +1 -0
  116. package/docs/tutorials/plugins.md +3 -3
  117. package/docs/tutorials/selenium-grid-config.md +122 -0
  118. package/docs/tutorials/welcome.md +10 -2
  119. package/karma.conf.js +137 -30
  120. package/lib/abr/simple_abr_manager.js +12 -6
  121. package/lib/cast/cast_proxy.js +3 -4
  122. package/lib/cea/cea608_data_channel.js +2 -2
  123. package/lib/cea/cea708_service.js +5 -4
  124. package/lib/cea/mp4_cea_parser.js +11 -5
  125. package/lib/cea/sei_processor.js +6 -3
  126. package/lib/dash/dash_parser.js +9 -11
  127. package/lib/dash/mpd_utils.js +4 -5
  128. package/lib/dash/segment_list.js +1 -2
  129. package/lib/dash/segment_template.js +3 -3
  130. package/lib/hls/hls_parser.js +11 -9
  131. package/lib/hls/manifest_text_parser.js +3 -3
  132. package/lib/media/adaptation_set.js +1 -2
  133. package/lib/media/content_workarounds.js +2 -2
  134. package/lib/media/drm_engine.js +3 -2
  135. package/lib/media/media_source_engine.js +3 -2
  136. package/lib/media/mp4_segment_index_parser.js +1 -4
  137. package/lib/media/playhead.js +2 -2
  138. package/lib/media/presentation_timeline.js +18 -8
  139. package/lib/media/streaming_engine.js +6 -6
  140. package/lib/media/time_ranges_utils.js +1 -3
  141. package/lib/media/video_wrapper.js +1 -1
  142. package/lib/net/networking_engine.js +1 -1
  143. package/lib/offline/storage.js +4 -4
  144. package/lib/player.js +34 -16
  145. package/lib/polyfill/all.js +2 -3
  146. package/lib/polyfill/encryption_scheme.js +1 -1
  147. package/lib/polyfill/media_capabilities.js +3 -3
  148. package/lib/polyfill/mediasource.js +1 -1
  149. package/lib/text/cue.js +1 -1
  150. package/lib/text/simple_text_displayer.js +2 -1
  151. package/lib/text/ttml_text_parser.js +8 -5
  152. package/lib/text/ui_text_displayer.js +1 -1
  153. package/lib/util/buffer_utils.js +1 -3
  154. package/lib/util/ebml_parser.js +3 -3
  155. package/lib/util/error.js +1 -1
  156. package/lib/util/iterables.js +0 -46
  157. package/lib/util/mp4_box_parsers.js +1 -4
  158. package/lib/util/mp4_parser.js +5 -7
  159. package/lib/util/periods.js +8 -9
  160. package/lib/util/platform.js +3 -3
  161. package/lib/util/pssh.js +1 -4
  162. package/lib/util/stream_utils.js +4 -3
  163. package/lib/util/string_utils.js +3 -5
  164. package/lib/util/uint8array_utils.js +3 -5
  165. package/lib/util/xml_utils.js +15 -7
  166. package/package.json +61 -36
  167. package/roadmap.md +17 -17
  168. package/test/abr/simple_abr_manager_unit.js +3 -8
  169. package/test/ads/ad_manager_unit.js +0 -6
  170. package/test/cast/cast_proxy_unit.js +0 -8
  171. package/test/cast/cast_receiver_integration.js +1 -18
  172. package/test/cast/cast_receiver_unit.js +1 -9
  173. package/test/cast/cast_sender_unit.js +0 -6
  174. package/test/cast/cast_utils_unit.js +0 -13
  175. package/test/cea/cea608_memory_unit.js +0 -5
  176. package/test/cea/cea708_service_unit.js +0 -7
  177. package/test/cea/cea708_window_unit.js +0 -5
  178. package/test/cea/cea_decoder_unit.js +0 -6
  179. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  180. package/test/cea/dtvcc_packet_unit.js +0 -5
  181. package/test/cea/mp4_cea_parser_unit.js +0 -4
  182. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  183. package/test/dash/dash_parser_live_unit.js +2 -15
  184. package/test/dash/dash_parser_manifest_unit.js +2 -16
  185. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  186. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  187. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  188. package/test/dash/mpd_utils_unit.js +3 -11
  189. package/test/demo/demo_unit.js +0 -5
  190. package/test/deprecate/enforcer_unit.js +0 -4
  191. package/test/deprecate/version_unit.js +0 -2
  192. package/test/hls/hls_live_unit.js +2 -14
  193. package/test/hls/hls_parser_unit.js +2 -15
  194. package/test/hls/manifest_text_parser_unit.js +0 -10
  195. package/test/media/adaptation_set_criteria_unit.js +3 -7
  196. package/test/media/adaptation_set_unit.js +0 -2
  197. package/test/media/buffering_observer_unit.js +1 -4
  198. package/test/media/closed_caption_parser_unit.js +0 -3
  199. package/test/media/drm_engine_integration.js +2 -15
  200. package/test/media/drm_engine_unit.js +4 -24
  201. package/test/media/manifest_parser_unit.js +0 -4
  202. package/test/media/media_source_engine_integration.js +0 -7
  203. package/test/media/media_source_engine_unit.js +1 -14
  204. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  205. package/test/media/play_rate_controller_unit.js +0 -4
  206. package/test/media/playhead_unit.js +8 -16
  207. package/test/media/presentation_timeline_unit.js +4 -7
  208. package/test/media/region_observer_unit.js +1 -6
  209. package/test/media/region_timeline_unit.js +0 -3
  210. package/test/media/segment_index_unit.js +0 -6
  211. package/test/media/segment_reference_unit.js +0 -3
  212. package/test/media/stall_detector_unit.js +0 -5
  213. package/test/media/streaming_engine_integration.js +9 -36
  214. package/test/media/streaming_engine_unit.js +11 -35
  215. package/test/media/time_ranges_utils_unit.js +0 -2
  216. package/test/media/transmuxer_integration.js +0 -6
  217. package/test/media/webm_segment_index_parser_unit.js +0 -4
  218. package/test/net/data_uri_plugin_unit.js +0 -7
  219. package/test/net/http_plugin_unit.js +0 -9
  220. package/test/net/networking_engine_unit.js +0 -11
  221. package/test/offline/download_progress_estimator_unit.js +0 -2
  222. package/test/offline/indexeddb_storage_unit.js +0 -6
  223. package/test/offline/manifest_convert_unit.js +0 -8
  224. package/test/offline/offline_integration.js +1 -10
  225. package/test/offline/offline_manifest_parser_unit.js +0 -6
  226. package/test/offline/offline_scheme_unit.js +0 -8
  227. package/test/offline/offline_uri_unit.js +0 -2
  228. package/test/offline/storage_compatibility_unit.js +1 -14
  229. package/test/offline/storage_integration.js +1 -25
  230. package/test/player_external.js +2 -10
  231. package/test/player_integration.js +21 -28
  232. package/test/player_load_graph_integration.js +1 -6
  233. package/test/player_src_equals_external.js +3 -9
  234. package/test/player_src_equals_integration.js +0 -7
  235. package/test/player_unit.js +52 -37
  236. package/test/routing/walker_unit.js +0 -8
  237. package/test/test/assets/large_file.mpd +1 -1
  238. package/test/test/boot.js +75 -22
  239. package/test/test/externs/jasmine.js +2 -2
  240. package/test/test/externs/karma.js +4 -0
  241. package/test/test/namespace.js +10 -0
  242. package/test/test/util/canned_idb.js +0 -8
  243. package/test/test/util/cea_utils.js +0 -6
  244. package/test/test/util/dash_parser_util.js +0 -13
  245. package/test/test/util/fake_ad.js +0 -3
  246. package/test/test/util/fake_ad_manager.js +0 -9
  247. package/test/test/util/fake_demo_main.js +0 -5
  248. package/test/test/util/fake_drm_engine.js +0 -6
  249. package/test/test/util/fake_media_source_engine.js +0 -7
  250. package/test/test/util/fake_networking_engine.js +0 -5
  251. package/test/test/util/fake_text_displayer.js +0 -5
  252. package/test/test/util/indexeddb_utils.js +1 -10
  253. package/test/test/util/jasmine_fetch.js +0 -1
  254. package/test/test/util/loader.js +0 -18
  255. package/test/test/util/manifest_generator.js +9 -14
  256. package/test/test/util/manifest_parser_util.js +0 -6
  257. package/test/test/util/offline_utils.js +0 -5
  258. package/test/test/util/simple_fakes.js +9 -26
  259. package/test/test/util/stream_generator.js +0 -14
  260. package/test/test/util/streaming_engine_util.js +0 -15
  261. package/test/test/util/test_scheme.js +1 -19
  262. package/test/test/util/ttml_utils.js +0 -2
  263. package/test/test/util/ui_utils.js +0 -9
  264. package/test/test/util/util.js +5 -19
  265. package/test/test/util/waiter.js +84 -43
  266. package/test/text/cue_integration.js +0 -4
  267. package/test/text/lrc_text_parser_unit.js +0 -4
  268. package/test/text/mp4_ttml_parser_unit.js +0 -6
  269. package/test/text/mp4_vtt_parser_unit.js +1 -7
  270. package/test/text/sbv_text_parser_unit.js +0 -4
  271. package/test/text/simple_text_displayer_unit.js +1 -8
  272. package/test/text/srt_text_parser_unit.js +0 -4
  273. package/test/text/ssa_text_parser_unit.js +0 -5
  274. package/test/text/text_engine_unit.js +2 -7
  275. package/test/text/text_track_integration.js +0 -2
  276. package/test/text/ttml_text_parser_unit.js +2 -11
  277. package/test/text/ui_text_displayer_unit.js +44 -41
  278. package/test/text/vtt_text_parser_unit.js +0 -9
  279. package/test/text/web_vtt_generator_unit.js +0 -3
  280. package/test/ui/ad_ui_unit.js +0 -11
  281. package/test/ui/localization_unit.js +0 -3
  282. package/test/ui/text_displayer_layout_unit.js +1 -12
  283. package/test/ui/ui_customization_unit.js +0 -6
  284. package/test/ui/ui_integration.js +0 -16
  285. package/test/ui/ui_unit.js +1 -17
  286. package/test/util/abortable_operation_unit.js +4 -9
  287. package/test/util/array_utils_unit.js +0 -2
  288. package/test/util/buffer_utils_unit.js +0 -2
  289. package/test/util/data_view_reader_unit.js +0 -4
  290. package/test/util/ebml_parser_unit.js +0 -4
  291. package/test/util/event_manager_unit.js +0 -3
  292. package/test/util/fake_event_target_unit.js +0 -5
  293. package/test/util/functional_unit.js +1 -1
  294. package/test/util/iterables_unit.js +0 -64
  295. package/test/util/language_utils_unit.js +0 -3
  296. package/test/util/manifest_parser_utils_unit.js +0 -2
  297. package/test/util/mp4_box_parsers_unit.js +0 -5
  298. package/test/util/mp4_parser_unit.js +0 -4
  299. package/test/util/multi_map_unit.js +0 -3
  300. package/test/util/object_utils_unit.js +0 -2
  301. package/test/util/periods_unit.js +14 -7
  302. package/test/util/pssh_unit.js +0 -5
  303. package/test/util/state_history_unit.js +0 -2
  304. package/test/util/stream_utils_unit.js +3 -8
  305. package/test/util/string_utils_unit.js +0 -6
  306. package/test/util/text_parser_unit.js +0 -2
  307. package/test/util/xml_utils_unit.js +0 -4
  308. package/ui/less/ad_controls.less +4 -4
  309. package/ui/less/buttons.less +5 -5
  310. package/ui/less/containers.less +5 -7
  311. package/ui/less/overflow_menu.less +4 -4
  312. package/ui/less/range_elements.less +5 -0
  313. package/ui/locales/sjn-translations.yaml +257 -0
  314. package/ui/locales/sjn.json +42 -0
  315. package/.github/workflows/build_and_test.yaml +0 -73
  316. package/.github/workflows/release.yaml +0 -53
  317. 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.offline.ManifestConverter');
9
- goog.require('shaka.offline.indexeddb.V1StorageCell');
10
- goog.require('shaka.offline.indexeddb.V2StorageCell');
11
- goog.require('shaka.offline.indexeddb.V5StorageCell');
12
- goog.require('shaka.test.CannedIDB');
13
- goog.require('shaka.test.IndexedDBUtils');
14
- goog.require('shaka.test.ManifestGenerator');
15
- goog.require('shaka.test.Util');
16
- goog.require('shaka.util.Error');
17
- goog.require('shaka.util.ManifestParserUtils');
18
- goog.require('shaka.util.StringUtils');
19
-
20
7
  // All of the database dumps referenced below were originally made from the
21
8
  // "Heliocentrism" content in our demo app.
22
9
  // https://storage.googleapis.com/shaka-demo-assets/heliocentrism/heliocentrism.mpd
@@ -80,7 +67,7 @@ const compatibilityTestsMetadata = [
80
67
  // This is the v4 version of the database as written by v2.5.0 - v2.5.9. A
81
68
  // bug in v2.5 caused the stream metadata from all periods to be written to
82
69
  // each period. This was corrected in v2.5.10.
83
- // See https://github.com/google/shaka-player/issues/2389
70
+ // See https://github.com/shaka-project/shaka-player/issues/2389
84
71
  name: 'v4-broken',
85
72
  dbImagePath: '/base/test/test/assets/db-dump-v4-broken.json',
86
73
  manifestKey: 1,
@@ -4,30 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('goog.asserts');
8
- goog.require('shaka.Player');
9
- goog.require('shaka.media.DrmEngine');
10
- goog.require('shaka.media.ManifestParser');
11
- goog.require('shaka.media.SegmentIndex');
12
- goog.require('shaka.net.NetworkingEngine.RequestType');
13
- goog.require('shaka.offline.ManifestConverter');
14
- goog.require('shaka.offline.OfflineUri');
15
- goog.require('shaka.offline.Storage');
16
- goog.require('shaka.offline.StorageMuxer');
17
- goog.require('shaka.test.FakeDrmEngine');
18
- goog.require('shaka.test.FakeManifestParser');
19
- goog.require('shaka.test.FakeNetworkingEngine');
20
- goog.require('shaka.test.Loader');
21
- goog.require('shaka.test.ManifestGenerator');
22
- goog.require('shaka.test.TestScheme');
23
- goog.require('shaka.test.Util');
24
- goog.require('shaka.util.AbortableOperation');
25
- goog.require('shaka.util.Error');
26
- goog.require('shaka.util.EventManager');
27
- goog.require('shaka.util.PlayerConfiguration');
28
- goog.require('shaka.util.PublicPromise');
29
- goog.requireType('shaka.media.SegmentReference');
30
-
31
7
  /** @return {boolean} */
32
8
  function storageSupport() {
33
9
  return shaka.offline.Storage.support();
@@ -1277,7 +1253,7 @@ filterDescribe('Storage', storageSupport, () => {
1277
1253
  const testSchemeMimeType = 'application/x-test-manifest';
1278
1254
  const manifestUri = 'test:sintel';
1279
1255
 
1280
- // Regression test for https://github.com/google/shaka-player/issues/2781
1256
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/2781
1281
1257
  it('does not cache failures or cancellations', async () => {
1282
1258
  /** @type {shaka.offline.Storage} */
1283
1259
  const storage = new shaka.offline.Storage();
@@ -4,15 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('ShakaDemoAssetInfo');
8
- goog.require('shaka.test.Loader');
9
- goog.require('shaka.test.UiUtils');
10
- goog.require('shaka.test.Util');
11
- goog.require('shaka.test.Waiter');
12
- goog.require('shaka.util.EventManager');
13
- goog.requireType('shaka.Player');
14
- goog.requireType('shaka.net.NetworkingEngine.RequestType');
15
-
16
7
  describe('Player', () => {
17
8
  const Util = shaka.test.Util;
18
9
  const Feature = shakaAssets.Feature;
@@ -48,6 +39,7 @@ describe('Player', () => {
48
39
  // Grab event manager from the uncompiled library:
49
40
  eventManager = new shaka.util.EventManager();
50
41
  waiter = new shaka.test.Waiter(eventManager);
42
+ waiter.setPlayer(player);
51
43
 
52
44
  onErrorSpy = jasmine.createSpy('onError');
53
45
  onErrorSpy.and.callFake((event) => fail(event.detail));
@@ -117,7 +109,7 @@ describe('Player', () => {
117
109
 
118
110
  // Make sure we don't get stuck on gaps that only appear in some
119
111
  // browsers (Safari, Firefox).
120
- // TODO(https://github.com/google/shaka-player/issues/1702):
112
+ // TODO(https://github.com/shaka-project/shaka-player/issues/1702):
121
113
  // Is this necessary because of a bug in Shaka Player?
122
114
  player.configure('streaming.jumpLargeGaps', true);
123
115
 
@@ -4,22 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('goog.Uri');
8
- goog.require('shaka.Player');
9
- goog.require('shaka.log');
10
- goog.require('shaka.media.DrmEngine');
11
- goog.require('shaka.media.TimeRangesUtils');
12
- goog.require('shaka.test.FakeAbrManager');
13
- goog.require('shaka.test.FakeTextDisplayer');
14
- goog.require('shaka.test.Loader');
15
- goog.require('shaka.test.TestScheme');
16
- goog.require('shaka.test.UiUtils');
17
- goog.require('shaka.test.Util');
18
- goog.require('shaka.test.Waiter');
19
- goog.require('shaka.util.EventManager');
20
- goog.require('shaka.util.Functional');
21
- goog.require('shaka.util.Iterables');
22
-
23
7
  describe('Player', () => {
24
8
  /** @type {!jasmine.Spy} */
25
9
  let onErrorSpy;
@@ -53,6 +37,7 @@ describe('Player', () => {
53
37
  // Grab event manager from the uncompiled library:
54
38
  eventManager = new shaka.util.EventManager();
55
39
  waiter = new shaka.test.Waiter(eventManager);
40
+ waiter.setPlayer(player);
56
41
 
57
42
  onErrorSpy = jasmine.createSpy('onError');
58
43
  onErrorSpy.and.callFake((event) => {
@@ -264,7 +249,7 @@ describe('Player', () => {
264
249
  expect(variantTrack.language).toBe(textTrack.language);
265
250
  });
266
251
 
267
- // Repro for https://github.com/google/shaka-player/issues/1879.
252
+ // Repro for https://github.com/shaka-project/shaka-player/issues/1879.
268
253
  it('appends cues when enabled initially', async () => {
269
254
  let cues = [];
270
255
  /** @const {!shaka.test.FakeTextDisplayer} */
@@ -321,7 +306,7 @@ describe('Player', () => {
321
306
  expect(cues.length).toBeGreaterThan(0);
322
307
  });
323
308
 
324
- // https://github.com/google/shaka-player/issues/2553
309
+ // https://github.com/shaka-project/shaka-player/issues/2553
325
310
  it('does not change the selected track', async () => {
326
311
  player.configure('streaming.alwaysStreamText', false);
327
312
  await player.load('test:forced_subs_simulation_compiled');
@@ -447,7 +432,7 @@ describe('Player', () => {
447
432
  expect(configuredTextDisplayer).toBe(textDisplayer);
448
433
  });
449
434
 
450
- // Regression test for https://github.com/google/shaka-player/issues/1187
435
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/1187
451
436
  it('does not throw on destroy', async () => {
452
437
  await player.load('test:sintel_compiled');
453
438
  video.play();
@@ -478,7 +463,7 @@ describe('Player', () => {
478
463
  // and the track selection was ignored. Because this bug involved
479
464
  // interactions between Player and StreamingEngine, it is an integration
480
465
  // test and not a unit test.
481
- // https://github.com/google/shaka-player/issues/1119
466
+ // https://github.com/shaka-project/shaka-player/issues/1119
482
467
  it('allows early selection of specific tracks', async () => {
483
468
  /** @type {!jasmine.Spy} */
484
469
  const streamingListener = jasmine.createSpy('listener');
@@ -513,7 +498,7 @@ describe('Player', () => {
513
498
  // switchingPeriods_ in Player. Because this bug involved interactions
514
499
  // between Player and StreamingEngine, it is an integration test and not a
515
500
  // unit test.
516
- // https://github.com/google/shaka-player/issues/1119
501
+ // https://github.com/shaka-project/shaka-player/issues/1119
517
502
  it('allows selection of tracks in subsequent loads', async () => {
518
503
  /** @type {!jasmine.Spy} */
519
504
  const streamingListener = jasmine.createSpy('listener');
@@ -611,7 +596,9 @@ describe('Player', () => {
611
596
  eventManager.listen(video, 'waiting', checkOnEvent);
612
597
  eventManager.listen(player, 'trackschanged', checkOnEvent);
613
598
 
614
- const waiter = (new shaka.test.Waiter(eventManager)).timeoutAfter(10);
599
+ const waiter = new shaka.test.Waiter(eventManager)
600
+ .setPlayer(player)
601
+ .timeoutAfter(10);
615
602
  const canPlayThrough = waiter.waitForEvent(video, 'canplaythrough');
616
603
 
617
604
  await player.load('test:sintel_compiled', 5);
@@ -678,7 +665,9 @@ describe('Player', () => {
678
665
  eventManager.listen(player, 'error', Util.spyFunc(onErrorSpy));
679
666
  /** @type {shaka.test.Waiter} */
680
667
  const waiter = new shaka.test.Waiter(eventManager)
681
- .timeoutAfter(20).failOnTimeout(true);
668
+ .setPlayer(player)
669
+ .timeoutAfter(20)
670
+ .failOnTimeout(true);
682
671
  await waiter.waitForEnd(video);
683
672
 
684
673
  // The stream should have transitioned to VOD by now.
@@ -686,7 +675,7 @@ describe('Player', () => {
686
675
 
687
676
  // Check that the final seek range is as expected.
688
677
  const seekRange = player.seekRange();
689
- expect(seekRange.end).toBe(14);
678
+ expect(seekRange.end).toBeCloseTo(14);
690
679
  });
691
680
  });
692
681
 
@@ -703,6 +692,7 @@ describe('Player', () => {
703
692
  player.addEventListener('buffering', Util.spyFunc(onBuffering));
704
693
 
705
694
  waiter = new shaka.test.Waiter(eventManager)
695
+ .setPlayer(player)
706
696
  .timeoutAfter(10)
707
697
  .failOnTimeout(true);
708
698
  });
@@ -816,8 +806,7 @@ describe('Player', () => {
816
806
  }
817
807
 
818
808
  async function waitUntilBuffered(amount) {
819
- for (const _ of shaka.util.Iterables.range(25)) {
820
- shaka.util.Functional.ignored(_);
809
+ for (let i = 0; i < 25; i++) {
821
810
  // We buffer from an internal segment, so this shouldn't take long to
822
811
  // buffer.
823
812
  await Util.delay(0.1); // eslint-disable-line no-await-in-loop
@@ -894,7 +883,9 @@ describe('Player', () => {
894
883
 
895
884
  /** @type {shaka.test.Waiter} */
896
885
  const waiter = new shaka.test.Waiter(eventManager)
897
- .timeoutAfter(1).failOnTimeout(true);
886
+ .setPlayer(player)
887
+ .timeoutAfter(1)
888
+ .failOnTimeout(true);
898
889
 
899
890
  await waiter.waitForPromise(abrEnabled, 'AbrManager enabled');
900
891
 
@@ -914,7 +905,9 @@ describe('Player', () => {
914
905
 
915
906
  /** @type {shaka.test.Waiter} */
916
907
  const waiter = new shaka.test.Waiter(eventManager)
917
- .timeoutAfter(1).failOnTimeout(true);
908
+ .setPlayer(player)
909
+ .timeoutAfter(1)
910
+ .failOnTimeout(true);
918
911
 
919
912
  await waiter.waitForPromise(abrEnabled, 'AbrManager enabled');
920
913
 
@@ -4,11 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.Player');
8
- goog.require('shaka.test.UiUtils');
9
- goog.require('shaka.test.Util');
10
- goog.require('shaka.util.Error');
11
-
12
7
  describe('Player Load Graph', () => {
13
8
  const SMALL_MP4_CONTENT_URI = '/base/test/test/assets/small.mp4';
14
9
 
@@ -124,7 +119,7 @@ describe('Player Load Graph', () => {
124
119
 
125
120
  // There was a bug when calling unload before calling load would cause
126
121
  // the load to continue before the (first) unload was complete.
127
- // https://github.com/google/shaka-player/issues/612
122
+ // https://github.com/shaka-project/shaka-player/issues/612
128
123
  it('load will wait for unload to finish', async () => {
129
124
  createPlayer(/* attachedTo= */ null);
130
125
 
@@ -4,12 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.Player');
8
- goog.require('shaka.test.UiUtils');
9
- goog.require('shaka.test.Util');
10
- goog.require('shaka.test.Waiter');
11
- goog.require('shaka.util.EventManager');
12
-
13
7
  describe('Player Src Equals', () => {
14
8
  // This asset needs to be (1) long and (2) high bitrate so that we can
15
9
  // invoke unbuffered seeks.
@@ -88,7 +82,7 @@ describe('Player Src Equals', () => {
88
82
  expect(player.isBuffering()).toBeTruthy();
89
83
  });
90
84
 
91
- // A regression test for https://github.com/google/shaka-player/issues/2523
85
+ // A regression test for https://github.com/shaka-project/shaka-player/issues/2523
92
86
  it('detects subtitles in native HLS', async () => {
93
87
  const supportsNativeHls =
94
88
  video.canPlayType('application/vnd.apple.mpegurl') != '';
@@ -103,8 +97,8 @@ describe('Player Src Equals', () => {
103
97
  });
104
98
 
105
99
  // A regression test for
106
- // https://github.com/google/shaka-player/issues/2483#issuecomment-633412527
107
- // and https://github.com/google/shaka-player/issues/2593
100
+ // https://github.com/shaka-project/shaka-player/issues/2483#issuecomment-633412527
101
+ // and https://github.com/shaka-project/shaka-player/issues/2593
108
102
  it('honors preferred audio and text languages', async () => {
109
103
  const supportsNativeHls =
110
104
  video.canPlayType('application/vnd.apple.mpegurl') != '';
@@ -4,13 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('goog.Uri');
8
- goog.require('shaka.Player');
9
- goog.require('shaka.test.UiUtils');
10
- goog.require('shaka.test.Util');
11
- goog.require('shaka.test.Waiter');
12
- goog.require('shaka.util.EventManager');
13
-
14
7
  // These tests are for testing Shaka Player's integration with
15
8
  // |HTMLMediaElement.src=|. These tests are to verify that all |shaka.Player|
16
9
  // public methods behaviour correctly when playing content video |src=|.
@@ -4,30 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('goog.asserts');
8
- goog.require('shaka.Player');
9
- goog.require('shaka.log');
10
- goog.require('shaka.media.BufferingObserver');
11
- goog.require('shaka.media.ManifestParser');
12
- goog.require('shaka.media.PresentationTimeline');
13
- goog.require('shaka.media.SegmentReference');
14
- goog.require('shaka.media.SegmentIndex');
15
- goog.require('shaka.test.FakeAbrManager');
16
- goog.require('shaka.test.FakeDrmEngine');
17
- goog.require('shaka.test.FakeManifestParser');
18
- goog.require('shaka.test.FakeNetworkingEngine');
19
- goog.require('shaka.test.FakePlayhead');
20
- goog.require('shaka.test.FakeStreamingEngine');
21
- goog.require('shaka.test.FakeTextDisplayer');
22
- goog.require('shaka.test.FakeVideo');
23
- goog.require('shaka.test.ManifestGenerator');
24
- goog.require('shaka.test.Util');
25
- goog.require('shaka.util.ConfigUtils');
26
- goog.require('shaka.util.Error');
27
- goog.require('shaka.util.Iterables');
28
- goog.require('shaka.util.ManifestParserUtils');
29
- goog.requireType('shaka.media.Playhead');
30
-
31
7
  describe('Player', () => {
32
8
  const ContentType = shaka.util.ManifestParserUtils.ContentType;
33
9
  const Util = shaka.test.Util;
@@ -325,7 +301,7 @@ describe('Player', () => {
325
301
  // We used to fire the event /before/ filtering, which meant that for
326
302
  // multi-codec content, the application might select something which will
327
303
  // later be removed during filtering.
328
- // https://github.com/google/shaka-player/issues/1119
304
+ // https://github.com/shaka-project/shaka-player/issues/1119
329
305
  it('fires after tracks have been filtered', async () => {
330
306
  streamingListener.and.callFake(() => {
331
307
  const tracks = player.getVariantTracks();
@@ -621,7 +597,7 @@ describe('Player', () => {
621
597
  expect(logWarnSpy).not.toHaveBeenCalled();
622
598
  });
623
599
 
624
- // Regression test for https://github.com/google/shaka-player/issues/784
600
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/784
625
601
  it('does not throw when overwriting serverCertificate', () => {
626
602
  player.configure({
627
603
  drm: {
@@ -687,9 +663,9 @@ describe('Player', () => {
687
663
  });
688
664
 
689
665
  it('configures play and seek range for VOD', async () => {
690
- player.configure({playRangeStart: 5, playRangeEnd: 10});
691
666
  const timeline = new shaka.media.PresentationTimeline(300, 0);
692
667
  timeline.setStatic(true);
668
+ timeline.setDuration(300);
693
669
  manifest = shaka.test.ManifestGenerator.generate((manifest) => {
694
670
  manifest.presentationTimeline = timeline;
695
671
  manifest.addVariant(0, (variant) => {
@@ -697,7 +673,46 @@ describe('Player', () => {
697
673
  });
698
674
  });
699
675
  goog.asserts.assert(manifest, 'manifest must be non-null');
676
+
677
+ player.configure({playRangeStart: 5, playRangeEnd: 10});
700
678
  await player.load(fakeManifestUri, 0, fakeMimeType);
679
+
680
+ const seekRange = player.seekRange();
681
+ expect(seekRange.start).toBe(5);
682
+ expect(seekRange.end).toBe(10);
683
+ });
684
+
685
+ // Test for https://github.com/shaka-project/shaka-player/issues/4026
686
+ it('configures play and seek range with notifySegments', async () => {
687
+ const timeline = new shaka.media.PresentationTimeline(300, 0);
688
+ timeline.setStatic(true);
689
+ // This duration is used by useSegmentTemplate below to decide how many
690
+ // references to generate.
691
+ timeline.setDuration(300);
692
+ manifest = shaka.test.ManifestGenerator.generate((manifest) => {
693
+ manifest.presentationTimeline = timeline;
694
+ manifest.addVariant(0, (variant) => {
695
+ variant.addVideo(1, (stream) => {
696
+ stream.useSegmentTemplate(
697
+ '$Number$.mp4', /* segmentDuration= */ 10);
698
+ });
699
+ });
700
+ });
701
+ goog.asserts.assert(manifest, 'manifest must be non-null');
702
+
703
+ // Explicitly notify the timeline of the segment references.
704
+ const videoStream = manifest.variants[0].video;
705
+ await videoStream.createSegmentIndex();
706
+ goog.asserts.assert(videoStream.segmentIndex,
707
+ 'SegmentIndex must be non-null');
708
+ const references = Array.from(videoStream.segmentIndex);
709
+ goog.asserts.assert(references.length != 0,
710
+ 'Must have references for this test!');
711
+ timeline.notifySegments(references);
712
+
713
+ player.configure({playRangeStart: 5, playRangeEnd: 10});
714
+ await player.load(fakeManifestUri, 0, fakeMimeType);
715
+
701
716
  const seekRange = player.seekRange();
702
717
  expect(seekRange.start).toBe(5);
703
718
  expect(seekRange.end).toBe(10);
@@ -798,7 +813,7 @@ describe('Player', () => {
798
813
  expect(newConfig.streaming.bufferBehind).toBe(77);
799
814
  });
800
815
 
801
- // https://github.com/google/shaka-player/issues/1524
816
+ // https://github.com/shaka-project/shaka-player/issues/1524
802
817
  it('does not pollute other advanced DRM configs', () => {
803
818
  player.configure('drm.advanced.foo', {});
804
819
  player.configure('drm.advanced.bar', {});
@@ -1668,8 +1683,8 @@ describe('Player', () => {
1668
1683
  expect(getActiveTextTrack().id).toBe(spanishTextTrack.id);
1669
1684
  });
1670
1685
 
1671
- // Regression test for https://github.com/google/shaka-player/issues/2906
1672
- // and https://github.com/google/shaka-player/issues/2909.
1686
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/2906
1687
+ // and https://github.com/shaka-project/shaka-player/issues/2909.
1673
1688
  it('selectAudioLanguage() can choose role-less tracks', async () => {
1674
1689
  // For this test, we use a different (and simpler) manifest.
1675
1690
  // Both audio tracks are English; one has a role, and one has no roles.
@@ -1729,7 +1744,7 @@ describe('Player', () => {
1729
1744
  expect(getActiveVariantTrack().audioRoles).toEqual([]);
1730
1745
  });
1731
1746
 
1732
- // https://github.com/google/shaka-player/issues/3262
1747
+ // https://github.com/shaka-project/shaka-player/issues/3262
1733
1748
  it('selectAudioLanguage() doesn\'t change resolution', () => {
1734
1749
  player.configure('abr.enabled', false);
1735
1750
  abrManager.chooseIndex = 1;
@@ -1807,7 +1822,7 @@ describe('Player', () => {
1807
1822
  expect(getActiveTextTrack().language).toBe('en');
1808
1823
  });
1809
1824
 
1810
- // https://github.com/google/shaka-player/issues/2010
1825
+ // https://github.com/shaka-project/shaka-player/issues/2010
1811
1826
  it('changing text lang changes active stream when not streaming', () => {
1812
1827
  player.setTextTrackVisibility(false);
1813
1828
 
@@ -2112,8 +2127,8 @@ describe('Player', () => {
2112
2127
  async function runTest(languages, preference, expectedIndex) {
2113
2128
  // A manifest we can use to test language selection.
2114
2129
  manifest = shaka.test.ManifestGenerator.generate((manifest) => {
2115
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
2116
- for (const {i, item: lang} of enumerate(languages)) {
2130
+ for (let i = 0; i < languages.length; i++) {
2131
+ const lang = languages[i];
2117
2132
  if (lang.charAt(0) == '*') {
2118
2133
  manifest.addVariant(i, (variant) => {
2119
2134
  variant.primary = true;
@@ -2548,7 +2563,7 @@ describe('Player', () => {
2548
2563
  expect(variants[0].id).toBe(2);
2549
2564
 
2550
2565
  // Now increase the restriction, AbrManager should still be updated.
2551
- // https://github.com/google/shaka-player/issues/1533
2566
+ // https://github.com/shaka-project/shaka-player/issues/1533
2552
2567
  abrManager.setVariants.calls.reset();
2553
2568
  player.configure({restrictions: {maxBandwidth: Infinity}});
2554
2569
  expect(abrManager.setVariants).toHaveBeenCalledTimes(1);
@@ -3186,7 +3201,7 @@ describe('Player', () => {
3186
3201
  // Most of our Player unit tests never adapt. This allowed some assertions
3187
3202
  // to creep in that went uncaught until they happened during manual testing.
3188
3203
  // Repro only happens with audio+video variants in which we only adapt one
3189
- // type. This test covers https://github.com/google/shaka-player/issues/954
3204
+ // type. This test covers https://github.com/shaka-project/shaka-player/issues/954
3190
3205
 
3191
3206
  manifest = shaka.test.ManifestGenerator.generate((manifest) => {
3192
3207
  manifest.addVariant(0, (variant) => {
@@ -3268,7 +3283,7 @@ describe('Player', () => {
3268
3283
 
3269
3284
  describe('load', () => {
3270
3285
  it('tolerates bandwidth of NaN, undefined, or 0', async () => {
3271
- // Regression test for https://github.com/google/shaka-player/issues/938
3286
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/938
3272
3287
  manifest = shaka.test.ManifestGenerator.generate((manifest) => {
3273
3288
  manifest.addVariant(0, (variant) => {
3274
3289
  variant.bandwidth = /** @type {?} */(undefined);
@@ -4,14 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('goog.asserts');
8
- goog.require('shaka.routing.Walker');
9
- goog.require('shaka.test.Util');
10
- goog.require('shaka.util.AbortableOperation');
11
- goog.require('shaka.util.Error');
12
- goog.require('shaka.util.PublicPromise');
13
- goog.requireType('shaka.routing.Node');
14
-
15
7
  describe('Walker', () => {
16
8
  const AbortableOperation = shaka.util.AbortableOperation;
17
9
 
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <!--Generated with https://github.com/google/shaka-packager version v2.4.1-c731217-release-->
2
+ <!--Generated with https://github.com/shaka-project/shaka-packager version v2.4.1-c731217-release-->
3
3
  <MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT60S">
4
4
  <Period id="0">
5
5
  <!-- This comment is very long:
package/test/test/boot.js CHANGED
@@ -4,18 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('goog.asserts');
8
- goog.require('shaka.Player');
9
- goog.require('shaka.log');
10
- goog.require('shaka.polyfill');
11
- goog.require('shaka.util.Error');
12
- goog.require('shaka.util.Platform');
13
-
14
- // If ENABLE_DEBUG_LOADER is not set to false, goog.require() will try to load
15
- // extra sources on-the-fly using pre-computed pathes in deps.js, which is not
16
- // applicable for the tests.
17
- goog['ENABLE_DEBUG_LOADER'] = false;
18
-
19
7
  /**
20
8
  * Gets the value of an argument passed from karma.
21
9
  * @param {string} name
@@ -384,9 +372,10 @@ function configureJasmineEnvironment() {
384
372
  };
385
373
  }
386
374
 
387
- // Executed before test utilities and tests are loaded, but after Shaka Player
388
- // is loaded in uncompiled mode.
389
- try {
375
+ /**
376
+ * Set up the Shaka Player test environment.
377
+ */
378
+ function setupTestEnvironment() {
390
379
  failTestsOnFailedAssertions();
391
380
  failTestsOnNamespacedElementOrAttributeNames();
392
381
  failTestsOnUnhandledRejections();
@@ -399,12 +388,76 @@ try {
399
388
  shaka.polyfill.installAll();
400
389
 
401
390
  configureJasmineEnvironment();
391
+ }
402
392
 
403
- // eslint-disable-next-line no-restricted-syntax
404
- } catch (error) {
405
- // Throw this boot-sequence error in place of jasmine's execute method, to
406
- // fail clearly and right away without running any tests.
407
- jasmine.getEnv().execute = () => {
408
- throw error;
409
- };
393
+ /**
394
+ * Load a script dynamically and await completion.
395
+ *
396
+ * @param {string} file
397
+ * @return {!Promise}
398
+ */
399
+ function loadScript(file) {
400
+ return new Promise((resolve, reject) => {
401
+ const script = /** @type {!HTMLScriptElement} */(
402
+ document.createElement('script'));
403
+ script.defer = false;
404
+ script['async'] = false;
405
+ script.onload = resolve;
406
+ script.onerror = reject;
407
+ script.setAttribute('src', '/base/' + file);
408
+ document.head.appendChild(script);
409
+ });
410
410
  }
411
+
412
+ /**
413
+ * Load all test scripts and await completion.
414
+ *
415
+ * @return {!Promise}
416
+ */
417
+ function loadTests() {
418
+ const loadPromises = [];
419
+ for (const file of getClientArg('testFiles')) {
420
+ loadPromises.push(loadScript(file));
421
+ }
422
+ return Promise.all(loadPromises);
423
+ }
424
+
425
+ // Hijack Karma's start() method and start things our way.
426
+ // eslint-disable-next-line no-restricted-syntax
427
+ const originalStart = window.__karma__.start.bind(window.__karma__);
428
+ window.__karma__.start = async () => {
429
+ // Executed when Karma has finished loading everything it loads for us.
430
+ // Those things were all loaded in parallel, and had no interdependencies
431
+ // other than those in the Shaka Player library, tracked by the Closure
432
+ // library's goog.require/goog.provide.
433
+
434
+ // Now we load the tests from here, rather than letting Karma do it. This
435
+ // give us control over the order, so that everything else is loaded and
436
+ // complete before any tests are requested. Then we may reference test
437
+ // utilities and library namespaces in the body of describe() blocks, which
438
+ // are executed synchronously as the test scripts are loaded. Without this
439
+ // ordering, we would have to either:
440
+ // 1. very carefully avoid references in describe() and defer them to
441
+ // beforeAll()
442
+ // or 2. strictly adopt goog.provide/goog.require throughout our tests
443
+ // In those scenarios, failure to do so would only manifest some of the time
444
+ // and on certain platforms. So this seems to be the more robust solution.
445
+
446
+ // See https://github.com/shaka-project/shaka-player/issues/4094
447
+
448
+ try {
449
+ setupTestEnvironment();
450
+ console.log('Set up test environment.');
451
+ await loadTests();
452
+ console.log('Loaded all tests.');
453
+
454
+ // eslint-disable-next-line no-restricted-syntax
455
+ } catch (error) {
456
+ console.error('Error during setup:', error);
457
+ window.__karma__.error(error);
458
+ return;
459
+ }
460
+
461
+ // Finally, start the tests.
462
+ originalStart();
463
+ };
@@ -343,7 +343,7 @@ jasmine.Spy.prototype.and;
343
343
  /**
344
344
  * @param {string} name
345
345
  * @return {!jasmine.Spy}
346
- * @see https://github.com/google/closure-compiler/issues/1422
346
+ * @see https://github.com/shaka-project/closure-compiler/issues/1422
347
347
  */
348
348
  jasmine.createSpy = function(name) {};
349
349
 
@@ -360,7 +360,7 @@ jasmine.createSpyObj = function(name, members) {};
360
360
  * @param {*} obj
361
361
  * @param {string} name
362
362
  * @return {!jasmine.Spy}
363
- * @see https://github.com/google/closure-compiler/issues/1422
363
+ * @see https://github.com/shaka-project/closure-compiler/issues/1422
364
364
  */
365
365
  var spyOn = function(obj, name) {};
366
366
 
@@ -20,3 +20,7 @@ __karma__.config = {};
20
20
 
21
21
  /** @const {!Array.<*>} */
22
22
  __karma__.config.args;
23
+
24
+
25
+ /** @param {?} error */
26
+ __karma__.error = function(error) {};