shaka-player 3.3.2 → 3.3.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 (339) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/pull_request_template.md +6 -34
  4. package/.github/workflows/build-and-test.yaml +129 -0
  5. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  6. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  7. package/.github/workflows/demo-version-index.yaml +29 -0
  8. package/.github/workflows/nightly-demo.yaml +42 -0
  9. package/.github/workflows/release-please.yaml +147 -0
  10. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  11. package/.github/workflows/selenium-lab-tests.yaml +92 -0
  12. package/AUTHORS +2 -0
  13. package/CHANGELOG.md +1718 -1675
  14. package/CONTRIBUTING.md +2 -2
  15. package/CONTRIBUTORS +2 -0
  16. package/README.md +7 -7
  17. package/app-engine/README.md +9 -0
  18. package/app-engine/demo-version-index/README.md +14 -0
  19. package/app-engine/demo-version-index/app.yaml +2 -0
  20. package/app-engine/demo-version-index/main.py +162 -0
  21. package/app-engine/demo-version-index/requirements.txt +6 -0
  22. package/app-engine/demo-version-index/templates/index.html +114 -0
  23. package/app-engine/shaka-player-demo/README.md +18 -0
  24. package/app-engine/shaka-player-demo/app.yaml +61 -0
  25. package/app-engine/shaka-player-demo/main.py +95 -0
  26. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  27. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  28. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  29. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  30. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  31. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  32. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  33. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  34. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  35. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  36. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  37. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  38. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  39. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  40. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  41. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  42. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  43. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  44. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  45. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  46. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  47. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  48. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  49. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  50. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  51. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  52. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  53. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  54. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  55. package/app-engine/shaka-player-demo/posters.py +110 -0
  56. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  57. package/app-engine/shaka-player-demo/time.txt +1 -0
  58. package/build/README.md +3 -3
  59. package/build/checkversion.py +2 -2
  60. package/build/conformance.textproto +13 -0
  61. package/build/docker/Dockerfile +20 -0
  62. package/build/docker/docker-compose.yml +10 -0
  63. package/build/gendeps.py +18 -15
  64. package/build/shaka-lab.yaml +163 -0
  65. package/build/shakaBuildHelpers.py +4 -29
  66. package/build/test.py +94 -29
  67. package/build/types/core +0 -1
  68. package/build/types/polyfill +1 -0
  69. package/build/wrapper.template.js +2 -2
  70. package/demo/TengwarTelcontar.woff2 +0 -0
  71. package/demo/asset_card.js +1 -2
  72. package/demo/cast_receiver/index.html +1 -1
  73. package/demo/cast_receiver/receiver_app.css +14 -14
  74. package/demo/common/assets.js +2 -0
  75. package/demo/config.js +0 -1
  76. package/demo/custom.js +0 -1
  77. package/demo/customWarning.txt +2 -2
  78. package/demo/demo.less +29 -18
  79. package/demo/demo_uncompiled.js +1 -13
  80. package/demo/index.html +1 -1
  81. package/demo/main.js +3 -3
  82. package/dist/controls.css +3 -3
  83. package/dist/controls.css.map +1 -1
  84. package/dist/demo.compiled.debug.js +191 -194
  85. package/dist/demo.compiled.debug.map +4 -4
  86. package/dist/demo.compiled.js +191 -194
  87. package/dist/demo.compiled.map +4 -4
  88. package/dist/demo.css +1 -1
  89. package/dist/demo.css.map +1 -1
  90. package/dist/deps.js +232 -226
  91. package/dist/locales.js +30 -30
  92. package/dist/receiver.compiled.debug.js +43 -45
  93. package/dist/receiver.compiled.debug.map +4 -4
  94. package/dist/receiver.compiled.js +43 -45
  95. package/dist/receiver.compiled.map +4 -4
  96. package/dist/shaka-player.compiled.d.ts +247 -236
  97. package/dist/shaka-player.compiled.debug.d.ts +247 -236
  98. package/dist/shaka-player.compiled.debug.externs.js +15 -3
  99. package/dist/shaka-player.compiled.debug.js +284 -290
  100. package/dist/shaka-player.compiled.debug.map +4 -4
  101. package/dist/shaka-player.compiled.externs.js +15 -3
  102. package/dist/shaka-player.compiled.js +855 -859
  103. package/dist/shaka-player.compiled.map +4 -4
  104. package/dist/shaka-player.ui.d.ts +291 -280
  105. package/dist/shaka-player.ui.debug.d.ts +291 -280
  106. package/dist/shaka-player.ui.debug.externs.js +15 -3
  107. package/dist/shaka-player.ui.debug.js +296 -302
  108. package/dist/shaka-player.ui.debug.map +4 -4
  109. package/dist/shaka-player.ui.externs.js +15 -3
  110. package/dist/shaka-player.ui.js +1005 -1009
  111. package/dist/shaka-player.ui.map +4 -4
  112. package/docs/design/REDESIGN.md +33 -33
  113. package/docs/design/bg-fetch.md +2 -2
  114. package/docs/design/codec_preferences.md +1 -1
  115. package/docs/design/dash-audio-channels.md +3 -3
  116. package/docs/design/dash-manifests.md +1 -1
  117. package/docs/design/gap-jumping.md +3 -3
  118. package/docs/design/preload.md +2 -2
  119. package/docs/tutorials/faq.md +8 -8
  120. package/docs/tutorials/index.json +1 -0
  121. package/docs/tutorials/plugins.md +3 -3
  122. package/docs/tutorials/selenium-grid-config.md +122 -0
  123. package/docs/tutorials/welcome.md +10 -2
  124. package/externs/cmcd.js +1 -1
  125. package/karma.conf.js +141 -30
  126. package/lib/abr/simple_abr_manager.js +12 -6
  127. package/lib/cast/cast_proxy.js +3 -4
  128. package/lib/cea/cea608_data_channel.js +2 -2
  129. package/lib/cea/cea708_service.js +5 -4
  130. package/lib/cea/mp4_cea_parser.js +11 -5
  131. package/lib/cea/sei_processor.js +6 -3
  132. package/lib/dash/dash_parser.js +11 -14
  133. package/lib/dash/mpd_utils.js +4 -5
  134. package/lib/dash/segment_list.js +1 -2
  135. package/lib/dash/segment_template.js +3 -3
  136. package/lib/hls/hls_parser.js +34 -20
  137. package/lib/hls/manifest_text_parser.js +3 -3
  138. package/lib/media/adaptation_set.js +1 -2
  139. package/lib/media/content_workarounds.js +2 -2
  140. package/lib/media/drm_engine.js +3 -2
  141. package/lib/media/media_source_engine.js +10 -3
  142. package/lib/media/mp4_segment_index_parser.js +1 -4
  143. package/lib/media/playhead.js +2 -2
  144. package/lib/media/presentation_timeline.js +18 -8
  145. package/lib/media/streaming_engine.js +6 -6
  146. package/lib/media/time_ranges_utils.js +1 -3
  147. package/lib/media/video_wrapper.js +1 -1
  148. package/lib/net/networking_engine.js +1 -1
  149. package/lib/offline/indexeddb/storage_mechanism.js +4 -2
  150. package/lib/offline/storage.js +96 -95
  151. package/lib/player.js +190 -114
  152. package/lib/polyfill/all.js +2 -3
  153. package/lib/polyfill/encryption_scheme.js +1 -1
  154. package/lib/polyfill/media_capabilities.js +3 -3
  155. package/lib/polyfill/mediasource.js +1 -1
  156. package/lib/polyfill/symbol.js +46 -0
  157. package/lib/text/cue.js +1 -1
  158. package/lib/text/simple_text_displayer.js +2 -1
  159. package/lib/text/ttml_text_parser.js +8 -5
  160. package/lib/text/ui_text_displayer.js +1 -1
  161. package/lib/util/buffer_utils.js +1 -3
  162. package/lib/util/config_utils.js +25 -0
  163. package/lib/util/ebml_parser.js +3 -3
  164. package/lib/util/error.js +8 -1
  165. package/lib/util/iterables.js +0 -46
  166. package/lib/util/manifest_parser_utils.js +1 -1
  167. package/lib/util/mime_utils.js +48 -1
  168. package/lib/util/mp4_box_parsers.js +1 -4
  169. package/lib/util/mp4_parser.js +5 -7
  170. package/lib/util/periods.js +15 -15
  171. package/lib/util/platform.js +3 -3
  172. package/lib/util/player_configuration.js +9 -14
  173. package/lib/util/pssh.js +1 -4
  174. package/lib/util/stream_utils.js +8 -5
  175. package/lib/util/string_utils.js +3 -5
  176. package/lib/util/uint8array_utils.js +3 -5
  177. package/lib/util/xml_utils.js +15 -7
  178. package/package.json +61 -36
  179. package/roadmap.md +17 -17
  180. package/shaka-player.uncompiled.js +1 -0
  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 +1 -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 +2 -15
  197. package/test/dash/dash_parser_manifest_unit.js +2 -40
  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 +28 -14
  206. package/test/hls/hls_parser_unit.js +2 -15
  207. package/test/hls/manifest_text_parser_unit.js +19 -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 +2 -15
  213. package/test/media/drm_engine_unit.js +4 -24
  214. package/test/media/manifest_parser_unit.js +0 -4
  215. package/test/media/media_source_engine_integration.js +1 -7
  216. package/test/media/media_source_engine_unit.js +5 -18
  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/quality_observer_unit.js +0 -4
  222. package/test/media/region_observer_unit.js +1 -6
  223. package/test/media/region_timeline_unit.js +0 -3
  224. package/test/media/segment_index_unit.js +0 -6
  225. package/test/media/segment_reference_unit.js +0 -3
  226. package/test/media/stall_detector_unit.js +0 -5
  227. package/test/media/streaming_engine_integration.js +11 -36
  228. package/test/media/streaming_engine_unit.js +11 -35
  229. package/test/media/time_ranges_utils_unit.js +0 -2
  230. package/test/media/transmuxer_integration.js +0 -6
  231. package/test/media/webm_segment_index_parser_unit.js +0 -4
  232. package/test/net/data_uri_plugin_unit.js +0 -7
  233. package/test/net/http_plugin_unit.js +0 -9
  234. package/test/net/networking_engine_unit.js +0 -11
  235. package/test/offline/download_progress_estimator_unit.js +0 -2
  236. package/test/offline/indexeddb_storage_unit.js +1 -7
  237. package/test/offline/manifest_convert_unit.js +0 -8
  238. package/test/offline/offline_integration.js +1 -10
  239. package/test/offline/offline_manifest_parser_unit.js +0 -6
  240. package/test/offline/offline_scheme_unit.js +0 -8
  241. package/test/offline/offline_uri_unit.js +0 -2
  242. package/test/offline/storage_compatibility_unit.js +2 -15
  243. package/test/offline/storage_integration.js +1 -27
  244. package/test/player_external.js +9 -11
  245. package/test/player_integration.js +28 -38
  246. package/test/player_load_graph_integration.js +1 -6
  247. package/test/player_src_equals_external.js +3 -9
  248. package/test/player_src_equals_integration.js +81 -90
  249. package/test/player_unit.js +150 -38
  250. package/test/routing/walker_unit.js +0 -8
  251. package/test/test/assets/large_file.mpd +1 -1
  252. package/test/test/boot.js +84 -22
  253. package/test/test/externs/filters.js +4 -0
  254. package/test/test/externs/jasmine.js +2 -2
  255. package/test/test/externs/karma.js +4 -0
  256. package/test/test/namespace.js +10 -0
  257. package/test/test/util/canned_idb.js +0 -8
  258. package/test/test/util/cea_utils.js +0 -6
  259. package/test/test/util/dash_parser_util.js +0 -13
  260. package/test/test/util/fake_ad.js +0 -3
  261. package/test/test/util/fake_ad_manager.js +0 -9
  262. package/test/test/util/fake_demo_main.js +0 -5
  263. package/test/test/util/fake_drm_engine.js +0 -6
  264. package/test/test/util/fake_media_source_engine.js +0 -7
  265. package/test/test/util/fake_networking_engine.js +0 -5
  266. package/test/test/util/fake_text_displayer.js +0 -5
  267. package/test/test/util/indexeddb_utils.js +1 -10
  268. package/test/test/util/jasmine_fetch.js +0 -1
  269. package/test/test/util/loader.js +0 -18
  270. package/test/test/util/manifest_generator.js +9 -14
  271. package/test/test/util/manifest_parser_util.js +0 -6
  272. package/test/test/util/offline_utils.js +0 -5
  273. package/test/test/util/simple_fakes.js +40 -28
  274. package/test/test/util/stream_generator.js +0 -14
  275. package/test/test/util/streaming_engine_util.js +0 -15
  276. package/test/test/util/test_scheme.js +1 -19
  277. package/test/test/util/ttml_utils.js +0 -2
  278. package/test/test/util/ui_utils.js +0 -9
  279. package/test/test/util/util.js +5 -19
  280. package/test/test/util/waiter.js +84 -43
  281. package/test/text/cue_integration.js +0 -4
  282. package/test/text/lrc_text_parser_unit.js +0 -4
  283. package/test/text/mp4_ttml_parser_unit.js +0 -6
  284. package/test/text/mp4_vtt_parser_unit.js +1 -7
  285. package/test/text/sbv_text_parser_unit.js +0 -4
  286. package/test/text/simple_text_displayer_unit.js +1 -8
  287. package/test/text/srt_text_parser_unit.js +0 -4
  288. package/test/text/ssa_text_parser_unit.js +0 -5
  289. package/test/text/text_engine_unit.js +2 -7
  290. package/test/text/text_track_integration.js +0 -2
  291. package/test/text/ttml_text_parser_unit.js +2 -11
  292. package/test/text/ui_text_displayer_unit.js +44 -41
  293. package/test/text/vtt_text_parser_unit.js +0 -9
  294. package/test/text/web_vtt_generator_unit.js +0 -3
  295. package/test/ui/ad_ui_unit.js +0 -11
  296. package/test/ui/localization_unit.js +0 -3
  297. package/test/ui/text_displayer_layout_unit.js +1 -12
  298. package/test/ui/ui_customization_unit.js +0 -6
  299. package/test/ui/ui_integration.js +0 -16
  300. package/test/ui/ui_unit.js +1 -17
  301. package/test/util/abortable_operation_unit.js +4 -9
  302. package/test/util/array_utils_unit.js +0 -2
  303. package/test/util/buffer_utils_unit.js +0 -2
  304. package/test/util/cmcd_manager_unit.js +0 -3
  305. package/test/util/data_view_reader_unit.js +0 -4
  306. package/test/util/ebml_parser_unit.js +0 -4
  307. package/test/util/event_manager_unit.js +0 -3
  308. package/test/util/fake_event_target_unit.js +0 -5
  309. package/test/util/functional_unit.js +1 -1
  310. package/test/util/iterables_unit.js +0 -64
  311. package/test/util/language_utils_unit.js +0 -3
  312. package/test/util/manifest_parser_utils_unit.js +0 -2
  313. package/test/util/mime_utils_unit.js +54 -0
  314. package/test/util/mp4_box_parsers_unit.js +0 -5
  315. package/test/util/mp4_parser_unit.js +0 -4
  316. package/test/util/multi_map_unit.js +0 -3
  317. package/test/util/object_utils_unit.js +0 -2
  318. package/test/util/periods_unit.js +93 -7
  319. package/test/util/pssh_unit.js +0 -5
  320. package/test/util/state_history_unit.js +0 -2
  321. package/test/util/stream_utils_unit.js +3 -8
  322. package/test/util/string_utils_unit.js +0 -6
  323. package/test/util/text_parser_unit.js +0 -2
  324. package/test/util/xml_utils_unit.js +0 -4
  325. package/ui/less/ad_controls.less +6 -6
  326. package/ui/less/buttons.less +6 -6
  327. package/ui/less/containers.less +13 -15
  328. package/ui/less/overflow_menu.less +4 -4
  329. package/ui/less/range_elements.less +7 -2
  330. package/ui/less/tooltip.less +4 -4
  331. package/ui/locales/sjn-translations.yaml +257 -0
  332. package/ui/locales/sjn.json +42 -0
  333. package/ui/seek_bar.js +2 -1
  334. package/.github/workflows/build_and_test.yaml +0 -73
  335. package/.github/workflows/release.yaml +0 -53
  336. package/docs/tutorials/gsoc-ideas-list.md +0 -3
  337. package/externs/svgelement.js +0 -18
  338. package/externs/webcrypto.js +0 -18
  339. package/lib/util/mutex.js +0 -52
@@ -4,14 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.IndexedDBUtils');
8
-
9
- goog.require('shaka.test.Util');
10
- goog.require('shaka.util.Functional');
11
- goog.require('shaka.util.Iterables');
12
- goog.require('shaka.util.PublicPromise');
13
-
14
-
15
7
  shaka.test.IndexedDBUtils = class {
16
8
  /**
17
9
  * Make a connection to indexeddb. This assumes that it will be a new
@@ -41,8 +33,7 @@ shaka.test.IndexedDBUtils = class {
41
33
  // connection after 5 attempts (with delays in between), just give
42
34
  // up.
43
35
  let lastError;
44
- for (const _ of shaka.util.Iterables.range(5)) {
45
- shaka.util.Functional.ignored(_);
36
+ for (let i = 0; i < 5; i++) {
46
37
  try {
47
38
  return await tryOpen(); // eslint-disable-line no-await-in-loop
48
39
  } catch (e) { // eslint-disable-line no-restricted-syntax
@@ -4,7 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
-
8
7
  // TODO: this only contains the methods that we use; if this is published
9
8
  // it should contain the entire breadth of options in jasmine-ajax.
10
9
 
@@ -4,24 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.Loader');
8
-
9
- goog.require('shaka.log');
10
- goog.require('shaka.test.TestScheme');
11
- goog.require('shaka.util.PublicPromise');
12
- goog.requireType('shaka.Player');
13
- goog.requireType('shaka.media.InitSegmentReference');
14
- goog.requireType('shaka.media.PresentationTimeline');
15
- goog.requireType('shaka.media.SegmentIndex');
16
- goog.requireType('shaka.media.SegmentReference');
17
- goog.requireType('shaka.net.NetworkingEngine');
18
- goog.requireType('shaka.offline.Storage');
19
- goog.requireType('shaka.ui.Controls');
20
- goog.requireType('shaka.ui.Element');
21
- goog.requireType('shaka.ui.Overlay');
22
- goog.requireType('shaka.util.StringUtils');
23
-
24
-
25
7
  /**
26
8
  * A stand-in type for the "shaka" namespace. Used when loading the compiled
27
9
  * library or when referencing it in ManifestGenerator or TestScheme.
@@ -4,18 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.ManifestGenerator');
8
-
9
- goog.require('goog.asserts');
10
- goog.require('shaka.test.Util');
11
- goog.require('shaka.util.Iterables');
12
- goog.require('shaka.util.ManifestParserUtils');
13
- goog.require('shaka.util.Uint8ArrayUtils');
14
- goog.requireType('shaka.media.InitSegmentReference');
15
- goog.requireType('shaka.media.PresentationTimeline');
16
- goog.requireType('shaka.media.SegmentIndex');
17
-
18
-
19
7
  /**
20
8
  * @summary
21
9
  * A helper class used to generate manifests. This is done through a series
@@ -606,13 +594,20 @@ shaka.test.ManifestGenerator.Stream = class {
606
594
  segmentDuration, 'Must pass a non-zero segment duration');
607
595
 
608
596
  const shaka_ = this.manifest_.shaka_;
609
- const totalDuration = this.manifest_.presentationTimeline.getDuration();
597
+ let totalDuration = this.manifest_.presentationTimeline.getDuration();
610
598
  goog.asserts.assert(
611
599
  isFinite(totalDuration), 'Must specify a manifest duration');
600
+ if (!isFinite(totalDuration)) {
601
+ // Without this, a mistake of an infinite duration would result in an
602
+ // infinite loop and a crash, which would in turn prevent you from seeing
603
+ // the above assertion fail.
604
+ totalDuration = 0;
605
+ }
606
+
612
607
  const segmentCount = totalDuration / segmentDuration;
613
608
  const references = [];
614
609
 
615
- for (const index of shaka.util.Iterables.range(segmentCount)) {
610
+ for (let index = 0; index < segmentCount; index++) {
616
611
  const getUris = () => [sprintf(template, index)];
617
612
  const start = index * segmentDuration;
618
613
  const end = Math.min(totalDuration, (index + 1) * segmentDuration);
@@ -4,12 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.ManifestParser');
8
-
9
- goog.require('shaka.media.InitSegmentReference');
10
- goog.require('shaka.media.SegmentReference');
11
-
12
-
13
7
  shaka.test.ManifestParser = class {
14
8
  /**
15
9
  * Verifies the segment references of a stream.
@@ -4,11 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.OfflineUtils');
8
-
9
- goog.require('shaka.util.BufferUtils');
10
-
11
-
12
7
  shaka.test.OfflineUtils = class {
13
8
  /**
14
9
  * @param {string} originalUri
@@ -4,28 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.FakeAbrManager');
8
- goog.provide('shaka.test.FakeClosedCaptionParser');
9
- goog.provide('shaka.test.FakeManifestParser');
10
- goog.provide('shaka.test.FakePlayhead');
11
- goog.provide('shaka.test.FakePlayheadObserver');
12
- goog.provide('shaka.test.FakePresentationTimeline');
13
- goog.provide('shaka.test.FakeSegmentIndex');
14
- goog.provide('shaka.test.FakeStreamingEngine');
15
- goog.provide('shaka.test.FakeTextTrack');
16
- goog.provide('shaka.test.FakeTransmuxer');
17
- goog.provide('shaka.test.FakeVideo');
18
-
19
- goog.require('shaka.test.Util');
20
- goog.require('shaka.abr.SimpleAbrManager');
21
- goog.require('shaka.media.IClosedCaptionParser');
22
- goog.require('shaka.media.Playhead');
23
- goog.require('shaka.media.PresentationTimeline');
24
- goog.require('shaka.media.SegmentIndex');
25
- goog.require('shaka.media.StreamingEngine');
26
- goog.require('shaka.media.Transmuxer');
27
-
28
-
29
7
  /**
30
8
  * @fileoverview Defines simple mocks for library types.
31
9
  * @suppress {checkTypes} Suppress errors about missmatches between the
@@ -174,9 +152,27 @@ shaka.test.FakeVideo = class {
174
152
  constructor(currentTime) {
175
153
  /** @const {!Object.<string, !Function>} */
176
154
  this.on = {}; // event listeners
155
+
177
156
  /** @type {!Array.<!TextTrack>} */
178
157
  this.textTracks = [];
179
158
 
159
+ // In a real video element, textTracks is an event target.
160
+ // Since Player listens to events on textTracks, we need to fake that
161
+ // interface.
162
+ this.textTracksEventTarget = new shaka.util.FakeEventTarget();
163
+ this.textTracks.addEventListener =
164
+ // eslint-disable-next-line no-restricted-syntax
165
+ this.textTracksEventTarget.addEventListener.bind(
166
+ this.textTracksEventTarget);
167
+ this.textTracks.removeEventListener =
168
+ // eslint-disable-next-line no-restricted-syntax
169
+ this.textTracksEventTarget.removeEventListener.bind(
170
+ this.textTracksEventTarget);
171
+ this.textTracks.dispatchEvent =
172
+ // eslint-disable-next-line no-restricted-syntax
173
+ this.textTracksEventTarget.dispatchEvent.bind(
174
+ this.textTracksEventTarget);
175
+
180
176
  this.currentTime = currentTime || 0;
181
177
  this.readyState = 0;
182
178
  this.playbackRate = 1;
@@ -195,6 +191,10 @@ shaka.test.FakeVideo = class {
195
191
  jasmine.createSpy('addTextTrack').and.callFake((kind, id) => {
196
192
  const track = new shaka.test.FakeTextTrack();
197
193
  this.textTracks.push(track);
194
+
195
+ const trackEvent = new shaka.util.FakeEvent('addtrack', {track});
196
+ this.textTracksEventTarget.dispatchEvent(trackEvent);
197
+
198
198
  return track;
199
199
  });
200
200
 
@@ -330,11 +330,18 @@ shaka.test.FakePlayhead = class {
330
330
  /** @type {!jasmine.Spy} */
331
331
  this.setRebufferingGoal = jasmine.createSpy('setRebufferingGoal');
332
332
 
333
+ /** @private {number} */
334
+ this.startTime_ = 0;
335
+
333
336
  /** @type {!jasmine.Spy} */
334
- this.setStartTime = jasmine.createSpy('setStartTime');
337
+ this.setStartTime = jasmine.createSpy('setStartTime')
338
+ .and.callFake((value) => {
339
+ this.startTime_ = value;
340
+ });
335
341
 
336
342
  /** @type {!jasmine.Spy} */
337
- this.getTime = jasmine.createSpy('getTime').and.returnValue(0);
343
+ this.getTime = jasmine.createSpy('getTime')
344
+ .and.callFake(() => this.startTime_);
338
345
 
339
346
  /** @type {!jasmine.Spy} */
340
347
  this.setBuffering = jasmine.createSpy('setBuffering');
@@ -351,19 +358,24 @@ shaka.test.FakePlayhead = class {
351
358
  /** @extends {TextTrack} */
352
359
  shaka.test.FakeTextTrack = class {
353
360
  constructor() {
361
+ // The compiler knows TextTrack.cues is const, and we lied and said we
362
+ // "extend" TextTrack, so it won't let us assign to cues here. But we
363
+ // must, because this fake is a from-scratch implementation of the API.
364
+ // This cast-hack works around the issue.
354
365
  /** @type {!Array.<TextTrackCue>} */
355
- this.cues = [];
366
+ const cues = [];
367
+ (/** @type {?} */(this))['cues'] = cues;
356
368
 
357
369
  /** @type {!jasmine.Spy} */
358
370
  this.addCue = jasmine.createSpy('addCue').and.callFake((cue) => {
359
- this.cues.push(cue);
371
+ cues.push(cue);
360
372
  });
361
373
 
362
374
  /** @type {!jasmine.Spy} */
363
375
  this.removeCue = jasmine.createSpy('removeCue').and.callFake((cue) => {
364
- const idx = this.cues.indexOf(cue);
376
+ const idx = cues.indexOf(cue);
365
377
  expect(idx).not.toBeLessThan(0);
366
- this.cues.splice(idx, 1);
378
+ cues.splice(idx, 1);
367
379
  });
368
380
  }
369
381
  };
@@ -4,20 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.IStreamGenerator');
8
- goog.provide('shaka.test.Mp4LiveStreamGenerator');
9
- goog.provide('shaka.test.Mp4VodStreamGenerator');
10
- goog.provide('shaka.test.StreamGenerator');
11
- goog.provide('shaka.test.TSVodStreamGenerator');
12
-
13
- goog.require('goog.asserts');
14
- goog.require('shaka.log');
15
- goog.require('shaka.test.Util');
16
- goog.require('shaka.util.BufferUtils');
17
- goog.require('shaka.util.DataViewReader');
18
- goog.require('shaka.util.Uint8ArrayUtils');
19
-
20
-
21
7
  /**
22
8
  * @summary
23
9
  * Defines an interface to generate streams.
@@ -4,21 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.StreamingEngineUtil');
8
-
9
- goog.require('goog.asserts');
10
- goog.require('shaka.media.InitSegmentReference');
11
- goog.require('shaka.media.SegmentReference');
12
- goog.require('shaka.test.FakeNetworkingEngine');
13
- goog.require('shaka.test.FakePresentationTimeline');
14
- goog.require('shaka.test.FakeSegmentIndex');
15
- goog.require('shaka.test.Util');
16
- goog.require('shaka.util.AbortableOperation');
17
- goog.require('shaka.util.Error');
18
- goog.require('shaka.util.ManifestParserUtils');
19
- goog.requireType('shaka.media.PresentationTimeline');
20
-
21
-
22
7
  shaka.test.StreamingEngineUtil = class {
23
8
  /**
24
9
  * Creates a FakeNetworkingEngine.
@@ -4,24 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.TestScheme');
8
-
9
- goog.require('goog.asserts');
10
- goog.require('goog.Uri');
11
- goog.require('shaka.Player');
12
- goog.require('shaka.media.ManifestParser');
13
- goog.require('shaka.net.NetworkingEngine');
14
- goog.require('shaka.test.ManifestGenerator');
15
- goog.require('shaka.test.Mp4VodStreamGenerator');
16
- goog.require('shaka.test.TSVodStreamGenerator');
17
- goog.require('shaka.test.Util');
18
- goog.require('shaka.util.AbortableOperation');
19
- goog.require('shaka.util.Error');
20
- goog.require('shaka.util.ManifestParserUtils');
21
- goog.requireType('shaka.net.NetworkingEngine.RequestType');
22
- goog.requireType('shaka.test.IStreamGenerator');
23
-
24
-
25
7
  /**
26
8
  * @typedef {{
27
9
  * initSegmentUri: string,
@@ -578,7 +560,7 @@ shaka.test.TestScheme.DATA = {
578
560
  duration: 30,
579
561
  },
580
562
 
581
- // https://github.com/google/shaka-player/issues/2553
563
+ // https://github.com/shaka-project/shaka-player/issues/2553
582
564
  'forced_subs_simulation': {
583
565
  audio: sintelAudioSegment,
584
566
  text: vttSegment,
@@ -4,8 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.TtmlUtils');
8
-
9
7
  shaka.test.TtmlUtils = class {
10
8
  /**
11
9
  * @param {!Array} expectedCues
@@ -4,15 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
-
8
- goog.provide('shaka.test.UiUtils');
9
-
10
- goog.require('shaka.Player');
11
- goog.require('shaka.test.Waiter');
12
- goog.require('shaka.ui.Overlay');
13
- goog.require('shaka.util.EventManager');
14
-
15
-
16
7
  shaka.test.UiUtils = class {
17
8
  /**
18
9
  * @param {!HTMLElement} videoContainer
@@ -4,19 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.StatusPromise');
8
- goog.provide('shaka.test.Util');
9
-
10
- goog.require('goog.asserts');
11
- goog.require('shaka.media.InitSegmentReference');
12
- goog.require('shaka.media.SegmentReference');
13
- goog.require('shaka.util.Functional');
14
- goog.require('shaka.util.Iterables');
15
- goog.require('shaka.util.StringUtils');
16
- goog.require('shaka.util.XmlUtils');
17
- goog.requireType('shaka.util.Error');
18
-
19
-
20
7
  /**
21
8
  * @extends {Promise}
22
9
  */
@@ -52,10 +39,9 @@ shaka.test.Util = class {
52
39
  */
53
40
  static async fakeEventLoop(duration, onTick) {
54
41
  // Run this synchronously:
55
- for (const time of shaka.util.Iterables.range(duration)) {
42
+ for (let time = 0; time < duration; time++) {
56
43
  // We shouldn't need more than 6 rounds.
57
- for (const _ of shaka.util.Iterables.range(6)) {
58
- shaka.util.Functional.ignored(_);
44
+ for (let i = 0; i < 6; i++) {
59
45
  jasmine.clock().tick(0);
60
46
  await Promise.resolve(); // eslint-disable-line no-await-in-loop
61
47
  }
@@ -203,7 +189,7 @@ shaka.test.Util = class {
203
189
  if (actual.childNodes.length != expected.childNodes.length) {
204
190
  return prospectiveDiff + 'Different child node list length.';
205
191
  }
206
- for (const i of shaka.util.Iterables.range(actual.childNodes.length)) {
192
+ for (let i = 0; i < actual.childNodes.length; i++) {
207
193
  const aNode = actual.childNodes[i];
208
194
  const eNode = expected.childNodes[i];
209
195
  const diff =
@@ -334,9 +320,9 @@ shaka.test.Util = class {
334
320
  // TODO: There should be a way to alter the externs for jasmine.Spy so that
335
321
  // this utility is not needed.
336
322
  // Why isn't there something like ICallable in Closure?
337
- // https://github.com/google/closure-compiler/issues/946
323
+ // https://github.com/shaka-project/closure-compiler/issues/946
338
324
  // Why isn't it enough that jasmine.Spy extends Function?
339
- // https://github.com/google/closure-compiler/issues/1422
325
+ // https://github.com/shaka-project/closure-compiler/issues/1422
340
326
  return /** @type {Function} */(spy)(...varArgs);
341
327
  }
342
328
 
@@ -4,14 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.Waiter');
8
-
9
- goog.require('shaka.log');
10
- goog.require('shaka.media.TimeRangesUtils');
11
- goog.require('shaka.test.Util');
12
- goog.require('shaka.util.EventManager');
13
-
14
-
15
7
  shaka.test.Waiter = class {
16
8
  /** @param {!shaka.util.EventManager} eventManager */
17
9
  constructor(eventManager) {
@@ -23,6 +15,12 @@ shaka.test.Waiter = class {
23
15
 
24
16
  /** @private {number} */
25
17
  this.timeoutSeconds_ = 5;
18
+
19
+ /** @private {shaka.Player} */
20
+ this.player_ = null;
21
+
22
+ /** @private {shaka.media.MediaSourceEngine} */
23
+ this.mediaSourceEngine_ = null;
26
24
  }
27
25
 
28
26
  // TODO: Consider replacing this with a settings argument on the individual
@@ -51,6 +49,30 @@ shaka.test.Waiter = class {
51
49
  return this;
52
50
  }
53
51
 
52
+ /**
53
+ * For tests with access to MediaSourceEngine, this can provide better
54
+ * debugging for buffered ranges on failure.
55
+ *
56
+ * @param {shaka.Player} player
57
+ * @return {!shaka.test.Waiter}
58
+ */
59
+ setPlayer(player) {
60
+ this.player_ = player;
61
+ return this;
62
+ }
63
+
64
+ /**
65
+ * For tests with access to MediaSourceEngine, this can provide better
66
+ * debugging for buffered ranges on failure.
67
+ *
68
+ * @param {shaka.media.MediaSourceEngine} mediaSourceEngine
69
+ * @return {!shaka.test.Waiter}
70
+ */
71
+ setMediaSourceEngine(mediaSourceEngine) {
72
+ this.mediaSourceEngine_ = mediaSourceEngine;
73
+ return this;
74
+ }
75
+
54
76
  /**
55
77
  * Wait for the video playhead to move forward by some meaningful delta. The
56
78
  * Promise is resolved when the playhead moves or the video ends.
@@ -109,7 +131,6 @@ shaka.test.Waiter = class {
109
131
  return this.waitUntilGeneric_(goalName, p, cleanup, mediaElement);
110
132
  }
111
133
 
112
-
113
134
  /**
114
135
  * Wait for the video playhead to reach a certain target time.
115
136
  * If the playhead reaches |timeGoal| or the video ends before |timeout|
@@ -132,40 +153,51 @@ shaka.test.Waiter = class {
132
153
  * @return {!Promise}
133
154
  */
134
155
  waitForEnd(mediaElement) {
135
- // Sometimes, the ended flag is not set, or the event does not fire,
136
- // (I'm looking at **you**, Safari), so also check if we've reached the
137
- // duration.
138
- if (mediaElement.ended ||
139
- mediaElement.currentTime >= mediaElement.duration) {
140
- return Promise.resolve();
141
- }
142
-
143
156
  // The name of what we're waiting for.
144
157
  const goalName = 'end of media';
145
158
 
159
+ // The conditions for success. Don't rely on either time, or the ended
160
+ // flag, or the ended event, specifically. Any of these is sufficient.
161
+ // This flexibility cuts down on test flake on Safari (currently 14) in
162
+ // particular, where the flag might be set, but the ended event did not
163
+ // fire. We also see flake on Firefox (currently 99), where test playbacks
164
+ // sometimes stop right before duration is reached. (Duration 60.01, audio
165
+ // buffered to 60.01, video buffered to exactly 60.)
166
+ const hasEnded = () => {
167
+ return mediaElement.currentTime >= mediaElement.duration - 0.1 ||
168
+ mediaElement.ended;
169
+ };
170
+
171
+ if (hasEnded()) {
172
+ return Promise.resolve();
173
+ }
174
+
146
175
  // Cleanup on timeout.
176
+ let timer = null;
147
177
  const cleanup = () => {
178
+ if (timer) {
179
+ timer.stop();
180
+ }
148
181
  this.eventManager_.unlisten(mediaElement, 'timeupdate');
149
182
  this.eventManager_.unlisten(mediaElement, 'ended');
150
183
  };
151
184
 
152
- // The conditions for success. Don't rely on either time, or the ended
153
- // flag, or the ended event, specifically. Any of these is sufficient.
154
- // This flexibility cuts down on test flake on Safari (currently 14) in
155
- // particular, where the flag might be set, but the ended event did not
156
- // fire.
157
185
  const p = new Promise((resolve) => {
158
- this.eventManager_.listen(mediaElement, 'timeupdate', () => {
159
- if (mediaElement.currentTime >= mediaElement.duration ||
160
- mediaElement.ended) {
186
+ const check = () => {
187
+ if (hasEnded()) {
161
188
  cleanup();
162
189
  resolve();
163
190
  }
164
- });
165
- this.eventManager_.listen(mediaElement, 'ended', () => {
166
- cleanup();
167
- resolve();
168
- });
191
+ };
192
+
193
+ // In Firefox 99, there appears to be some bug in the browser preventing
194
+ // events from being triggered at the end of the presentation. So we
195
+ // check for the end once per second. Without this, StreamingEngine
196
+ // integration tests were failing.
197
+ timer = new shaka.util.Timer(check);
198
+ timer.tickEvery(/* seconds= */ 1);
199
+ this.eventManager_.listen(mediaElement, 'timeupdate', check);
200
+ this.eventManager_.listen(mediaElement, 'ended', check);
169
201
  });
170
202
 
171
203
  return this.waitUntilGeneric_(goalName, p, cleanup, mediaElement);
@@ -263,7 +295,7 @@ shaka.test.Waiter = class {
263
295
 
264
296
  // Improve the error message with media-specific debug info.
265
297
  if (target instanceof HTMLMediaElement) {
266
- this.logDebugInfoForMedia_(error.message, target);
298
+ this.logDebugInfoForMedia_(error, target);
267
299
  }
268
300
 
269
301
  // Reject or resolve based on our settings.
@@ -276,20 +308,29 @@ shaka.test.Waiter = class {
276
308
  }
277
309
 
278
310
  /**
279
- * @param {string} message
311
+ * @param {!Error} error
280
312
  * @param {!HTMLMediaElement} mediaElement
281
313
  * @private
282
314
  */
283
- logDebugInfoForMedia_(message, mediaElement) {
284
- const buffered =
285
- shaka.media.TimeRangesUtils.getBufferedInfo(mediaElement.buffered);
286
- shaka.log.error(message,
287
- 'current time', mediaElement.currentTime,
288
- 'duration', mediaElement.duration,
289
- 'ready state', mediaElement.readyState,
290
- 'playback rate', mediaElement.playbackRate,
291
- 'paused', mediaElement.paused,
292
- 'ended', mediaElement.ended,
293
- 'buffered', buffered);
315
+ logDebugInfoForMedia_(error, mediaElement) {
316
+ let buffered;
317
+ if (this.player_) {
318
+ buffered = this.player_.getBufferedInfo();
319
+ } else if (this.mediaSourceEngine_) {
320
+ buffered = this.mediaSourceEngine_.getBufferedInfo();
321
+ } else {
322
+ buffered = shaka.media.TimeRangesUtils.getBufferedInfo(
323
+ mediaElement.buffered);
324
+ }
325
+
326
+ error.message += '\n' +
327
+ `current time: ${mediaElement.currentTime}\n` +
328
+ `duration: ${mediaElement.duration}\n` +
329
+ `ready state: ${mediaElement.readyState}\n` +
330
+ `playback rate: ${mediaElement.playbackRate}\n` +
331
+ `paused: ${mediaElement.paused}\n` +
332
+ `ended: ${mediaElement.ended}\n` +
333
+ `buffered: ${JSON.stringify(buffered)}\n`;
334
+ shaka.log.error(error.message);
294
335
  }
295
336
  };
@@ -4,10 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.text.VttTextParser');
8
- goog.require('shaka.util.BufferUtils');
9
- goog.require('shaka.util.StringUtils');
10
-
11
7
  describe('Cue', () => {
12
8
  // This integration test checks platform support for various cue scenarios
13
9
  // that have caused platform-specific issues. The unit tests for each parser
@@ -4,10 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.text.LrcTextParser');
8
- goog.require('shaka.util.BufferUtils');
9
- goog.require('shaka.util.StringUtils');
10
-
11
7
  describe('LrcTextParser', () => {
12
8
  it('supports no cues', () => {
13
9
  verifyHelper([],
@@ -4,12 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.test.TtmlUtils');
8
- goog.require('shaka.test.Util');
9
- goog.require('shaka.text.Mp4TtmlParser');
10
- goog.require('shaka.util.BufferUtils');
11
- goog.require('shaka.util.Error');
12
-
13
7
  describe('Mp4TtmlParser', () => {
14
8
  const ttmlInitSegmentUri = '/base/test/test/assets/ttml-init.mp4';
15
9
  const ttmlSegmentUri = '/base/test/test/assets/ttml-segment.mp4';
@@ -4,12 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.test.Util');
8
- goog.require('shaka.text.Cue');
9
- goog.require('shaka.text.Mp4VttParser');
10
- goog.require('shaka.util.BufferUtils');
11
- goog.require('shaka.util.Error');
12
-
13
7
  describe('Mp4VttParser', () => {
14
8
  const vttInitSegmentUri = '/base/test/test/assets/vtt-init.mp4';
15
9
  const vttSegmentUri = '/base/test/test/assets/vtt-segment.mp4';
@@ -133,7 +127,7 @@ describe('Mp4VttParser', () => {
133
127
  });
134
128
 
135
129
  it('parses media segments without a sample duration', () => {
136
- // Regression test for https://github.com/google/shaka-player/issues/919
130
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/919
137
131
  const cues = [
138
132
  {startTime: 10, endTime: 11, payload: 'cue 10'},
139
133
  {startTime: 11, endTime: 12, payload: 'cue 11'},
@@ -4,10 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.text.SbvTextParser');
8
- goog.require('shaka.util.BufferUtils');
9
- goog.require('shaka.util.StringUtils');
10
-
11
7
  describe('SbvTextParser', () => {
12
8
  it('supports no cues', () => {
13
9
  verifyHelper([],