shaka-player 3.3.2 → 4.0.0

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 (389) 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 +37 -0
  8. package/.github/workflows/nightly-demo.yaml +42 -0
  9. package/.github/workflows/release-please.yaml +168 -0
  10. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  11. package/.github/workflows/selenium-lab-tests.yaml +92 -0
  12. package/.github/workflows/sync-labels.yaml +33 -0
  13. package/.github/workflows/update-issues.yaml +29 -0
  14. package/.github/workflows/validate-pr-title.yaml +35 -0
  15. package/AUTHORS +3 -0
  16. package/CHANGELOG.md +1866 -1675
  17. package/CONTRIBUTING.md +2 -2
  18. package/CONTRIBUTORS +3 -0
  19. package/README.md +16 -13
  20. package/app-engine/README.md +9 -0
  21. package/app-engine/demo-version-index/README.md +14 -0
  22. package/app-engine/demo-version-index/app.yaml +28 -0
  23. package/app-engine/demo-version-index/generate.py +164 -0
  24. package/app-engine/demo-version-index/main.py +11 -0
  25. package/app-engine/demo-version-index/requirements.txt +5 -0
  26. package/app-engine/demo-version-index/templates/index.html +114 -0
  27. package/app-engine/shaka-player-demo/README.md +18 -0
  28. package/app-engine/shaka-player-demo/app.yaml +61 -0
  29. package/app-engine/shaka-player-demo/main.py +95 -0
  30. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  31. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  32. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  33. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  34. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  35. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  36. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  37. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  38. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  39. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  40. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  41. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  42. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  43. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  44. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  45. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  46. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  47. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  48. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  49. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  50. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  51. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  52. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  53. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  54. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  55. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  56. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  57. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  58. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  59. package/app-engine/shaka-player-demo/posters.py +110 -0
  60. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  61. package/app-engine/shaka-player-demo/time.txt +1 -0
  62. package/build/README.md +3 -3
  63. package/build/checkversion.py +1 -1
  64. package/build/compiler.py +1 -1
  65. package/build/conformance.textproto +13 -0
  66. package/build/docker/Dockerfile +20 -0
  67. package/build/docker/docker-compose.yml +10 -0
  68. package/build/gendeps.py +18 -15
  69. package/build/shaka-lab.yaml +161 -0
  70. package/build/shakaBuildHelpers.py +4 -29
  71. package/build/test.py +94 -29
  72. package/build/types/core +0 -1
  73. package/build/types/polyfill +1 -3
  74. package/build/wrapper.template.js +2 -2
  75. package/demo/TengwarTelcontar.woff2 +0 -0
  76. package/demo/asset_card.js +1 -2
  77. package/demo/cast_receiver/index.html +1 -1
  78. package/demo/cast_receiver/receiver_app.css +14 -14
  79. package/demo/common/asset.js +17 -1
  80. package/demo/common/assets.js +31 -0
  81. package/demo/common/message_ids.js +6 -3
  82. package/demo/config.js +10 -12
  83. package/demo/custom.js +39 -1
  84. package/demo/customWarning.txt +2 -2
  85. package/demo/demo.less +29 -18
  86. package/demo/demo_uncompiled.js +1 -13
  87. package/demo/demo_utils.js +0 -1
  88. package/demo/index.html +1 -1
  89. package/demo/locales/en.json +6 -3
  90. package/demo/locales/source.json +22 -10
  91. package/demo/main.js +12 -9
  92. package/demo/search.js +2 -1
  93. package/dist/controls.css +3 -3
  94. package/dist/controls.css.map +1 -1
  95. package/dist/demo.compiled.debug.js +236 -232
  96. package/dist/demo.compiled.debug.map +4 -4
  97. package/dist/demo.compiled.js +236 -232
  98. package/dist/demo.compiled.map +4 -4
  99. package/dist/demo.css +1 -1
  100. package/dist/demo.css.map +1 -1
  101. package/dist/deps.js +229 -226
  102. package/dist/locales.js +34 -32
  103. package/dist/receiver.compiled.debug.js +75 -73
  104. package/dist/receiver.compiled.debug.map +4 -4
  105. package/dist/receiver.compiled.js +75 -73
  106. package/dist/receiver.compiled.map +4 -4
  107. package/dist/shaka-player.compiled.d.ts +321 -314
  108. package/dist/shaka-player.compiled.debug.d.ts +321 -314
  109. package/dist/shaka-player.compiled.debug.externs.js +140 -129
  110. package/dist/shaka-player.compiled.debug.js +527 -592
  111. package/dist/shaka-player.compiled.debug.map +4 -4
  112. package/dist/shaka-player.compiled.externs.js +140 -129
  113. package/dist/shaka-player.compiled.js +836 -860
  114. package/dist/shaka-player.compiled.map +4 -4
  115. package/dist/shaka-player.ui.d.ts +367 -358
  116. package/dist/shaka-player.ui.debug.d.ts +367 -358
  117. package/dist/shaka-player.ui.debug.externs.js +148 -129
  118. package/dist/shaka-player.ui.debug.js +586 -649
  119. package/dist/shaka-player.ui.debug.map +4 -4
  120. package/dist/shaka-player.ui.externs.js +148 -129
  121. package/dist/shaka-player.ui.js +1008 -1028
  122. package/dist/shaka-player.ui.map +4 -4
  123. package/docs/design/REDESIGN.md +33 -33
  124. package/docs/design/bg-fetch.md +2 -2
  125. package/docs/design/codec_preferences.md +1 -1
  126. package/docs/design/dash-audio-channels.md +3 -3
  127. package/docs/design/dash-manifests.md +1 -1
  128. package/docs/design/gap-jumping.md +3 -3
  129. package/docs/design/preload.md +2 -2
  130. package/docs/tutorials/config.md +0 -2
  131. package/docs/tutorials/drm-config.md +5 -0
  132. package/docs/tutorials/fairplay.md +7 -22
  133. package/docs/tutorials/faq.md +8 -19
  134. package/docs/tutorials/index.json +3 -8
  135. package/docs/tutorials/plugins.md +4 -6
  136. package/docs/tutorials/selenium-grid-config.md +122 -0
  137. package/docs/tutorials/upgrade.md +83 -11
  138. package/docs/tutorials/welcome.md +10 -2
  139. package/externs/cmcd.js +1 -1
  140. package/externs/polyfill.js +15 -0
  141. package/externs/shaka/manifest.js +5 -1
  142. package/externs/shaka/net.js +12 -0
  143. package/externs/shaka/offline.js +5 -1
  144. package/externs/shaka/player.js +39 -32
  145. package/externs/shaka/text.js +12 -12
  146. package/externs/sourcebuffer.js +15 -0
  147. package/karma.conf.js +137 -30
  148. package/lib/abr/simple_abr_manager.js +12 -6
  149. package/lib/ads/client_side_ad.js +13 -2
  150. package/lib/ads/client_side_ad_manager.js +22 -4
  151. package/lib/cast/cast_proxy.js +3 -4
  152. package/lib/cast/cast_utils.js +0 -1
  153. package/lib/cea/cea608_data_channel.js +2 -2
  154. package/lib/cea/cea708_service.js +5 -4
  155. package/lib/cea/mp4_cea_parser.js +11 -5
  156. package/lib/cea/sei_processor.js +6 -3
  157. package/lib/dash/content_protection.js +85 -5
  158. package/lib/dash/dash_parser.js +10 -12
  159. package/lib/dash/mpd_utils.js +4 -5
  160. package/lib/dash/segment_list.js +1 -2
  161. package/lib/dash/segment_template.js +3 -3
  162. package/lib/hls/hls_parser.js +386 -749
  163. package/lib/hls/manifest_text_parser.js +5 -6
  164. package/lib/media/adaptation_set.js +1 -2
  165. package/lib/media/content_workarounds.js +2 -2
  166. package/lib/media/drm_engine.js +105 -55
  167. package/lib/media/gap_jumping_controller.js +10 -45
  168. package/lib/media/media_source_engine.js +90 -17
  169. package/lib/media/mp4_segment_index_parser.js +1 -4
  170. package/lib/media/playhead.js +4 -7
  171. package/lib/media/presentation_timeline.js +19 -10
  172. package/lib/media/segment_index.js +13 -46
  173. package/lib/media/segment_reference.js +47 -1
  174. package/lib/media/streaming_engine.js +35 -17
  175. package/lib/media/time_ranges_utils.js +5 -12
  176. package/lib/media/video_wrapper.js +1 -1
  177. package/lib/net/networking_engine.js +4 -1
  178. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  179. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  180. package/lib/offline/manifest_converter.js +1 -0
  181. package/lib/offline/storage.js +104 -136
  182. package/lib/player.js +50 -216
  183. package/lib/polyfill/all.js +2 -3
  184. package/lib/polyfill/encryption_scheme.js +1 -1
  185. package/lib/polyfill/media_capabilities.js +15 -9
  186. package/lib/polyfill/mediasource.js +0 -28
  187. package/lib/polyfill/patchedmediakeys_nop.js +2 -0
  188. package/lib/polyfill/patchedmediakeys_webkit.js +2 -0
  189. package/lib/polyfill/symbol.js +46 -0
  190. package/lib/text/cue.js +1 -7
  191. package/lib/text/lrc_text_parser.js +8 -0
  192. package/lib/text/mp4_ttml_parser.js +8 -0
  193. package/lib/text/mp4_vtt_parser.js +8 -0
  194. package/lib/text/sbv_text_parser.js +8 -0
  195. package/lib/text/simple_text_displayer.js +3 -8
  196. package/lib/text/srt_text_parser.js +8 -0
  197. package/lib/text/ssa_text_parser.js +8 -0
  198. package/lib/text/text_engine.js +19 -3
  199. package/lib/text/ttml_text_parser.js +16 -5
  200. package/lib/text/ui_text_displayer.js +2 -8
  201. package/lib/text/vtt_text_parser.js +24 -2
  202. package/lib/text/web_vtt_generator.js +1 -7
  203. package/lib/util/buffer_utils.js +1 -3
  204. package/lib/util/ebml_parser.js +3 -3
  205. package/lib/util/error.js +10 -14
  206. package/lib/util/fairplay_utils.js +109 -0
  207. package/lib/util/functional.js +0 -42
  208. package/lib/util/iterables.js +0 -46
  209. package/lib/util/mime_utils.js +2 -0
  210. package/lib/util/mp4_box_parsers.js +1 -4
  211. package/lib/util/mp4_parser.js +5 -7
  212. package/lib/util/periods.js +10 -11
  213. package/lib/util/platform.js +48 -3
  214. package/lib/util/player_configuration.js +12 -6
  215. package/lib/util/pssh.js +24 -8
  216. package/lib/util/stream_utils.js +96 -25
  217. package/lib/util/string_utils.js +3 -5
  218. package/lib/util/uint8array_utils.js +3 -21
  219. package/lib/util/xml_utils.js +16 -8
  220. package/package.json +61 -36
  221. package/roadmap.md +27 -27
  222. package/shaka-player.uncompiled.js +1 -3
  223. package/test/abr/simple_abr_manager_unit.js +3 -8
  224. package/test/ads/ad_manager_unit.js +0 -6
  225. package/test/cast/cast_proxy_unit.js +0 -8
  226. package/test/cast/cast_receiver_integration.js +1 -18
  227. package/test/cast/cast_receiver_unit.js +1 -9
  228. package/test/cast/cast_sender_unit.js +0 -6
  229. package/test/cast/cast_utils_unit.js +1 -13
  230. package/test/cea/cea608_memory_unit.js +0 -5
  231. package/test/cea/cea708_service_unit.js +0 -7
  232. package/test/cea/cea708_window_unit.js +0 -5
  233. package/test/cea/cea_decoder_unit.js +0 -6
  234. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  235. package/test/cea/dtvcc_packet_unit.js +0 -5
  236. package/test/cea/mp4_cea_parser_unit.js +0 -4
  237. package/test/dash/dash_parser_content_protection_unit.js +45 -10
  238. package/test/dash/dash_parser_live_unit.js +2 -15
  239. package/test/dash/dash_parser_manifest_unit.js +2 -40
  240. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  241. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  242. package/test/dash/dash_parser_segment_template_unit.js +3 -13
  243. package/test/dash/mpd_utils_unit.js +3 -11
  244. package/test/demo/demo_unit.js +2 -6
  245. package/test/deprecate/enforcer_unit.js +0 -4
  246. package/test/deprecate/version_unit.js +0 -2
  247. package/test/hls/hls_live_unit.js +101 -234
  248. package/test/hls/hls_parser_unit.js +517 -447
  249. package/test/hls/manifest_text_parser_unit.js +0 -10
  250. package/test/media/adaptation_set_criteria_unit.js +3 -7
  251. package/test/media/adaptation_set_unit.js +0 -2
  252. package/test/media/buffering_observer_unit.js +1 -4
  253. package/test/media/closed_caption_parser_unit.js +0 -3
  254. package/test/media/drm_engine_integration.js +2 -15
  255. package/test/media/drm_engine_unit.js +90 -144
  256. package/test/media/manifest_parser_unit.js +0 -4
  257. package/test/media/media_source_engine_integration.js +26 -10
  258. package/test/media/media_source_engine_unit.js +8 -20
  259. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  260. package/test/media/play_rate_controller_unit.js +0 -4
  261. package/test/media/playhead_unit.js +35 -207
  262. package/test/media/presentation_timeline_unit.js +4 -7
  263. package/test/media/quality_observer_unit.js +0 -4
  264. package/test/media/region_observer_unit.js +1 -6
  265. package/test/media/region_timeline_unit.js +0 -3
  266. package/test/media/segment_index_unit.js +15 -31
  267. package/test/media/segment_reference_unit.js +0 -3
  268. package/test/media/stall_detector_unit.js +0 -5
  269. package/test/media/streaming_engine_integration.js +13 -75
  270. package/test/media/streaming_engine_unit.js +14 -37
  271. package/test/media/time_ranges_utils_unit.js +0 -7
  272. package/test/media/transmuxer_integration.js +0 -6
  273. package/test/media/webm_segment_index_parser_unit.js +0 -4
  274. package/test/net/data_uri_plugin_unit.js +0 -7
  275. package/test/net/http_plugin_unit.js +0 -9
  276. package/test/net/networking_engine_unit.js +0 -11
  277. package/test/offline/download_progress_estimator_unit.js +0 -2
  278. package/test/offline/indexeddb_storage_unit.js +0 -6
  279. package/test/offline/manifest_convert_unit.js +34 -12
  280. package/test/offline/offline_integration.js +1 -10
  281. package/test/offline/offline_manifest_parser_unit.js +1 -6
  282. package/test/offline/offline_scheme_unit.js +0 -8
  283. package/test/offline/offline_uri_unit.js +0 -2
  284. package/test/offline/storage_compatibility_unit.js +1 -14
  285. package/test/offline/storage_integration.js +6 -31
  286. package/test/player_external.js +1 -15
  287. package/test/player_integration.js +38 -28
  288. package/test/player_load_graph_integration.js +1 -6
  289. package/test/player_src_equals_external.js +3 -9
  290. package/test/player_src_equals_integration.js +0 -7
  291. package/test/player_unit.js +78 -37
  292. package/test/routing/walker_unit.js +0 -8
  293. package/test/test/assets/large_file.mpd +1 -1
  294. package/test/test/boot.js +75 -22
  295. package/test/test/externs/jasmine.js +2 -2
  296. package/test/test/externs/karma.js +4 -0
  297. package/test/test/namespace.js +10 -0
  298. package/test/test/util/canned_idb.js +0 -8
  299. package/test/test/util/cea_utils.js +0 -6
  300. package/test/test/util/dash_parser_util.js +0 -13
  301. package/test/test/util/fake_ad.js +0 -3
  302. package/test/test/util/fake_ad_manager.js +0 -9
  303. package/test/test/util/fake_demo_main.js +0 -5
  304. package/test/test/util/fake_drm_engine.js +0 -6
  305. package/test/test/util/fake_media_source_engine.js +11 -11
  306. package/test/test/util/fake_networking_engine.js +0 -5
  307. package/test/test/util/fake_text_displayer.js +0 -5
  308. package/test/test/util/indexeddb_utils.js +1 -10
  309. package/test/test/util/jasmine_fetch.js +0 -1
  310. package/test/test/util/loader.js +0 -18
  311. package/test/test/util/manifest_generator.js +12 -15
  312. package/test/test/util/manifest_parser_util.js +4 -7
  313. package/test/test/util/offline_utils.js +1 -5
  314. package/test/test/util/simple_fakes.js +9 -26
  315. package/test/test/util/stream_generator.js +0 -14
  316. package/test/test/util/streaming_engine_util.js +1 -15
  317. package/test/test/util/test_scheme.js +25 -20
  318. package/test/test/util/ttml_utils.js +0 -2
  319. package/test/test/util/ui_utils.js +0 -9
  320. package/test/test/util/util.js +9 -23
  321. package/test/test/util/waiter.js +84 -43
  322. package/test/text/cue_integration.js +2 -6
  323. package/test/text/lrc_text_parser_unit.js +6 -11
  324. package/test/text/mp4_ttml_parser_unit.js +6 -10
  325. package/test/text/mp4_vtt_parser_unit.js +7 -12
  326. package/test/text/sbv_text_parser_unit.js +5 -10
  327. package/test/text/simple_text_displayer_unit.js +1 -8
  328. package/test/text/srt_text_parser_unit.js +5 -10
  329. package/test/text/ssa_text_parser_unit.js +17 -34
  330. package/test/text/text_engine_unit.js +47 -12
  331. package/test/text/text_track_integration.js +0 -2
  332. package/test/text/ttml_text_parser_unit.js +79 -88
  333. package/test/text/ui_text_displayer_unit.js +44 -41
  334. package/test/text/vtt_text_parser_unit.js +55 -66
  335. package/test/text/web_vtt_generator_unit.js +0 -3
  336. package/test/ui/ad_ui_unit.js +0 -11
  337. package/test/ui/localization_unit.js +0 -3
  338. package/test/ui/text_displayer_layout_unit.js +1 -12
  339. package/test/ui/ui_customization_unit.js +0 -6
  340. package/test/ui/ui_integration.js +0 -32
  341. package/test/ui/ui_unit.js +28 -17
  342. package/test/util/abortable_operation_unit.js +4 -9
  343. package/test/util/array_utils_unit.js +0 -2
  344. package/test/util/buffer_utils_unit.js +0 -2
  345. package/test/util/cmcd_manager_unit.js +3 -3
  346. package/test/util/data_view_reader_unit.js +0 -4
  347. package/test/util/ebml_parser_unit.js +0 -4
  348. package/test/util/event_manager_unit.js +0 -3
  349. package/test/util/fake_event_target_unit.js +0 -5
  350. package/test/util/iterables_unit.js +0 -64
  351. package/test/util/language_utils_unit.js +0 -3
  352. package/test/util/manifest_parser_utils_unit.js +0 -2
  353. package/test/util/mp4_box_parsers_unit.js +0 -5
  354. package/test/util/mp4_parser_unit.js +0 -4
  355. package/test/util/multi_map_unit.js +0 -3
  356. package/test/util/object_utils_unit.js +0 -2
  357. package/test/util/periods_unit.js +14 -7
  358. package/test/util/pssh_unit.js +0 -5
  359. package/test/util/state_history_unit.js +0 -2
  360. package/test/util/stream_utils_unit.js +26 -15
  361. package/test/util/string_utils_unit.js +0 -6
  362. package/test/util/text_parser_unit.js +0 -2
  363. package/test/util/xml_utils_unit.js +0 -4
  364. package/ui/controls.js +65 -40
  365. package/ui/fullscreen_button.js +26 -6
  366. package/ui/less/ad_controls.less +6 -6
  367. package/ui/less/buttons.less +6 -6
  368. package/ui/less/containers.less +10 -12
  369. package/ui/less/overflow_menu.less +4 -4
  370. package/ui/less/range_elements.less +7 -2
  371. package/ui/less/tooltip.less +4 -4
  372. package/ui/locales/en.json +1 -0
  373. package/ui/locales/sjn-translations.yaml +257 -0
  374. package/ui/locales/sjn.json +42 -0
  375. package/ui/locales/source.json +5 -0
  376. package/ui/resolution_selection.js +31 -33
  377. package/ui/seek_bar.js +2 -1
  378. package/ui/ui.js +0 -17
  379. package/.github/workflows/build_and_test.yaml +0 -73
  380. package/.github/workflows/release.yaml +0 -53
  381. package/docs/tutorials/upgrade-v2-5.md +0 -441
  382. package/docs/tutorials/upgrade-v3.md +0 -38
  383. package/externs/svgelement.js +0 -18
  384. package/externs/webcrypto.js +0 -18
  385. package/lib/polyfill/mathround.js +0 -49
  386. package/lib/polyfill/patchedmediakeys_apple.js +0 -744
  387. package/lib/polyfill/patchedmediakeys_ms.js +0 -698
  388. package/lib/util/mutex.js +0 -52
  389. package/test/util/functional_unit.js +0 -82
@@ -13,7 +13,6 @@ goog.require('shaka.hls.Segment');
13
13
  goog.require('shaka.hls.Tag');
14
14
  goog.require('shaka.hls.Utils');
15
15
  goog.require('shaka.util.Error');
16
- goog.require('shaka.util.Iterables');
17
16
  goog.require('shaka.util.StringUtils');
18
17
  goog.require('shaka.util.TextParser');
19
18
 
@@ -82,8 +81,9 @@ shaka.hls.ManifestTextParser = class {
82
81
  const tags = [];
83
82
  // Initialize to "true" to skip the first element.
84
83
  skip = true;
85
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
86
- for (const {i, item: line, next} of enumerate(lines)) {
84
+ for (let i = 0; i < lines.length; i++) {
85
+ const line = lines[i];
86
+ const next = lines[i + 1];
87
87
  // Skip comments
88
88
  if (shaka.hls.Utils.isComment(line) || skip) {
89
89
  skip = false;
@@ -179,9 +179,8 @@ shaka.hls.ManifestTextParser = class {
179
179
  segmentTags.push(currentMapTag);
180
180
  }
181
181
  // The URI appears after all of the tags describing the segment.
182
- const segment =
183
- new shaka.hls.Segment(absoluteSegmentUri, segmentTags,
184
- partialSegmentTags);
182
+ const segment = new shaka.hls.Segment(absoluteSegmentUri, segmentTags,
183
+ partialSegmentTags);
185
184
  segments.push(segment);
186
185
  segmentTags = [];
187
186
  partialSegmentTags = [];
@@ -8,7 +8,6 @@ goog.provide('shaka.media.AdaptationSet');
8
8
 
9
9
  goog.require('goog.asserts');
10
10
  goog.require('shaka.log');
11
- goog.require('shaka.util.Iterables');
12
11
  goog.require('shaka.util.MimeUtils');
13
12
 
14
13
 
@@ -215,7 +214,7 @@ shaka.media.AdaptationSet = class {
215
214
  codecsA.sort();
216
215
  codecsB.sort();
217
216
 
218
- for (const i of shaka.util.Iterables.range(codecsA.length)) {
217
+ for (let i = 0; i < codecsA.length; i++) {
219
218
  if (codecsA[i] != codecsB[i]) {
220
219
  return false;
221
220
  }
@@ -31,7 +31,7 @@ shaka.media.ContentWorkarounds = class {
31
31
  *
32
32
  * @param {!BufferSource} initSegmentBuffer
33
33
  * @return {!Uint8Array}
34
- * @see https://github.com/google/shaka-player/issues/2759
34
+ * @see https://github.com/shaka-project/shaka-player/issues/2759
35
35
  */
36
36
  static fakeEncryption(initSegmentBuffer) {
37
37
  const ContentWorkarounds = shaka.media.ContentWorkarounds;
@@ -283,7 +283,7 @@ shaka.media.ContentWorkarounds = class {
283
283
  *
284
284
  * @const {!shaka.util.Lazy.<!Uint8Array>}
285
285
  * @private
286
- * @see https://github.com/google/shaka-player/issues/2759
286
+ * @see https://github.com/shaka-project/shaka-player/issues/2759
287
287
  */
288
288
  shaka.media.ContentWorkarounds.CANNED_SINF_BOX_ =
289
289
  new shaka.util.Lazy(() => new Uint8Array([
@@ -14,7 +14,6 @@ goog.require('shaka.util.BufferUtils');
14
14
  goog.require('shaka.util.Destroyer');
15
15
  goog.require('shaka.util.Error');
16
16
  goog.require('shaka.util.EventManager');
17
- goog.require('shaka.util.FairPlayUtils');
18
17
  goog.require('shaka.util.FakeEvent');
19
18
  goog.require('shaka.util.IDestroyable');
20
19
  goog.require('shaka.util.Iterables');
@@ -128,6 +127,9 @@ shaka.media.DrmEngine = class {
128
127
 
129
128
  /** @private {boolean} */
130
129
  this.srcEquals_ = false;
130
+
131
+ /** @private {Promise} */
132
+ this.mediaKeysAttached_ = null;
131
133
  }
132
134
 
133
135
  /** @override */
@@ -184,6 +186,7 @@ shaka.media.DrmEngine = class {
184
186
  this.onError_ = () => {};
185
187
  this.playerInterface_ = null;
186
188
  this.srcEquals_ = false;
189
+ this.mediaKeysAttached_ = null;
187
190
  }
188
191
 
189
192
  /**
@@ -387,7 +390,59 @@ shaka.media.DrmEngine = class {
387
390
  }
388
391
 
389
392
  /**
390
- * Attach MediaKeys to the video element and start processing events.
393
+ * Attach MediaKeys to the video element
394
+ * @return {Promise}
395
+ * @private
396
+ */
397
+ async attachMediaKeys_() {
398
+ if (this.video_.mediaKeys) {
399
+ return;
400
+ }
401
+
402
+ // An attach process has already started, let's wait it out
403
+ if (this.mediaKeysAttached_) {
404
+ await this.mediaKeysAttached_;
405
+
406
+ return;
407
+ }
408
+
409
+ try {
410
+ this.mediaKeysAttached_ = this.video_.setMediaKeys(this.mediaKeys_);
411
+
412
+ await this.mediaKeysAttached_;
413
+ } catch (exception) {
414
+ goog.asserts.assert(exception instanceof Error, 'Wrong error type!');
415
+
416
+ this.onError_(new shaka.util.Error(
417
+ shaka.util.Error.Severity.CRITICAL,
418
+ shaka.util.Error.Category.DRM,
419
+ shaka.util.Error.Code.FAILED_TO_ATTACH_TO_VIDEO,
420
+ exception.message));
421
+ }
422
+
423
+ this.destroyer_.ensureNotDestroyed();
424
+ }
425
+
426
+ /**
427
+ * Processes encrypted event and start licence challenging
428
+ * @return {!Promise}
429
+ * @private
430
+ */
431
+ async onEncryptedEvent_(event) {
432
+ /**
433
+ * MediaKeys should be added when receiving an encrypted event. Setting
434
+ * mediaKeys before could result into encrypted event not being fired on
435
+ * some browsers
436
+ */
437
+ await this.attachMediaKeys_();
438
+
439
+ this.newInitData(
440
+ event.initDataType,
441
+ shaka.util.BufferUtils.toUint8(event.initData));
442
+ }
443
+
444
+ /**
445
+ * Start processing events.
391
446
  * @param {HTMLMediaElement} video
392
447
  * @return {!Promise}
393
448
  */
@@ -420,27 +475,30 @@ shaka.media.DrmEngine = class {
420
475
  () => this.closeOpenSessions_());
421
476
  }
422
477
 
423
- let setMediaKeys = this.video_.setMediaKeys(this.mediaKeys_);
424
- setMediaKeys = setMediaKeys.catch((exception) => {
425
- goog.asserts.assert(exception instanceof Error, 'Wrong error type!');
426
- return Promise.reject(new shaka.util.Error(
427
- shaka.util.Error.Severity.CRITICAL,
428
- shaka.util.Error.Category.DRM,
429
- shaka.util.Error.Code.FAILED_TO_ATTACH_TO_VIDEO,
430
- exception.message));
431
- });
478
+ const manifestInitData = this.currentDrmInfo_.initData.find(
479
+ (initDataOverride) => initDataOverride.initData.length > 0);
432
480
 
433
- await setMediaKeys;
434
- this.destroyer_.ensureNotDestroyed();
481
+ /**
482
+ * We can attach media keys before the playback actually begins when:
483
+ * - Using legacy implementations requires MediaKeys to be set before
484
+ * having webkitneedkey / msneedkey event, which will be translated as
485
+ * an encrypted event by the polyfills
486
+ * - Some initData already has been generated (through the manifest)
487
+ * - In case of an offline session
488
+ */
489
+ if (manifestInitData ||
490
+ shaka.util.Platform.isMediaKeysPolyfilled() ||
491
+ this.offlineSessionIds_.length) {
492
+ await this.attachMediaKeys_();
493
+ }
435
494
 
436
495
  this.createOrLoad();
437
- if (!this.currentDrmInfo_.initData.length &&
438
- !this.offlineSessionIds_.length) {
439
- // Explicit init data for any one stream or an offline session is
440
- // sufficient to suppress 'encrypted' events for all streams.
441
- const cb = (e) => this.newInitData(
442
- e.initDataType, shaka.util.BufferUtils.toUint8(e.initData));
443
- this.eventManager_.listen(this.video_, 'encrypted', cb);
496
+
497
+ // Explicit init data for any one stream or an offline session is
498
+ // sufficient to suppress 'encrypted' events for all streams.
499
+ if (!manifestInitData && !this.offlineSessionIds_.length) {
500
+ this.eventManager_.listen(
501
+ this.video_, 'encrypted', (e) => this.onEncryptedEvent_(e));
444
502
  }
445
503
  }
446
504
 
@@ -589,6 +647,10 @@ shaka.media.DrmEngine = class {
589
647
  * @param {!Uint8Array} initData
590
648
  */
591
649
  newInitData(initDataType, initData) {
650
+ if (!initData.length) {
651
+ return;
652
+ }
653
+
592
654
  // Suppress duplicate init data.
593
655
  // Note that some init data are extremely large and can't portably be used
594
656
  // as keys in a dictionary.
@@ -655,7 +717,7 @@ shaka.media.DrmEngine = class {
655
717
  // first MIME type even if the others are supported. To work around this,
656
718
  // we say that Edge supports everything.
657
719
  //
658
- // See https://github.com/google/shaka-player/issues/1495 for details.
720
+ // See https://github.com/shaka-project/shaka-player/issues/1495 for details.
659
721
  if (shaka.util.Platform.isLegacyEdge()) {
660
722
  return true;
661
723
  }
@@ -667,7 +729,8 @@ shaka.media.DrmEngine = class {
667
729
  // Some Tizen devices seem to misreport AC-3 support. This works around
668
730
  // the issue, by falling back to EC-3, which seems to be supported on the
669
731
  // same devices and be correctly reported in all cases we have observed.
670
- // See https://github.com/google/shaka-player/issues/2989 for details.
732
+ // See https://github.com/shaka-project/shaka-player/issues/2989 for
733
+ // details.
671
734
  const fallback = contentType.replace('ac-3', 'ec-3');
672
735
  return this.supportedTypes_.has(contentType) ||
673
736
  this.supportedTypes_.has(fallback);
@@ -1105,6 +1168,7 @@ shaka.media.DrmEngine = class {
1105
1168
 
1106
1169
  const metadata = {
1107
1170
  initData: null,
1171
+ initDataType: null,
1108
1172
  loaded: false,
1109
1173
  oldExpiration: Infinity,
1110
1174
  updatePromise: null,
@@ -1181,6 +1245,7 @@ shaka.media.DrmEngine = class {
1181
1245
 
1182
1246
  const metadata = {
1183
1247
  initData: initData,
1248
+ initDataType: initDataType,
1184
1249
  loaded: false,
1185
1250
  oldExpiration: Infinity,
1186
1251
  updatePromise: null,
@@ -1188,22 +1253,6 @@ shaka.media.DrmEngine = class {
1188
1253
  };
1189
1254
  this.activeSessions_.set(session, metadata);
1190
1255
 
1191
- try {
1192
- initData = this.config_.initDataTransform(
1193
- initData, initDataType, this.currentDrmInfo_);
1194
- } catch (error) {
1195
- let shakaError = error;
1196
- if (!(error instanceof shaka.util.Error)) {
1197
- shakaError = new shaka.util.Error(
1198
- shaka.util.Error.Severity.CRITICAL,
1199
- shaka.util.Error.Category.DRM,
1200
- shaka.util.Error.Code.INIT_DATA_TRANSFORM_ERROR,
1201
- error);
1202
- }
1203
- this.onError_(shakaError);
1204
- return;
1205
- }
1206
-
1207
1256
  if (this.config_.logLicenseExchange) {
1208
1257
  const str = shaka.util.Uint8ArrayUtils.toBase64(initData);
1209
1258
  shaka.log.info('EME init data: type=', initDataType, 'data=', str);
@@ -1238,23 +1287,6 @@ shaka.media.DrmEngine = class {
1238
1287
  });
1239
1288
  }
1240
1289
 
1241
- /**
1242
- * @param {!Uint8Array} initData
1243
- * @param {string} initDataType
1244
- * @param {?shaka.extern.DrmInfo} drmInfo
1245
- * @return {!Uint8Array}
1246
- */
1247
- static defaultInitDataTransform(initData, initDataType, drmInfo) {
1248
- if (initDataType == 'skd') {
1249
- const cert = drmInfo.serverCertificate;
1250
- const contentId =
1251
- shaka.util.FairPlayUtils.defaultGetContentId(initData);
1252
- initData = shaka.util.FairPlayUtils.initDataTransform(
1253
- initData, contentId, cert);
1254
- }
1255
- return initData;
1256
- }
1257
-
1258
1290
  /**
1259
1291
  * @param {!MediaKeyMessageEvent} event
1260
1292
  * @private
@@ -1315,6 +1347,11 @@ shaka.media.DrmEngine = class {
1315
1347
  request.method = 'POST';
1316
1348
  request.licenseRequestType = event.messageType;
1317
1349
  request.sessionId = session.sessionId;
1350
+ request.drmInfo = this.currentDrmInfo_;
1351
+ if (metadata) {
1352
+ request.initData = metadata.initData;
1353
+ request.initDataType = metadata.initDataType;
1354
+ }
1318
1355
  // NOTE: allowCrossSiteCredentials can be set in a request filter.
1319
1356
 
1320
1357
  if (shaka.media.DrmEngine.isPlayReadyKeySystem(
@@ -1641,6 +1678,16 @@ shaka.media.DrmEngine = class {
1641
1678
 
1642
1679
  const testSystem = async (keySystem) => {
1643
1680
  try {
1681
+ // Our Polyfill will reject anything apart com.apple.fps key systems.
1682
+ // It seems the Safari modern EME API will allow to request a
1683
+ // MediaKeySystemAccess for the ClearKey CDM, create and update a key
1684
+ // session but playback will never start
1685
+ // Safari bug: https://bugs.webkit.org/show_bug.cgi?id=231006
1686
+ if (keySystem === 'org.w3.clearkey' &&
1687
+ shaka.util.Platform.isSafari()) {
1688
+ throw new Error('Unsupported keySystem');
1689
+ }
1690
+
1644
1691
  const access = await navigator.requestMediaKeySystemAccess(
1645
1692
  keySystem, configs);
1646
1693
 
@@ -2261,6 +2308,7 @@ shaka.media.DrmEngine = class {
2261
2308
  * @typedef {{
2262
2309
  * loaded: boolean,
2263
2310
  * initData: Uint8Array,
2311
+ * initDataType: ?string,
2264
2312
  * oldExpiration: number,
2265
2313
  * type: string,
2266
2314
  * updatePromise: shaka.util.PublicPromise
@@ -2272,6 +2320,8 @@ shaka.media.DrmEngine = class {
2272
2320
  * does not mean the session is 'usable'.
2273
2321
  * @property {Uint8Array} initData
2274
2322
  * The init data used to create the session.
2323
+ * @property {?string} initDataType
2324
+ * The init data type used to create the session.
2275
2325
  * @property {!MediaKeySession} session
2276
2326
  * The session object.
2277
2327
  * @property {number} oldExpiration
@@ -11,7 +11,6 @@ goog.require('shaka.media.PresentationTimeline');
11
11
  goog.require('shaka.media.StallDetector');
12
12
  goog.require('shaka.media.TimeRangesUtils');
13
13
  goog.require('shaka.util.EventManager');
14
- goog.require('shaka.util.FakeEvent');
15
14
  goog.require('shaka.util.IReleasable');
16
15
  goog.require('shaka.util.Timer');
17
16
 
@@ -33,10 +32,8 @@ shaka.media.GapJumpingController = class {
33
32
  * playable region. The gap jumping controller takes ownership over the
34
33
  * stall detector.
35
34
  * If no stall detection logic is desired, |null| may be provided.
36
- * @param {function(!Event)} onEvent Called when an event is raised to be sent
37
- * to the application.
38
35
  */
39
- constructor(video, timeline, config, stallDetector, onEvent) {
36
+ constructor(video, timeline, config, stallDetector) {
40
37
  /** @private {HTMLMediaElement} */
41
38
  this.video_ = video;
42
39
 
@@ -46,9 +43,6 @@ shaka.media.GapJumpingController = class {
46
43
  /** @private {?shaka.extern.StreamingConfiguration} */
47
44
  this.config_ = config;
48
45
 
49
- /** @private {?function(!Event)} */
50
- this.onEvent_ = onEvent;
51
-
52
46
  /** @private {shaka.util.EventManager} */
53
47
  this.eventManager_ = new shaka.util.EventManager();
54
48
 
@@ -58,9 +52,6 @@ shaka.media.GapJumpingController = class {
58
52
  /** @private {number} */
59
53
  this.prevReadyState_ = video.readyState;
60
54
 
61
- /** @private {boolean} */
62
- this.didFireLargeGap_ = false;
63
-
64
55
  /**
65
56
  * The stall detector tries to keep the playhead moving forward. It is
66
57
  * managed by the gap-jumping controller to avoid conflicts. On some
@@ -107,7 +98,6 @@ shaka.media.GapJumpingController = class {
107
98
  this.stallDetector_ = null;
108
99
  }
109
100
 
110
- this.onEvent_ = null;
111
101
  this.timeline_ = null;
112
102
  this.video_ = null;
113
103
  }
@@ -128,7 +118,6 @@ shaka.media.GapJumpingController = class {
128
118
  onSeeking() {
129
119
  this.seekingEventReceived_ = true;
130
120
  this.hadSegmentAppended_ = false;
131
- this.didFireLargeGap_ = false;
132
121
  }
133
122
 
134
123
 
@@ -165,7 +154,6 @@ shaka.media.GapJumpingController = class {
165
154
  // When the ready state changes, we have moved on, so we should fire the
166
155
  // large gap event if we see one.
167
156
  if (this.video_.readyState != this.prevReadyState_) {
168
- this.didFireLargeGap_ = false;
169
157
  this.prevReadyState_ = this.video_.readyState;
170
158
  }
171
159
 
@@ -175,7 +163,6 @@ shaka.media.GapJumpingController = class {
175
163
  }
176
164
 
177
165
 
178
- const smallGapLimit = this.config_.smallGapLimit;
179
166
  const currentTime = this.video_.currentTime;
180
167
  const buffered = this.video_.buffered;
181
168
  const gapDetectionThreshold = this.config_.gapDetectionThreshold;
@@ -203,8 +190,6 @@ shaka.media.GapJumpingController = class {
203
190
  }
204
191
 
205
192
  const jumpSize = jumpTo - currentTime;
206
- const isGapSmall = jumpSize <= smallGapLimit;
207
- let jumpLargeGap = false;
208
193
 
209
194
  // If we jump to exactly the gap start, we may detect a small gap due to
210
195
  // rounding errors or browser bugs. We can ignore these extremely small
@@ -213,37 +198,17 @@ shaka.media.GapJumpingController = class {
213
198
  return;
214
199
  }
215
200
 
216
- if (!isGapSmall && !this.didFireLargeGap_) {
217
- this.didFireLargeGap_ = true;
218
-
219
- // Event firing is synchronous.
220
- const data = new Map()
221
- .set('currentTime', currentTime)
222
- .set('gapSize', jumpSize);
223
- const event = new shaka.util.FakeEvent('largegap', data);
224
- event.cancelable = true;
225
- this.onEvent_(event);
226
-
227
- if (this.config_.jumpLargeGaps && !event.defaultPrevented) {
228
- jumpLargeGap = true;
229
- } else {
230
- shaka.log.info('Ignoring large gap at', currentTime, 'size', jumpSize);
231
- }
201
+ if (gapIndex == 0) {
202
+ shaka.log.info(
203
+ 'Jumping forward', jumpSize,
204
+ 'seconds because of gap before start time of', jumpTo);
205
+ } else {
206
+ shaka.log.info(
207
+ 'Jumping forward', jumpSize, 'seconds because of gap starting at',
208
+ buffered.end(gapIndex - 1), 'and ending at', jumpTo);
232
209
  }
233
210
 
234
- if (isGapSmall || jumpLargeGap) {
235
- if (gapIndex == 0) {
236
- shaka.log.info(
237
- 'Jumping forward', jumpSize,
238
- 'seconds because of gap before start time of', jumpTo);
239
- } else {
240
- shaka.log.info(
241
- 'Jumping forward', jumpSize, 'seconds because of gap starting at',
242
- buffered.end(gapIndex - 1), 'and ending at', jumpTo);
243
- }
244
-
245
- this.video_.currentTime = jumpTo;
246
- }
211
+ this.video_.currentTime = jumpTo;
247
212
  }
248
213
  };
249
214