shaka-player 3.3.2 → 3.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/pull_request_template.md +6 -34
  4. package/.github/workflows/build-and-test.yaml +130 -0
  5. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  6. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  7. package/.github/workflows/demo-version-index.yaml +29 -0
  8. package/.github/workflows/nightly-demo.yaml +42 -0
  9. package/.github/workflows/release-please.yaml +145 -0
  10. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  11. package/.github/workflows/selenium-lab-tests.yaml +93 -0
  12. package/AUTHORS +2 -0
  13. package/CHANGELOG.md +1691 -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 +1 -1
  59. package/build/checkversion.py +1 -1
  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 +87 -28
  67. package/build/types/polyfill +1 -0
  68. package/build/wrapper.template.js +2 -2
  69. package/demo/TengwarTelcontar.woff2 +0 -0
  70. package/demo/asset_card.js +1 -2
  71. package/demo/cast_receiver/index.html +1 -1
  72. package/demo/cast_receiver/receiver_app.css +14 -14
  73. package/demo/common/assets.js +2 -0
  74. package/demo/config.js +0 -1
  75. package/demo/custom.js +0 -1
  76. package/demo/customWarning.txt +2 -2
  77. package/demo/demo.less +29 -18
  78. package/demo/demo_uncompiled.js +1 -13
  79. package/demo/index.html +1 -1
  80. package/demo/main.js +3 -3
  81. package/dist/controls.css +3 -3
  82. package/dist/controls.css.map +1 -1
  83. package/dist/demo.compiled.debug.js +191 -194
  84. package/dist/demo.compiled.debug.map +4 -4
  85. package/dist/demo.compiled.js +191 -194
  86. package/dist/demo.compiled.map +4 -4
  87. package/dist/demo.css +1 -1
  88. package/dist/demo.css.map +1 -1
  89. package/dist/deps.js +233 -226
  90. package/dist/locales.js +31 -31
  91. package/dist/receiver.compiled.debug.js +43 -45
  92. package/dist/receiver.compiled.debug.map +4 -4
  93. package/dist/receiver.compiled.js +43 -45
  94. package/dist/receiver.compiled.map +4 -4
  95. package/dist/shaka-player.compiled.d.ts +246 -236
  96. package/dist/shaka-player.compiled.debug.d.ts +246 -236
  97. package/dist/shaka-player.compiled.debug.externs.js +14 -3
  98. package/dist/shaka-player.compiled.debug.js +214 -222
  99. package/dist/shaka-player.compiled.debug.map +4 -4
  100. package/dist/shaka-player.compiled.externs.js +14 -3
  101. package/dist/shaka-player.compiled.js +845 -851
  102. package/dist/shaka-player.compiled.map +4 -4
  103. package/dist/shaka-player.ui.d.ts +290 -280
  104. package/dist/shaka-player.ui.debug.d.ts +290 -280
  105. package/dist/shaka-player.ui.debug.externs.js +14 -3
  106. package/dist/shaka-player.ui.debug.js +295 -303
  107. package/dist/shaka-player.ui.debug.map +4 -4
  108. package/dist/shaka-player.ui.externs.js +14 -3
  109. package/dist/shaka-player.ui.js +1000 -1006
  110. package/dist/shaka-player.ui.map +4 -4
  111. package/docs/design/REDESIGN.md +33 -33
  112. package/docs/design/bg-fetch.md +2 -2
  113. package/docs/design/codec_preferences.md +1 -1
  114. package/docs/design/dash-audio-channels.md +3 -3
  115. package/docs/design/dash-manifests.md +1 -1
  116. package/docs/design/gap-jumping.md +3 -3
  117. package/docs/design/preload.md +2 -2
  118. package/docs/tutorials/faq.md +8 -8
  119. package/docs/tutorials/index.json +1 -0
  120. package/docs/tutorials/plugins.md +3 -3
  121. package/docs/tutorials/selenium-grid-config.md +122 -0
  122. package/docs/tutorials/welcome.md +10 -2
  123. package/externs/cmcd.js +1 -1
  124. package/karma.conf.js +137 -30
  125. package/lib/abr/simple_abr_manager.js +12 -6
  126. package/lib/cast/cast_proxy.js +3 -4
  127. package/lib/cea/cea608_data_channel.js +2 -2
  128. package/lib/cea/cea708_service.js +5 -4
  129. package/lib/cea/mp4_cea_parser.js +11 -5
  130. package/lib/cea/sei_processor.js +6 -3
  131. package/lib/dash/dash_parser.js +9 -11
  132. package/lib/dash/mpd_utils.js +4 -5
  133. package/lib/dash/segment_list.js +1 -2
  134. package/lib/dash/segment_template.js +3 -3
  135. package/lib/hls/hls_parser.js +11 -9
  136. package/lib/hls/manifest_text_parser.js +3 -3
  137. package/lib/media/adaptation_set.js +1 -2
  138. package/lib/media/content_workarounds.js +2 -2
  139. package/lib/media/drm_engine.js +3 -2
  140. package/lib/media/media_source_engine.js +3 -2
  141. package/lib/media/mp4_segment_index_parser.js +1 -4
  142. package/lib/media/playhead.js +2 -2
  143. package/lib/media/presentation_timeline.js +18 -8
  144. package/lib/media/streaming_engine.js +6 -6
  145. package/lib/media/time_ranges_utils.js +1 -3
  146. package/lib/media/video_wrapper.js +1 -1
  147. package/lib/net/networking_engine.js +1 -1
  148. package/lib/offline/storage.js +4 -4
  149. package/lib/player.js +34 -16
  150. package/lib/polyfill/all.js +2 -3
  151. package/lib/polyfill/encryption_scheme.js +1 -1
  152. package/lib/polyfill/media_capabilities.js +3 -3
  153. package/lib/polyfill/mediasource.js +1 -1
  154. package/lib/polyfill/symbol.js +46 -0
  155. package/lib/text/cue.js +1 -1
  156. package/lib/text/simple_text_displayer.js +2 -1
  157. package/lib/text/ttml_text_parser.js +8 -5
  158. package/lib/text/ui_text_displayer.js +1 -1
  159. package/lib/util/buffer_utils.js +1 -3
  160. package/lib/util/ebml_parser.js +3 -3
  161. package/lib/util/error.js +1 -1
  162. package/lib/util/iterables.js +0 -46
  163. package/lib/util/mp4_box_parsers.js +1 -4
  164. package/lib/util/mp4_parser.js +5 -7
  165. package/lib/util/periods.js +10 -11
  166. package/lib/util/platform.js +3 -3
  167. package/lib/util/pssh.js +1 -4
  168. package/lib/util/stream_utils.js +4 -3
  169. package/lib/util/string_utils.js +3 -5
  170. package/lib/util/uint8array_utils.js +3 -5
  171. package/lib/util/xml_utils.js +15 -7
  172. package/package.json +61 -36
  173. package/roadmap.md +17 -17
  174. package/shaka-player.uncompiled.js +1 -0
  175. package/test/abr/simple_abr_manager_unit.js +3 -8
  176. package/test/ads/ad_manager_unit.js +0 -6
  177. package/test/cast/cast_proxy_unit.js +0 -8
  178. package/test/cast/cast_receiver_integration.js +1 -18
  179. package/test/cast/cast_receiver_unit.js +1 -9
  180. package/test/cast/cast_sender_unit.js +0 -6
  181. package/test/cast/cast_utils_unit.js +0 -13
  182. package/test/cea/cea608_memory_unit.js +0 -5
  183. package/test/cea/cea708_service_unit.js +0 -7
  184. package/test/cea/cea708_window_unit.js +0 -5
  185. package/test/cea/cea_decoder_unit.js +0 -6
  186. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  187. package/test/cea/dtvcc_packet_unit.js +0 -5
  188. package/test/cea/mp4_cea_parser_unit.js +0 -4
  189. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  190. package/test/dash/dash_parser_live_unit.js +2 -15
  191. package/test/dash/dash_parser_manifest_unit.js +2 -16
  192. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  193. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  194. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  195. package/test/dash/mpd_utils_unit.js +3 -11
  196. package/test/demo/demo_unit.js +0 -5
  197. package/test/deprecate/enforcer_unit.js +0 -4
  198. package/test/deprecate/version_unit.js +0 -2
  199. package/test/hls/hls_live_unit.js +2 -14
  200. package/test/hls/hls_parser_unit.js +2 -15
  201. package/test/hls/manifest_text_parser_unit.js +0 -10
  202. package/test/media/adaptation_set_criteria_unit.js +3 -7
  203. package/test/media/adaptation_set_unit.js +0 -2
  204. package/test/media/buffering_observer_unit.js +1 -4
  205. package/test/media/closed_caption_parser_unit.js +0 -3
  206. package/test/media/drm_engine_integration.js +2 -15
  207. package/test/media/drm_engine_unit.js +4 -24
  208. package/test/media/manifest_parser_unit.js +0 -4
  209. package/test/media/media_source_engine_integration.js +0 -7
  210. package/test/media/media_source_engine_unit.js +1 -14
  211. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  212. package/test/media/play_rate_controller_unit.js +0 -4
  213. package/test/media/playhead_unit.js +8 -16
  214. package/test/media/presentation_timeline_unit.js +4 -7
  215. package/test/media/quality_observer_unit.js +0 -4
  216. package/test/media/region_observer_unit.js +1 -6
  217. package/test/media/region_timeline_unit.js +0 -3
  218. package/test/media/segment_index_unit.js +0 -6
  219. package/test/media/segment_reference_unit.js +0 -3
  220. package/test/media/stall_detector_unit.js +0 -5
  221. package/test/media/streaming_engine_integration.js +9 -36
  222. package/test/media/streaming_engine_unit.js +11 -35
  223. package/test/media/time_ranges_utils_unit.js +0 -2
  224. package/test/media/transmuxer_integration.js +0 -6
  225. package/test/media/webm_segment_index_parser_unit.js +0 -4
  226. package/test/net/data_uri_plugin_unit.js +0 -7
  227. package/test/net/http_plugin_unit.js +0 -9
  228. package/test/net/networking_engine_unit.js +0 -11
  229. package/test/offline/download_progress_estimator_unit.js +0 -2
  230. package/test/offline/indexeddb_storage_unit.js +0 -6
  231. package/test/offline/manifest_convert_unit.js +0 -8
  232. package/test/offline/offline_integration.js +1 -10
  233. package/test/offline/offline_manifest_parser_unit.js +0 -6
  234. package/test/offline/offline_scheme_unit.js +0 -8
  235. package/test/offline/offline_uri_unit.js +0 -2
  236. package/test/offline/storage_compatibility_unit.js +1 -14
  237. package/test/offline/storage_integration.js +1 -27
  238. package/test/player_external.js +2 -10
  239. package/test/player_integration.js +22 -28
  240. package/test/player_load_graph_integration.js +1 -6
  241. package/test/player_src_equals_external.js +3 -9
  242. package/test/player_src_equals_integration.js +0 -7
  243. package/test/player_unit.js +52 -37
  244. package/test/routing/walker_unit.js +0 -8
  245. package/test/test/assets/large_file.mpd +1 -1
  246. package/test/test/boot.js +75 -22
  247. package/test/test/externs/jasmine.js +2 -2
  248. package/test/test/externs/karma.js +4 -0
  249. package/test/test/namespace.js +10 -0
  250. package/test/test/util/canned_idb.js +0 -8
  251. package/test/test/util/cea_utils.js +0 -6
  252. package/test/test/util/dash_parser_util.js +0 -13
  253. package/test/test/util/fake_ad.js +0 -3
  254. package/test/test/util/fake_ad_manager.js +0 -9
  255. package/test/test/util/fake_demo_main.js +0 -5
  256. package/test/test/util/fake_drm_engine.js +0 -6
  257. package/test/test/util/fake_media_source_engine.js +0 -7
  258. package/test/test/util/fake_networking_engine.js +0 -5
  259. package/test/test/util/fake_text_displayer.js +0 -5
  260. package/test/test/util/indexeddb_utils.js +1 -10
  261. package/test/test/util/jasmine_fetch.js +0 -1
  262. package/test/test/util/loader.js +0 -18
  263. package/test/test/util/manifest_generator.js +9 -14
  264. package/test/test/util/manifest_parser_util.js +0 -6
  265. package/test/test/util/offline_utils.js +0 -5
  266. package/test/test/util/simple_fakes.js +9 -26
  267. package/test/test/util/stream_generator.js +0 -14
  268. package/test/test/util/streaming_engine_util.js +0 -15
  269. package/test/test/util/test_scheme.js +1 -19
  270. package/test/test/util/ttml_utils.js +0 -2
  271. package/test/test/util/ui_utils.js +0 -9
  272. package/test/test/util/util.js +5 -19
  273. package/test/test/util/waiter.js +84 -43
  274. package/test/text/cue_integration.js +0 -4
  275. package/test/text/lrc_text_parser_unit.js +0 -4
  276. package/test/text/mp4_ttml_parser_unit.js +0 -6
  277. package/test/text/mp4_vtt_parser_unit.js +1 -7
  278. package/test/text/sbv_text_parser_unit.js +0 -4
  279. package/test/text/simple_text_displayer_unit.js +1 -8
  280. package/test/text/srt_text_parser_unit.js +0 -4
  281. package/test/text/ssa_text_parser_unit.js +0 -5
  282. package/test/text/text_engine_unit.js +2 -7
  283. package/test/text/text_track_integration.js +0 -2
  284. package/test/text/ttml_text_parser_unit.js +2 -11
  285. package/test/text/ui_text_displayer_unit.js +44 -41
  286. package/test/text/vtt_text_parser_unit.js +0 -9
  287. package/test/text/web_vtt_generator_unit.js +0 -3
  288. package/test/ui/ad_ui_unit.js +0 -11
  289. package/test/ui/localization_unit.js +0 -3
  290. package/test/ui/text_displayer_layout_unit.js +1 -12
  291. package/test/ui/ui_customization_unit.js +0 -6
  292. package/test/ui/ui_integration.js +0 -16
  293. package/test/ui/ui_unit.js +1 -17
  294. package/test/util/abortable_operation_unit.js +4 -9
  295. package/test/util/array_utils_unit.js +0 -2
  296. package/test/util/buffer_utils_unit.js +0 -2
  297. package/test/util/cmcd_manager_unit.js +0 -3
  298. package/test/util/data_view_reader_unit.js +0 -4
  299. package/test/util/ebml_parser_unit.js +0 -4
  300. package/test/util/event_manager_unit.js +0 -3
  301. package/test/util/fake_event_target_unit.js +0 -5
  302. package/test/util/functional_unit.js +1 -1
  303. package/test/util/iterables_unit.js +0 -64
  304. package/test/util/language_utils_unit.js +0 -3
  305. package/test/util/manifest_parser_utils_unit.js +0 -2
  306. package/test/util/mp4_box_parsers_unit.js +0 -5
  307. package/test/util/mp4_parser_unit.js +0 -4
  308. package/test/util/multi_map_unit.js +0 -3
  309. package/test/util/object_utils_unit.js +0 -2
  310. package/test/util/periods_unit.js +14 -7
  311. package/test/util/pssh_unit.js +0 -5
  312. package/test/util/state_history_unit.js +0 -2
  313. package/test/util/stream_utils_unit.js +3 -8
  314. package/test/util/string_utils_unit.js +0 -6
  315. package/test/util/text_parser_unit.js +0 -2
  316. package/test/util/xml_utils_unit.js +0 -4
  317. package/ui/less/ad_controls.less +4 -4
  318. package/ui/less/buttons.less +5 -5
  319. package/ui/less/containers.less +9 -11
  320. package/ui/less/overflow_menu.less +4 -4
  321. package/ui/less/range_elements.less +5 -0
  322. package/ui/less/tooltip.less +1 -1
  323. package/ui/locales/sjn-translations.yaml +257 -0
  324. package/ui/locales/sjn.json +42 -0
  325. package/.github/workflows/build_and_test.yaml +0 -73
  326. package/.github/workflows/release.yaml +0 -53
  327. package/externs/svgelement.js +0 -18
  328. package/externs/webcrypto.js +0 -18
package/karma.conf.js CHANGED
@@ -9,11 +9,13 @@
9
9
 
10
10
  const Jimp = require('jimp');
11
11
  const fs = require('fs');
12
+ const glob = require('glob');
12
13
  const path = require('path');
13
14
  const rimraf = require('rimraf');
14
15
  const {ssim} = require('ssim.js');
15
16
  const util = require('karma/common/util');
16
17
  const which = require('which');
18
+ const yaml = require('js-yaml');
17
19
 
18
20
  /**
19
21
  * @param {Object} config
@@ -43,6 +45,58 @@ module.exports = (config) => {
43
45
  const settings =
44
46
  settingsIndex >= 0 ? JSON.parse(args[settingsIndex + 1]) : {};
45
47
 
48
+ if (settings.grid_config) {
49
+ const gridBrowserMetadata =
50
+ yaml.load(fs.readFileSync(settings.grid_config, 'utf8'));
51
+ const customLaunchers = {};
52
+ const [gridHostname, gridPort] = settings.grid_address.split(':');
53
+ console.log(`Using Selenium grid at ${gridHostname}:${gridPort}`);
54
+
55
+ // By default, run on all grid browsers instead of the platform-specific
56
+ // default. This does not disable local browsers, though. Users can still
57
+ // specify a mix of grid and local browsers explicitly.
58
+ settings.default_browsers = [];
59
+
60
+ for (const name in gridBrowserMetadata) {
61
+ if (name == 'vars') {
62
+ // Skip variable defs in the YAML file
63
+ continue;
64
+ }
65
+
66
+ const metadata = gridBrowserMetadata[name];
67
+
68
+ const launcher = {};
69
+ customLaunchers[name] = launcher;
70
+
71
+ // Disabled-by-default browsers are still defined, but not put in the
72
+ // default list. A user can ask for one explicitly. This allows us to
73
+ // disable a browser that is down for some reason in the lab, but still
74
+ // ask for it manually if we want to test it before re-enabling it for
75
+ // everyone.
76
+ if (!metadata.disabled) {
77
+ settings.default_browsers.push(name);
78
+ }
79
+
80
+ // Add standard WebDriver configs.
81
+ Object.assign(launcher, {
82
+ base: 'WebDriver',
83
+ config: {hostname: gridHostname, port: gridPort},
84
+ pseudoActivityInterval: 20000,
85
+ browserName: metadata.browser,
86
+ platform: metadata.os,
87
+ version: metadata.version,
88
+ });
89
+
90
+ if (metadata.extra_config) {
91
+ Object.assign(launcher, metadata.extra_config);
92
+ }
93
+ }
94
+
95
+ config.set({
96
+ customLaunchers: customLaunchers,
97
+ });
98
+ }
99
+
46
100
  if (settings.browsers && settings.browsers.length == 1 &&
47
101
  settings.browsers[0] == 'help') {
48
102
  console.log('Available browsers:');
@@ -53,6 +107,24 @@ module.exports = (config) => {
53
107
  process.exit(1);
54
108
  }
55
109
 
110
+ // Resolve the set of browsers we will use.
111
+ const browserSet = new Set(settings.browsers && settings.browsers.length ?
112
+ settings.browsers : settings.default_browsers);
113
+ if (settings.exclude_browsers) {
114
+ for (const excluded of settings.exclude_browsers) {
115
+ browserSet.delete(excluded);
116
+ }
117
+ }
118
+
119
+ let browsers = Array.from(browserSet).sort();
120
+ if (settings.no_browsers) {
121
+ console.warn(
122
+ '--no-browsers: In this mode, you must connect browsers to Karma.');
123
+ browsers = null;
124
+ } else {
125
+ console.warn('Running tests on: ' + browsers.join(', '));
126
+ }
127
+
56
128
  config.set({
57
129
  // base path that will be used to resolve all patterns (eg. files, exclude)
58
130
  basePath: '.',
@@ -87,7 +159,7 @@ module.exports = (config) => {
87
159
  // Promise polyfill, required since we test uncompiled code on IE11
88
160
  'node_modules/es6-promise-polyfill/promise.js',
89
161
  // Babel polyfill, required for async/await
90
- 'node_modules/babel-polyfill/dist/polyfill.js',
162
+ 'node_modules/@babel/polyfill/dist/polyfill.js',
91
163
  // TextDecoder polyfill, required for TextDecoder/TextEncoder on IE and
92
164
  // legacy Edge
93
165
  // eslint-disable-next-line max-len
@@ -107,46 +179,46 @@ module.exports = (config) => {
107
179
  'dist/deps.js',
108
180
  'shaka-player.uncompiled.js',
109
181
 
182
+ // the demo's config tab will register with shakaDemoMain, and will be
183
+ // tested in test/demo/demo_unit.js
184
+ 'demo/config.js',
185
+
110
186
  // cajon module (an AMD variant of requirejs) next
111
187
  'node_modules/cajon/cajon.js',
112
188
 
113
- // bootstrapping for the test suite
114
- 'test/test/boot.js',
189
+ // define the test namespace next (shaka.test)
190
+ 'test/test/namespace.js',
115
191
 
116
- // test utils next
192
+ // test utilities next, which fill in that namespace
117
193
  'test/test/util/*.js',
118
194
 
119
- // list of test assets next
120
- 'demo/common/message_ids.js',
121
- 'demo/common/asset.js',
122
- 'demo/common/assets.js',
195
+ // bootstrapping for the test suite last; this will load the actual tests
196
+ 'test/test/boot.js',
123
197
 
124
198
  // if --test-custom-asset *is not* present, we will add unit tests.
125
199
  // if --quick *is not* present, we will add integration tests.
126
200
  // if --external *is* present, we will add external asset tests.
127
201
 
128
- // load relevant demo files
129
- {
130
- pattern: 'demo/!(main|load|demo_uncompiled|service_worker).js',
131
- included: true,
132
- },
133
-
134
- // source files - these are only watched and served
202
+ // source files - these are only watched and served.
203
+ // anything not listed here can't be dynamically loaded by other scripts.
135
204
  {pattern: 'lib/**/*.js', included: false},
136
205
  {pattern: 'ui/**/*.js', included: false},
137
206
  {pattern: 'ui/**/*.less', included: false},
138
207
  {pattern: 'third_party/**/*.js', included: false},
139
- {
140
- pattern: 'node_modules/google-closure-library/closure/goog/**/*.js',
141
- included: false,
142
- },
208
+ {pattern: 'test/**/*.js', included: false},
143
209
  {pattern: 'test/test/assets/*', included: false},
144
210
  {pattern: 'test/test/assets/3675/*', included: false},
145
211
  {pattern: 'dist/shaka-player.ui.js', included: false},
146
212
  {pattern: 'dist/locales.js', included: false},
213
+ {pattern: 'demo/**/*.js', included: false},
147
214
  {pattern: 'demo/locales/en.json', included: false},
148
215
  {pattern: 'demo/locales/source.json', included: false},
149
- {pattern: 'node_modules/**/*.js', included: false},
216
+ {pattern: 'node_modules/sprintf-js/src/sprintf.js', included: false},
217
+ {pattern: 'node_modules/less/dist/less.js', included: false},
218
+ {
219
+ pattern: 'node_modules/fontfaceonload/dist/fontfaceonload.js',
220
+ included: false,
221
+ },
150
222
  ],
151
223
 
152
224
  // NOTE: Do not use proxies at all! They cannot be used with the --hostname
@@ -212,7 +284,7 @@ module.exports = (config) => {
212
284
 
213
285
  // Set which browsers to run on. If this is null, then Karma will wait for
214
286
  // an incoming connection.
215
- browsers: settings.browsers,
287
+ browsers,
216
288
 
217
289
  // Enable / disable colors in the output (reporters and logs). Defaults
218
290
  // to true.
@@ -243,6 +315,7 @@ module.exports = (config) => {
243
315
 
244
316
  specReporter: {
245
317
  suppressSkipped: true,
318
+ showBrowser: true,
246
319
  },
247
320
  });
248
321
 
@@ -260,7 +333,7 @@ module.exports = (config) => {
260
333
 
261
334
  babelPreprocessor: {
262
335
  options: {
263
- presets: ['env'],
336
+ presets: ['@babel/preset-env'],
264
337
  // Add source maps so that backtraces refer to the original code.
265
338
  // Babel will output inline source maps, and the 'sourcemap'
266
339
  // preprocessor will read them and feed them to Karma. Karma will
@@ -283,26 +356,30 @@ module.exports = (config) => {
283
356
  });
284
357
  }
285
358
 
359
+ const clientArgs = config.client.args[0];
360
+ clientArgs.testFiles = [];
361
+
286
362
  if (settings.test_custom_asset) {
287
363
  // If testing custom assets, we don't serve other unit or integration tests.
288
364
  // External asset tests are the basis for custom asset testing, so this file
289
365
  // is automatically included.
290
- config.files.push('test/player_external.js');
366
+ clientArgs.testFiles.push('test/player_external.js');
291
367
  } else {
292
368
  // In a normal test run, we serve unit tests.
293
- config.files.push('test/**/*_unit.js');
369
+ clientArgs.testFiles.push('test/**/*_unit.js');
294
370
 
295
371
  if (!settings.quick) {
296
372
  // If --quick is present, we don't serve integration tests.
297
- config.files.push('test/**/*_integration.js');
373
+ clientArgs.testFiles.push('test/**/*_integration.js');
298
374
  }
299
375
  if (settings.external) {
300
376
  // If --external is present, we serve external asset tests.
301
- config.files.push('test/**/*_external.js');
377
+ clientArgs.testFiles.push('test/**/*_external.js');
302
378
  }
303
379
  }
304
- // We just modified the config in-place. No need for config.set() after we
305
- // push to config.files.
380
+
381
+ // These are the test files that will be dynamically loaded by boot.js.
382
+ clientArgs.testFiles = resolveGlobs(clientArgs.testFiles);
306
383
 
307
384
  const reporters = [];
308
385
 
@@ -347,14 +424,44 @@ module.exports = (config) => {
347
424
  const seed = settings.seed == null ? new Date().getTime() : settings.seed;
348
425
 
349
426
  // Run tests in a random order.
350
- const clientArgs = config.client.args[0];
351
427
  clientArgs.random = true;
352
428
  clientArgs.seed = seed;
353
429
 
354
430
  console.log('Using a random test order (--random) with --seed=' + seed);
355
431
  }
432
+
433
+ if (settings.tls_key && settings.tls_cert) {
434
+ config.set({
435
+ protocol: 'https',
436
+ httpsServerOptions: {
437
+ key: fs.readFileSync(settings.tls_key),
438
+ cert: fs.readFileSync(settings.tls_cert),
439
+ },
440
+ });
441
+ }
356
442
  };
357
443
 
444
+ /**
445
+ * Resolves a list of paths using globs into a list of explicit paths.
446
+ * Paths are all relative to the source directory.
447
+ *
448
+ * @param {!Array.<string>} list
449
+ * @return {!Array.<string>}
450
+ */
451
+ function resolveGlobs(list) {
452
+ const options = {
453
+ cwd: __dirname,
454
+ };
455
+
456
+ const resolved = [];
457
+ for (const path of list) {
458
+ for (const resolvedPath of glob.sync(path, options)) {
459
+ resolved.push(resolvedPath);
460
+ }
461
+ }
462
+ return resolved;
463
+ }
464
+
358
465
  /**
359
466
  * Determines which launchers and customLaunchers can be used and returns an
360
467
  * array of strings.
@@ -421,7 +528,7 @@ function allUsableBrowserLaunchers(config) {
421
528
  browsers.push(...Object.keys(config.customLaunchers));
422
529
  }
423
530
 
424
- return browsers;
531
+ return browsers.sort();
425
532
  }
426
533
 
427
534
  /**
@@ -9,7 +9,6 @@ goog.provide('shaka.abr.SimpleAbrManager');
9
9
  goog.require('goog.asserts');
10
10
  goog.require('shaka.abr.EwmaBandwidthEstimator');
11
11
  goog.require('shaka.log');
12
- goog.require('shaka.util.Iterables');
13
12
  goog.require('shaka.util.StreamUtils');
14
13
 
15
14
 
@@ -145,15 +144,21 @@ shaka.abr.SimpleAbrManager = class {
145
144
  // Start by assuming that we will use the first Stream.
146
145
  let chosen = sortedVariants[0] || null;
147
146
 
148
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
149
- for (const {item, next} of enumerate(sortedVariants)) {
147
+ for (let i = 0; i < sortedVariants.length; i++) {
148
+ const item = sortedVariants[i];
150
149
  const playbackRate =
151
150
  !isNaN(this.playbackRate_) ? Math.abs(this.playbackRate_) : 1;
152
151
  const itemBandwidth = playbackRate * item.bandwidth;
153
152
  const minBandwidth =
154
153
  itemBandwidth / this.config_.bandwidthDowngradeTarget;
155
- const nextBandwidth =
156
- playbackRate * (next || {bandwidth: Infinity}).bandwidth;
154
+ let next = {bandwidth: Infinity};
155
+ for (let j = i + 1; j < sortedVariants.length; j++) {
156
+ if (item.bandwidth != sortedVariants[j].bandwidth) {
157
+ next = sortedVariants[j];
158
+ break;
159
+ }
160
+ }
161
+ const nextBandwidth = playbackRate * next.bandwidth;
157
162
  const maxBandwidth = nextBandwidth / this.config_.bandwidthUpgradeTarget;
158
163
  shaka.log.v2('Bandwidth ranges:',
159
164
  (itemBandwidth / 1e6).toFixed(3),
@@ -161,7 +166,8 @@ shaka.abr.SimpleAbrManager = class {
161
166
  (maxBandwidth / 1e6).toFixed(3));
162
167
 
163
168
  if (currentBandwidth >= minBandwidth &&
164
- currentBandwidth <= maxBandwidth) {
169
+ currentBandwidth <= maxBandwidth &&
170
+ chosen.bandwidth != item.bandwidth) {
165
171
  chosen = item;
166
172
  }
167
173
  }
@@ -314,10 +314,9 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
314
314
  * @private
315
315
  */
316
316
  mapCompiledToUncompiledPlayerMethodNames_() {
317
- // In compiled mode, UI tries to access player methods
318
- // by their internal renamed names, but the proxy object doesn't know about
319
- // those.
320
- // See https://github.com/google/shaka-player/issues/2130 for details.
317
+ // In compiled mode, UI tries to access player methods by their internal
318
+ // renamed names, but the proxy object doesn't know about those. See
319
+ // https://github.com/shaka-project/shaka-player/issues/2130 for details.
321
320
  const methodsToNames = new Map();
322
321
  this.iterateOverPlayerMethods_((name, method) => {
323
322
  if (methodsToNames.has(method)) {
@@ -140,8 +140,8 @@ shaka.cea.Cea608DataChannel = class {
140
140
  const buf = this.curbuf_;
141
141
 
142
142
  // Move entire scroll window to a new base in rollup mode.
143
- if (this.type_ === shaka.cea.Cea608DataChannel.CaptionType.ROLLUP
144
- && row !== buf.getRow()) {
143
+ if (this.type_ === shaka.cea.Cea608DataChannel.CaptionType.ROLLUP &&
144
+ row !== buf.getRow()) {
145
145
  const oldTopRow = 1 + buf.getRow() - buf.getScrollSize();
146
146
  const newTopRow = 1 + row - buf.getScrollSize();
147
147
 
@@ -9,7 +9,6 @@ goog.provide('shaka.cea.Cea708Service');
9
9
  goog.require('shaka.cea.Cea708Window');
10
10
  goog.require('shaka.cea.DtvccPacket');
11
11
  goog.require('shaka.cea.ICaptionDecoder');
12
- goog.require('shaka.util.Error');
13
12
 
14
13
 
15
14
  /**
@@ -301,17 +300,19 @@ shaka.cea.Cea708Service = class {
301
300
  /**
302
301
  * Yields each non-null window specified in the 8-bit bitmap.
303
302
  * @param {number} bitmap 8 bits corresponding to each of the 8 windows.
304
- * @return {!Iterable.<number>}
303
+ * @return {!Array.<number>}
305
304
  * @private
306
305
  */
307
- * getSpecifiedWindowIds_(bitmap) {
306
+ getSpecifiedWindowIds_(bitmap) {
307
+ const ids = [];
308
308
  for (let i = 0; i < 8; i++) {
309
309
  const windowSpecified = (bitmap & 0x01) === 0x01;
310
310
  if (windowSpecified && this.windows_[i]) {
311
- yield i;
311
+ ids.push(i);
312
312
  }
313
313
  bitmap >>= 1;
314
314
  }
315
+ return ids;
315
316
  }
316
317
 
317
318
  /**
@@ -150,11 +150,11 @@ shaka.cea.Mp4CeaParser = class {
150
150
 
151
151
  // If specified, defaultSampleDuration and defaultSampleSize
152
152
  // override the ones specified in the TREX box
153
- defaultSampleDuration = parsedTFHD.defaultSampleDuration
154
- || this.defaultSampleDuration_;
153
+ defaultSampleDuration = parsedTFHD.defaultSampleDuration ||
154
+ this.defaultSampleDuration_;
155
155
 
156
- defaultSampleSize = parsedTFHD.defaultSampleSize
157
- || this.defaultSampleSize_;
156
+ defaultSampleSize = parsedTFHD.defaultSampleSize ||
157
+ this.defaultSampleSize_;
158
158
 
159
159
  const trackId = parsedTFHD.trackId;
160
160
 
@@ -236,7 +236,13 @@ shaka.cea.Mp4CeaParser = class {
236
236
  });
237
237
  }
238
238
  } else {
239
- reader.skip(naluSize - 1);
239
+ try {
240
+ reader.skip(naluSize - 1);
241
+ } catch (e) {
242
+ // It is necessary to ignore this error because it can break the start
243
+ // of playback even if the user does not want to see the subtitles.
244
+ break;
245
+ }
240
246
  }
241
247
  sampleSize -= (naluSize + 4);
242
248
  if (sampleSize == 0) {
@@ -14,9 +14,10 @@ shaka.cea.SeiProcessor = class {
14
14
  /**
15
15
  * Processes supplemental enhancement information data.
16
16
  * @param {!Uint8Array} naluData NALU from which SEI data is to be processed.
17
- * @return {!Iterable.<!Uint8Array>}
17
+ * @return {!Array.<!Uint8Array>}
18
18
  */
19
- * process(naluData) {
19
+ process(naluData) {
20
+ const seiPayloads = [];
20
21
  const naluClone = this.removeEmu(naluData);
21
22
 
22
23
  // The following is an implementation of section 7.3.2.3.1
@@ -41,10 +42,12 @@ shaka.cea.SeiProcessor = class {
41
42
  // Payload type 4 is user_data_registered_itu_t_t35, as per the H.264
42
43
  // spec. This payload type contains caption data.
43
44
  if (payloadType == 0x04) {
44
- yield naluClone.subarray(offset, offset + payloadSize);
45
+ seiPayloads.push(naluClone.subarray(offset, offset + payloadSize));
45
46
  }
46
47
  offset += payloadSize;
47
48
  }
49
+
50
+ return seiPayloads;
48
51
  }
49
52
 
50
53
 
@@ -22,7 +22,6 @@ goog.require('shaka.text.TextEngine');
22
22
  goog.require('shaka.util.CmcdManager');
23
23
  goog.require('shaka.util.Error');
24
24
  goog.require('shaka.util.Functional');
25
- goog.require('shaka.util.Iterables');
26
25
  goog.require('shaka.util.LanguageUtils');
27
26
  goog.require('shaka.util.ManifestParserUtils');
28
27
  goog.require('shaka.util.MimeUtils');
@@ -104,7 +103,7 @@ shaka.dash.DashParser = class {
104
103
 
105
104
  /**
106
105
  * Period IDs seen in previous manifest.
107
- * @private {!Array.<number>}
106
+ * @private {!Array.<string>}
108
107
  */
109
108
  this.lastManifestUpdatePeriodIds_ = [];
110
109
 
@@ -383,7 +382,7 @@ shaka.dash.DashParser = class {
383
382
  // This gives us confidence that our state is maintained correctly, and
384
383
  // that the complex logic of multi-Period eviction and period-flattening
385
384
  // is correct. See also:
386
- // https://github.com/google/shaka-player/issues/3169#issuecomment-823580634
385
+ // https://github.com/shaka-project/shaka-player/issues/3169#issuecomment-823580634
387
386
  for (const stream of Object.values(this.streamMap_)) {
388
387
  if (stream.segmentIndex) {
389
388
  stream.segmentIndex.evict(
@@ -555,10 +554,9 @@ shaka.dash.DashParser = class {
555
554
  const periods = [];
556
555
  let prevEnd = 0;
557
556
  const periodNodes = XmlUtils.findChildren(mpd, 'Period');
558
- // This uses a for-loop rather than a for-of loop because this needs to look
559
- // ahead to the next element.
560
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
561
- for (const {i, item: elem, next} of enumerate(periodNodes)) {
557
+ for (let i = 0; i < periodNodes.length; i++) {
558
+ const elem = periodNodes[i];
559
+ const next = periodNodes[i + 1];
562
560
  const start = /** @type {number} */ (
563
561
  XmlUtils.parseAttr(elem, 'start', XmlUtils.parseDuration, prevEnd));
564
562
  const periodId = elem.id;
@@ -764,7 +762,7 @@ shaka.dash.DashParser = class {
764
762
  for (const stream of normalSet.streams) {
765
763
  // There may be multiple trick mode streams, but we do not
766
764
  // currently support that. Just choose one.
767
- // TODO: https://github.com/google/shaka-player/issues/1528
765
+ // TODO: https://github.com/shaka-project/shaka-player/issues/1528
768
766
  stream.trickModeVideo = trickModeSet.streams.find((trickStream) =>
769
767
  shaka.util.MimeUtils.getCodecBase(stream.codecs) ==
770
768
  shaka.util.MimeUtils.getCodecBase(trickStream.codecs));
@@ -1157,7 +1155,7 @@ shaka.dash.DashParser = class {
1157
1155
  // does not make sense in the DASH spec's bandwidth formulas.
1158
1156
  // In some content, however, the attribute is missing or zero.
1159
1157
  // To avoid NaN at the variant level on broken content, fall back to zero.
1160
- // https://github.com/google/shaka-player/issues/938#issuecomment-317278180
1158
+ // https://github.com/shaka-project/shaka-player/issues/938#issuecomment-317278180
1161
1159
  context.bandwidth =
1162
1160
  XmlUtils.parseAttr(node, 'bandwidth', XmlUtils.parsePositiveInt) || 0;
1163
1161
 
@@ -1236,7 +1234,7 @@ shaka.dash.DashParser = class {
1236
1234
 
1237
1235
  let forced = false;
1238
1236
  if (isText) {
1239
- // See: https://github.com/google/shaka-player/issues/2122 and
1237
+ // See: https://github.com/shaka-project/shaka-player/issues/2122 and
1240
1238
  // https://github.com/Dash-Industry-Forum/DASH-IF-IOP/issues/165
1241
1239
  forced = roles.includes('forced_subtitle') ||
1242
1240
  roles.includes('forced-subtitle');
@@ -1384,7 +1382,7 @@ shaka.dash.DashParser = class {
1384
1382
  // NOTE: An updatePeriod_ of -1 means the attribute was missing.
1385
1383
  // An attribute which is present and set to 0 should still result in
1386
1384
  // periodic updates. For more, see:
1387
- // https://github.com/google/shaka-player/issues/331
1385
+ // https://github.com/shaka-project/shaka-player/issues/331
1388
1386
  if (this.updatePeriod_ < 0) {
1389
1387
  return;
1390
1388
  }
@@ -12,7 +12,6 @@ goog.require('shaka.net.NetworkingEngine');
12
12
  goog.require('shaka.util.AbortableOperation');
13
13
  goog.require('shaka.util.Error');
14
14
  goog.require('shaka.util.Functional');
15
- goog.require('shaka.util.Iterables');
16
15
  goog.require('shaka.util.ManifestParserUtils');
17
16
  goog.require('shaka.util.XmlUtils');
18
17
  goog.requireType('shaka.dash.DashParser');
@@ -142,8 +141,9 @@ shaka.dash.MpdUtils = class {
142
141
  const timeline = [];
143
142
  let lastEndTime = -unscaledPresentationTimeOffset;
144
143
 
145
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
146
- for (const {item: timePoint, next} of enumerate(timePoints)) {
144
+ for (let i = 0; i < timePoints.length; ++i) {
145
+ const timePoint = timePoints[i];
146
+ const next = timePoints[i + 1];
147
147
  let t = XmlUtils.parseAttr(timePoint, 't', XmlUtils.parseNonNegativeInt);
148
148
  const d =
149
149
  XmlUtils.parseAttr(timePoint, 'd', XmlUtils.parseNonNegativeInt);
@@ -225,8 +225,7 @@ shaka.dash.MpdUtils = class {
225
225
  timeline[timeline.length - 1].end = startTime / timescale;
226
226
  }
227
227
 
228
- for (const _ of shaka.util.Iterables.range(repeat + 1)) {
229
- shaka.util.Functional.ignored(_);
228
+ for (let j = 0; j <= repeat; ++j) {
230
229
  const endTime = startTime + d;
231
230
  const item = {
232
231
  start: startTime / timescale,
@@ -15,7 +15,6 @@ goog.require('shaka.media.SegmentIndex');
15
15
  goog.require('shaka.media.SegmentReference');
16
16
  goog.require('shaka.util.Error');
17
17
  goog.require('shaka.util.Functional');
18
- goog.require('shaka.util.Iterables');
19
18
  goog.require('shaka.util.ManifestParserUtils');
20
19
  goog.require('shaka.util.XmlUtils');
21
20
  goog.requireType('shaka.dash.DashParser');
@@ -222,7 +221,7 @@ shaka.dash.SegmentList = class {
222
221
  /** @type {!Array.<!shaka.media.SegmentReference>} */
223
222
  const references = [];
224
223
  let prevEndTime = info.startTime;
225
- for (const i of shaka.util.Iterables.range(max)) {
224
+ for (let i = 0; i < max; i++) {
226
225
  const segment = info.mediaSegments[i];
227
226
  const mediaUri = ManifestParserUtils.resolveUris(
228
227
  baseUris, [segment.mediaUri]);
@@ -14,7 +14,6 @@ goog.require('shaka.media.InitSegmentReference');
14
14
  goog.require('shaka.media.SegmentIndex');
15
15
  goog.require('shaka.media.SegmentReference');
16
16
  goog.require('shaka.util.Error');
17
- goog.require('shaka.util.Iterables');
18
17
  goog.require('shaka.util.ManifestParserUtils');
19
18
  goog.require('shaka.util.ObjectUtils');
20
19
  goog.requireType('shaka.dash.DashParser');
@@ -504,8 +503,9 @@ shaka.dash.SegmentTemplate = class {
504
503
 
505
504
  /** @type {!Array.<!shaka.media.SegmentReference>} */
506
505
  const references = [];
507
- const enum_ = (it) => shaka.util.Iterables.enumerate(it);
508
- for (const {i, item: {start, unscaledStart, end}} of enum_(info.timeline)) {
506
+ for (let i = 0; i < info.timeline.length; i++) {
507
+ const {start, unscaledStart, end} = info.timeline[i];
508
+
509
509
  // Note: i = k - 1, where k indicates the k'th segment listed in the MPD.
510
510
  // (See section 5.3.9.5.3 of the DASH spec.)
511
511
  const segmentReplacement = i + info.startNumber;
@@ -30,7 +30,6 @@ goog.require('shaka.util.DataViewReader');
30
30
  goog.require('shaka.util.Error');
31
31
  goog.require('shaka.util.FakeEvent');
32
32
  goog.require('shaka.util.Functional');
33
- goog.require('shaka.util.Iterables');
34
33
  goog.require('shaka.util.LanguageUtils');
35
34
  goog.require('shaka.util.ManifestParserUtils');
36
35
  goog.require('shaka.util.MimeUtils');
@@ -919,7 +918,7 @@ shaka.hls.HlsParser = class {
919
918
  // the content. This means that if the content changes profiles, it should
920
919
  // include both. Since all known browsers support changing profiles
921
920
  // without any other work, just ignore them. See also:
922
- // https://github.com/google/shaka-player/issues/1817
921
+ // https://github.com/shaka-project/shaka-player/issues/1817
923
922
  const shortCodec = shaka.util.MimeUtils.getCodecBase(codec);
924
923
  if (!seen.has(shortCodec)) {
925
924
  ret.push(codec);
@@ -1760,8 +1759,8 @@ shaka.hls.HlsParser = class {
1760
1759
  // Create SegmentReferences for the partial segments.
1761
1760
  const partialSegmentRefs = [];
1762
1761
  if (this.lowLatencyMode_ && hlsSegment.partialSegments.length) {
1763
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
1764
- for (const {i, item} of enumerate(hlsSegment.partialSegments)) {
1762
+ for (let i = 0; i < hlsSegment.partialSegments.length; i++) {
1763
+ const item = hlsSegment.partialSegments[i];
1765
1764
  const pPreviousReference = i == 0 ?
1766
1765
  previousReference : partialSegmentRefs[partialSegmentRefs.length - 1];
1767
1766
  const pStartTime = (i == 0) ? startTime : pPreviousReference.endTime;
@@ -1782,6 +1781,9 @@ shaka.hls.HlsParser = class {
1782
1781
  this.parseByteRange_(pPreviousReference, pByterange);
1783
1782
  }
1784
1783
  const pUri = item.getAttributeValue('URI');
1784
+ if (!pUri) {
1785
+ continue;
1786
+ }
1785
1787
  const pAbsoluteUri = shaka.hls.Utils.constructAbsoluteUri(
1786
1788
  absoluteMediaPlaylistUri, pUri);
1787
1789
 
@@ -1989,9 +1991,9 @@ shaka.hls.HlsParser = class {
1989
1991
  // With delta updates, the DISCONTINUITY may be skipped. Check if
1990
1992
  // the discontintuity Sequence Number based on the media sequence
1991
1993
  // number.
1992
- while (discontinuityToMediaSequence.has(discontintuitySequenceNum + 1)
1993
- && discontinuityToMediaSequence.get(discontintuitySequenceNum + 1) <
1994
- position) {
1994
+ const disconMap = discontinuityToMediaSequence;
1995
+ while (disconMap.has(discontintuitySequenceNum + 1) &&
1996
+ disconMap.get(discontintuitySequenceNum + 1) < position) {
1995
1997
  discontintuitySequenceNum++;
1996
1998
  }
1997
1999
  }
@@ -2002,8 +2004,8 @@ shaka.hls.HlsParser = class {
2002
2004
  /** @type {!Array.<!shaka.media.SegmentReference>} */
2003
2005
  const references = [];
2004
2006
 
2005
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
2006
- for (const {i, item} of enumerate(hlsSegments)) {
2007
+ for (let i = 0; i < hlsSegments.length; i++) {
2008
+ const item = hlsSegments[i];
2007
2009
  const previousReference = references[references.length - 1];
2008
2010
  const startTime = (i == 0) ? firstStartTime :
2009
2011
  previousReference.endTime;