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
@@ -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
@@ -23,7 +19,7 @@ describe('Cue', () => {
23
19
  'WEBVTT\n\n' +
24
20
  '00:00:20.000 --> 00:00:40.000\n' +
25
21
  'Test',
26
- {periodStart: 7, segmentStart: 10, segmentEnd: 60});
22
+ {periodStart: 7, segmentStart: 10, segmentEnd: 60, vttOffset: 7});
27
23
  expect(cues.length).toBe(1);
28
24
  expect(cues[0].startTime).toBe(27);
29
25
  expect(cues[0].endTime).toBe(47);
@@ -38,7 +34,7 @@ describe('Cue', () => {
38
34
  'ID1\n' +
39
35
  '00:00:20.000 --> 00:00:40.000 align:middle size:56% vertical:lr\n' +
40
36
  'Test',
41
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
37
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
42
38
  expect(cues.length).toBe(1);
43
39
  });
44
40
 
@@ -4,15 +4,11 @@
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([],
14
10
  '',
15
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
11
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
16
12
  });
17
13
 
18
14
  it('handles a blank line at the start of the file', () => {
@@ -22,7 +18,7 @@ describe('LrcTextParser', () => {
22
18
  ],
23
19
  '\n\n' +
24
20
  '[00:00.00]Test',
25
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
21
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
26
22
  });
27
23
 
28
24
  it('handles a blank line at the end of the file', () => {
@@ -32,7 +28,7 @@ describe('LrcTextParser', () => {
32
28
  ],
33
29
  '[00:00.00]Test' +
34
30
  '\n\n',
35
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
31
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
36
32
  });
37
33
 
38
34
  it('handles no blank line at the end of the file', () => {
@@ -41,8 +37,7 @@ describe('LrcTextParser', () => {
41
37
  {startTime: 0, endTime: 2, payload: 'Test'},
42
38
  ],
43
39
  '[00:00.00]Test',
44
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
45
- });
40
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
46
41
  });
47
42
 
48
43
  it('supports multiple cues', () => {
@@ -55,7 +50,7 @@ describe('LrcTextParser', () => {
55
50
  '[00:00.00]Test\n' +
56
51
  '[00:10.00]Test2\n' +
57
52
  '[00:20.00]Test3',
58
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
53
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
59
54
  });
60
55
 
61
56
  it('supports different time formats', () => {
@@ -74,7 +69,7 @@ describe('LrcTextParser', () => {
74
69
  '[00:30,1]Test4\n' +
75
70
  '[00:40,001]Test5\n' +
76
71
  '[00:50,02]Test6',
77
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
72
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
78
73
  });
79
74
 
80
75
  /**
@@ -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';
@@ -47,7 +41,7 @@ describe('Mp4TtmlParser', () => {
47
41
  it('handles media segments with multiple mdats', () => {
48
42
  const parser = new shaka.text.Mp4TtmlParser();
49
43
  parser.parseInit(ttmlInitSegment);
50
- const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
44
+ const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
51
45
  const ret = parser.parseMedia(ttmlSegmentMultipleMDAT, time);
52
46
  // Bodies.
53
47
  expect(ret.length).toBe(2);
@@ -60,8 +54,10 @@ describe('Mp4TtmlParser', () => {
60
54
  });
61
55
 
62
56
  it('accounts for offset', () => {
63
- const time1 = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
64
- const time2 = {periodStart: 7, segmentStart: 0, segmentEnd: 0};
57
+ const time1 =
58
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
59
+ const time2 =
60
+ {periodStart: 7, segmentStart: 0, segmentEnd: 0, vttOffset: 7};
65
61
 
66
62
  const parser = new shaka.text.Mp4TtmlParser();
67
63
  parser.parseInit(ttmlInitSegment);
@@ -165,7 +161,7 @@ describe('Mp4TtmlParser', () => {
165
161
  ];
166
162
  const parser = new shaka.text.Mp4TtmlParser();
167
163
  parser.parseInit(ttmlInitSegment);
168
- const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
164
+ const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
169
165
  const result = parser.parseMedia(ttmlSegment, time);
170
166
  shaka.test.TtmlUtils.verifyHelper(
171
167
  cues, result, {startTime: 23, endTime: 53.5});
@@ -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';
@@ -71,7 +65,7 @@ describe('Mp4VttParser', () => {
71
65
 
72
66
  const parser = new shaka.text.Mp4VttParser();
73
67
  parser.parseInit(vttInitSegment);
74
- const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
68
+ const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
75
69
  const result = parser.parseMedia(vttSegment, time);
76
70
  verifyHelper(cues, result);
77
71
  });
@@ -99,7 +93,7 @@ describe('Mp4VttParser', () => {
99
93
 
100
94
  const parser = new shaka.text.Mp4VttParser();
101
95
  parser.parseInit(vttInitSegment);
102
- const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
96
+ const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
103
97
  const result = parser.parseMedia(vttSegmentMultiPayload, time);
104
98
  verifyHelper(cues, result);
105
99
  });
@@ -127,13 +121,13 @@ describe('Mp4VttParser', () => {
127
121
 
128
122
  const parser = new shaka.text.Mp4VttParser();
129
123
  parser.parseInit(vttInitSegment);
130
- const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
124
+ const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
131
125
  const result = parser.parseMedia(vttSegSettings, time);
132
126
  verifyHelper(cues, result);
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'},
@@ -149,7 +143,7 @@ describe('Mp4VttParser', () => {
149
143
 
150
144
  const parser = new shaka.text.Mp4VttParser();
151
145
  parser.parseInit(vttInitSegment);
152
- const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
146
+ const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
153
147
  const result = parser.parseMedia(vttSegNoDuration, time);
154
148
  verifyHelper(cues, result);
155
149
  });
@@ -171,7 +165,8 @@ describe('Mp4VttParser', () => {
171
165
 
172
166
  const parser = new shaka.text.Mp4VttParser();
173
167
  parser.parseInit(vttInitSegment);
174
- const time = {periodStart: 10, segmentStart: 0, segmentEnd: 0};
168
+ const time =
169
+ {periodStart: 10, segmentStart: 0, segmentEnd: 0, vttOffset: 10};
175
170
  const result = parser.parseMedia(vttSegment, time);
176
171
  verifyHelper(cues, result);
177
172
  });
@@ -4,15 +4,11 @@
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([],
14
10
  '',
15
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
11
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
16
12
  });
17
13
 
18
14
  it('handles a blank line at the end of the file', () => {
@@ -22,7 +18,7 @@ describe('SbvTextParser', () => {
22
18
  ],
23
19
  '0:00:20.000,0:00:40.000\n' +
24
20
  'Test\n\n',
25
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
21
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
26
22
  });
27
23
 
28
24
  it('handles no blank line at the end of the file', () => {
@@ -32,8 +28,7 @@ describe('SbvTextParser', () => {
32
28
  ],
33
29
  '0:00:20.000,0:00:40.000\n' +
34
30
  'Test\n',
35
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
36
- });
31
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
37
32
  });
38
33
 
39
34
  it('handles no newline after the final text payload', () => {
@@ -43,7 +38,7 @@ describe('SbvTextParser', () => {
43
38
  ],
44
39
  '0:00:20.000,0:00:40.000\n' +
45
40
  'Test',
46
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
41
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
47
42
  });
48
43
 
49
44
  it('supports multiple cues', () => {
@@ -56,7 +51,7 @@ describe('SbvTextParser', () => {
56
51
  'Test\n\n' +
57
52
  '0:00:40.000,0:00:50.000\n' +
58
53
  'Test2',
59
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
54
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
60
55
  });
61
56
 
62
57
  /**
@@ -4,13 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
-
8
- goog.require('shaka.test.FakeVideo');
9
- goog.require('shaka.text.Cue');
10
- goog.require('shaka.text.SimpleTextDisplayer');
11
- goog.require('shaka.util.Functional');
12
- goog.requireType('shaka.test.FakeTextTrack');
13
-
14
7
  describe('SimpleTextDisplayer', () => {
15
8
  const originalVTTCue = window.VTTCue;
16
9
  const Cue = shaka.text.Cue;
@@ -74,7 +67,7 @@ describe('SimpleTextDisplayer', () => {
74
67
  });
75
68
 
76
69
  it('appends equal time cues in reverse order', () => {
77
- // Regression test for https://github.com/google/shaka-player/issues/848
70
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/848
78
71
 
79
72
  // When VTTCue is seen as the real thing (because of the presence of
80
73
  // VTTCue.prototype.line), then the reverse-order behavior comes into
@@ -4,15 +4,11 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.text.SrtTextParser');
8
- goog.require('shaka.util.BufferUtils');
9
- goog.require('shaka.util.StringUtils');
10
-
11
7
  describe('SrtTextParser', () => {
12
8
  it('supports no cues', () => {
13
9
  verifyHelper([],
14
10
  '',
15
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
11
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
16
12
  });
17
13
 
18
14
  it('handles a blank line at the end of the file', () => {
@@ -23,7 +19,7 @@ describe('SrtTextParser', () => {
23
19
  '1\n' +
24
20
  '00:00:20,000 --> 00:00:40,000\n' +
25
21
  'Test\n\n',
26
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
22
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
27
23
  });
28
24
 
29
25
  it('handles no blank line at the end of the file', () => {
@@ -34,8 +30,7 @@ describe('SrtTextParser', () => {
34
30
  '1\n' +
35
31
  '00:00:20,000 --> 00:00:40,000\n' +
36
32
  'Test\n',
37
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
38
- });
33
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
39
34
  });
40
35
 
41
36
  it('handles no newline after the final text payload', () => {
@@ -46,7 +41,7 @@ describe('SrtTextParser', () => {
46
41
  '1\n' +
47
42
  '00:00:20,000 --> 00:00:40,000\n' +
48
43
  'Test',
49
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
44
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
50
45
  });
51
46
 
52
47
  it('supports multiple cues', () => {
@@ -61,7 +56,7 @@ describe('SrtTextParser', () => {
61
56
  '2\n' +
62
57
  '00:00:40,000 --> 00:00:50,000\n' +
63
58
  'Test2',
64
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
59
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
65
60
  });
66
61
 
67
62
  /**