shaka-player 4.6.3 → 4.7.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 (608) hide show
  1. package/README.md +1 -0
  2. package/dist/controls.css +1 -1
  3. package/dist/controls.css.map +1 -1
  4. package/dist/deps.js +13 -9
  5. package/dist/locales.js +33 -33
  6. package/dist/shaka-player.compiled.d.ts +47 -4
  7. package/dist/shaka-player.compiled.debug.d.ts +47 -4
  8. package/dist/shaka-player.compiled.debug.externs.js +50 -2
  9. package/dist/shaka-player.compiled.debug.js +408 -376
  10. package/dist/shaka-player.compiled.debug.map +4 -4
  11. package/dist/shaka-player.compiled.externs.js +50 -2
  12. package/dist/shaka-player.compiled.js +1134 -1118
  13. package/dist/shaka-player.compiled.map +4 -4
  14. package/dist/shaka-player.ui.d.ts +69 -5
  15. package/dist/shaka-player.ui.debug.d.ts +69 -5
  16. package/dist/shaka-player.ui.debug.externs.js +82 -2
  17. package/dist/shaka-player.ui.debug.js +457 -420
  18. package/dist/shaka-player.ui.debug.map +4 -4
  19. package/dist/shaka-player.ui.externs.js +82 -2
  20. package/dist/shaka-player.ui.js +1305 -1289
  21. package/dist/shaka-player.ui.map +4 -4
  22. package/externs/mediasession.js +7 -0
  23. package/externs/shaka/abr_manager.js +8 -0
  24. package/externs/shaka/manifest.js +3 -3
  25. package/externs/shaka/player.js +59 -4
  26. package/lib/abr/simple_abr_manager.js +41 -15
  27. package/lib/ads/client_side_ad_manager.js +4 -0
  28. package/lib/ads/media_tailor_ad_manager.js +5 -0
  29. package/lib/ads/server_side_ad_manager.js +4 -0
  30. package/lib/cea/cea708_service.js +1 -1
  31. package/lib/cea/cea708_window.js +95 -7
  32. package/lib/dash/dash_parser.js +55 -11
  33. package/lib/hls/hls_parser.js +17 -5
  34. package/lib/media/adaptation_set_criteria.js +76 -10
  35. package/lib/media/drm_engine.js +0 -3
  36. package/lib/media/media_source_engine.js +42 -18
  37. package/lib/media/segment_reference.js +12 -0
  38. package/lib/media/streaming_engine.js +58 -5
  39. package/lib/media/video_wrapper.js +4 -3
  40. package/lib/player.js +95 -11
  41. package/lib/text/simple_text_displayer.js +8 -7
  42. package/lib/text/text_utils.js +39 -13
  43. package/lib/text/ui_text_displayer.js +20 -11
  44. package/lib/text/web_vtt_generator.js +1 -1
  45. package/lib/util/cmsd_manager.js +269 -0
  46. package/lib/util/content_steering_manager.js +5 -1
  47. package/lib/util/mime_utils.js +6 -2
  48. package/lib/util/periods.js +108 -39
  49. package/lib/util/player_configuration.js +19 -5
  50. package/lib/util/stream_utils.js +82 -13
  51. package/package.json +1 -1
  52. package/ui/audio_language_selection.js +3 -0
  53. package/ui/controls.js +60 -0
  54. package/ui/externs/ui.js +12 -1
  55. package/ui/hidden_fast_forward_button.js +32 -0
  56. package/ui/hidden_rewind_button.js +32 -0
  57. package/ui/hidden_seek_button.js +121 -0
  58. package/ui/less/buttons.less +50 -0
  59. package/ui/less/containers.less +18 -0
  60. package/ui/resolution_selection.js +2 -0
  61. package/ui/ui.js +2 -0
  62. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -75
  63. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -26
  64. package/.github/ISSUE_TEMPLATE/question.md +0 -26
  65. package/.github/config.yml +0 -1
  66. package/.github/workflows/appspot.yaml +0 -39
  67. package/.github/workflows/build-and-test.yaml +0 -222
  68. package/.github/workflows/compute-incremental-coverage.py +0 -265
  69. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +0 -56
  70. package/.github/workflows/custom-actions/set-commit-status/action.yaml +0 -37
  71. package/.github/workflows/deflake.yaml +0 -31
  72. package/.github/workflows/demo-version-index.yaml +0 -43
  73. package/.github/workflows/nightly-demo.yaml +0 -42
  74. package/.github/workflows/release-please.yaml +0 -193
  75. package/.github/workflows/report-incremental-coverage.yaml +0 -39
  76. package/.github/workflows/safari-homedir-launcher.sh +0 -18
  77. package/.github/workflows/selenium-lab-tests.yaml +0 -370
  78. package/.github/workflows/shaka-bot-commands/command-help.sh +0 -27
  79. package/.github/workflows/shaka-bot-commands/command-test.sh +0 -56
  80. package/.github/workflows/shaka-bot-commands/lib.sh +0 -83
  81. package/.github/workflows/shaka-bot-commands/main.sh +0 -51
  82. package/.github/workflows/sync-labels.yaml +0 -33
  83. package/.github/workflows/talk-to-shaka-bot.yaml +0 -29
  84. package/.github/workflows/update-issues.yaml +0 -31
  85. package/.github/workflows/update-screenshots.yaml +0 -142
  86. package/.github/workflows/validate-pr-title.yaml +0 -27
  87. package/CHANGELOG.md +0 -5764
  88. package/CODE_OF_CONDUCT.md +0 -93
  89. package/CONTRIBUTING.md +0 -76
  90. package/demo/TengwarTelcontar.woff2 +0 -0
  91. package/demo/app_logo_144.png +0 -0
  92. package/demo/app_logo_192.png +0 -0
  93. package/demo/app_logo_256.png +0 -0
  94. package/demo/app_logo_384.png +0 -0
  95. package/demo/app_logo_512.png +0 -0
  96. package/demo/app_manifest.json +0 -29
  97. package/demo/asset_card.js +0 -410
  98. package/demo/autoTemplate.txt +0 -61
  99. package/demo/cast_receiver/idle1.jpg +0 -0
  100. package/demo/cast_receiver/idle2.jpg +0 -0
  101. package/demo/cast_receiver/idle3.jpg +0 -0
  102. package/demo/cast_receiver/index.html +0 -75
  103. package/demo/cast_receiver/receiver_app.css +0 -111
  104. package/demo/cast_receiver/receiver_app.js +0 -158
  105. package/demo/close_button.js +0 -60
  106. package/demo/common/asset.js +0 -511
  107. package/demo/common/assets.js +0 -1635
  108. package/demo/config.js +0 -859
  109. package/demo/custom.js +0 -907
  110. package/demo/customWarning.txt +0 -8
  111. package/demo/demo.less +0 -591
  112. package/demo/demo_uncompiled.js +0 -11
  113. package/demo/demo_utils.js +0 -113
  114. package/demo/favicon.ico +0 -0
  115. package/demo/front.js +0 -156
  116. package/demo/icons/README.md +0 -4
  117. package/demo/icons/baseline-audiotrack-24px.svg +0 -1
  118. package/demo/icons/baseline-closed_caption-24px.svg +0 -1
  119. package/demo/icons/baseline-fast_forward-24px.svg +0 -1
  120. package/demo/icons/baseline-language-24px.svg +0 -1
  121. package/demo/icons/baseline-live_tv-24px.svg +0 -1
  122. package/demo/icons/baseline-subtitles-24px.svg +0 -1
  123. package/demo/icons/baseline-surround_sound-24px.svg +0 -1
  124. package/demo/icons/custom_ad.svg +0 -1
  125. package/demo/icons/custom_box_with_text.svg +0 -1
  126. package/demo/icons/custom_clear_key.svg +0 -1
  127. package/demo/icons/custom_high_definition.svg +0 -1
  128. package/demo/icons/custom_playready.svg +0 -1
  129. package/demo/icons/custom_ultra_high_definition.svg +0 -1
  130. package/demo/icons/custom_widevine.svg +0 -1
  131. package/demo/index.html +0 -173
  132. package/demo/input.js +0 -270
  133. package/demo/input_container.js +0 -218
  134. package/demo/load.js +0 -156
  135. package/demo/main.js +0 -1854
  136. package/demo/search.js +0 -452
  137. package/demo/service_worker.js +0 -355
  138. package/demo/shaka_logo_trans.png +0 -0
  139. package/demo/tooltip.js +0 -29
  140. package/demo/visualizer.js +0 -335
  141. package/demo/visualizer_button.js +0 -84
  142. package/dist/demo.compiled.debug.js +0 -340
  143. package/dist/demo.compiled.debug.map +0 -8
  144. package/dist/demo.compiled.js +0 -340
  145. package/dist/demo.compiled.map +0 -8
  146. package/dist/demo.css +0 -6
  147. package/dist/demo.css.map +0 -1
  148. package/dist/receiver.compiled.debug.js +0 -187
  149. package/dist/receiver.compiled.debug.map +0 -8
  150. package/dist/receiver.compiled.js +0 -187
  151. package/dist/receiver.compiled.map +0 -8
  152. package/docs/announcement-list-join-group.png +0 -0
  153. package/docs/api-mainpage.md +0 -28
  154. package/docs/design/REDESIGN.md +0 -283
  155. package/docs/design/architecture.md +0 -13
  156. package/docs/design/bg-fetch-after.gv +0 -29
  157. package/docs/design/bg-fetch-after.gv.png +0 -0
  158. package/docs/design/bg-fetch-before.gv +0 -18
  159. package/docs/design/bg-fetch-before.gv.png +0 -0
  160. package/docs/design/bg-fetch.md +0 -134
  161. package/docs/design/cast.gv +0 -35
  162. package/docs/design/cast.gv.png +0 -0
  163. package/docs/design/chromecast.md +0 -151
  164. package/docs/design/codec_preferences.md +0 -158
  165. package/docs/design/dash-audio-channels.md +0 -123
  166. package/docs/design/dash-manifests.md +0 -248
  167. package/docs/design/dash-timeline.svg +0 -4
  168. package/docs/design/dataflow.gv +0 -66
  169. package/docs/design/dataflow.gv.png +0 -0
  170. package/docs/design/export.md +0 -70
  171. package/docs/design/fuzzy-locale-matching.md +0 -40
  172. package/docs/design/gap-jumping.md +0 -151
  173. package/docs/design/lcevc-architecture.png +0 -0
  174. package/docs/design/lcevc-demo.png +0 -0
  175. package/docs/design/lcevc-integration.md +0 -72
  176. package/docs/design/locale_compatibility.svg +0 -1
  177. package/docs/design/locales_tree.svg +0 -1
  178. package/docs/design/localization-design-principles.md +0 -158
  179. package/docs/design/newdemo.gv +0 -83
  180. package/docs/design/newdemo.gv.png +0 -0
  181. package/docs/design/offline.gv +0 -43
  182. package/docs/design/offline.gv.png +0 -0
  183. package/docs/design/offline.md +0 -153
  184. package/docs/design/ownership.gv +0 -76
  185. package/docs/design/ownership.gv.png +0 -0
  186. package/docs/design/preload.md +0 -299
  187. package/docs/design/preload.png +0 -0
  188. package/docs/design/talking-about-languages.md +0 -46
  189. package/docs/design/timeline.svg +0 -152
  190. package/docs/design/ui.md +0 -31
  191. package/docs/design/ui_player_relationships.svg +0 -1
  192. package/docs/jsdoc-plugin.js +0 -74
  193. package/docs/jsdoc-template/README.md +0 -1
  194. package/docs/jsdoc-template/publish.js +0 -879
  195. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.eot +0 -0
  196. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.svg +0 -1830
  197. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.woff +0 -0
  198. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  199. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.svg +0 -1830
  200. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  201. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.eot +0 -0
  202. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.svg +0 -1830
  203. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.woff +0 -0
  204. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.eot +0 -0
  205. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.svg +0 -1831
  206. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.woff +0 -0
  207. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  208. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.svg +0 -1835
  209. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  210. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.eot +0 -0
  211. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.svg +0 -1831
  212. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.woff +0 -0
  213. package/docs/jsdoc-template/static/scripts/linenumber.js +0 -44
  214. package/docs/jsdoc-template/static/scripts/show-widget.js +0 -55
  215. package/docs/jsdoc-template/static/styles/jsdoc-default.css +0 -438
  216. package/docs/jsdoc-template/tmpl/augments.tmpl +0 -10
  217. package/docs/jsdoc-template/tmpl/container.tmpl +0 -205
  218. package/docs/jsdoc-template/tmpl/details.tmpl +0 -152
  219. package/docs/jsdoc-template/tmpl/example.tmpl +0 -2
  220. package/docs/jsdoc-template/tmpl/examples.tmpl +0 -13
  221. package/docs/jsdoc-template/tmpl/exceptions.tmpl +0 -32
  222. package/docs/jsdoc-template/tmpl/layout.tmpl +0 -50
  223. package/docs/jsdoc-template/tmpl/mainpage.tmpl +0 -14
  224. package/docs/jsdoc-template/tmpl/members.tmpl +0 -47
  225. package/docs/jsdoc-template/tmpl/method.tmpl +0 -140
  226. package/docs/jsdoc-template/tmpl/modifies.tmpl +0 -14
  227. package/docs/jsdoc-template/tmpl/params.tmpl +0 -131
  228. package/docs/jsdoc-template/tmpl/properties.tmpl +0 -125
  229. package/docs/jsdoc-template/tmpl/returns.tmpl +0 -19
  230. package/docs/jsdoc-template/tmpl/source.tmpl +0 -8
  231. package/docs/jsdoc-template/tmpl/tutorial.tmpl +0 -21
  232. package/docs/jsdoc-template/tmpl/type.tmpl +0 -7
  233. package/docs/jsdoc.conf.json +0 -38
  234. package/docs/shaka-player-logo.png +0 -0
  235. package/docs/style.md +0 -174
  236. package/docs/tutorials/a11y.md +0 -64
  237. package/docs/tutorials/ad_monetization.md +0 -292
  238. package/docs/tutorials/application-level-redirects.md +0 -94
  239. package/docs/tutorials/architecture.md +0 -32
  240. package/docs/tutorials/basic-usage.md +0 -89
  241. package/docs/tutorials/blob-url.md +0 -15
  242. package/docs/tutorials/config.md +0 -148
  243. package/docs/tutorials/debugging.md +0 -189
  244. package/docs/tutorials/drm-config.md +0 -274
  245. package/docs/tutorials/errors.md +0 -95
  246. package/docs/tutorials/fairplay.md +0 -242
  247. package/docs/tutorials/faq.md +0 -252
  248. package/docs/tutorials/index.json +0 -29
  249. package/docs/tutorials/lcevc.md +0 -118
  250. package/docs/tutorials/license-server-auth.md +0 -248
  251. package/docs/tutorials/license-wrapping.md +0 -168
  252. package/docs/tutorials/manifest-parser.md +0 -365
  253. package/docs/tutorials/network-and-buffering-config.md +0 -119
  254. package/docs/tutorials/offline.md +0 -683
  255. package/docs/tutorials/plugins.md +0 -184
  256. package/docs/tutorials/selenium-grid-config.md +0 -174
  257. package/docs/tutorials/service-worker.md +0 -106
  258. package/docs/tutorials/ui-customization.md +0 -288
  259. package/docs/tutorials/ui.md +0 -230
  260. package/docs/tutorials/upgrade-manifest.md +0 -281
  261. package/docs/tutorials/upgrade.md +0 -104
  262. package/docs/tutorials/welcome.md +0 -108
  263. package/docs/tutorials/widevine-service-certs.md +0 -45
  264. package/karma.conf.js +0 -879
  265. package/maintained-branches.md +0 -15
  266. package/roadmap.md +0 -186
  267. package/test/abr/simple_abr_manager_unit.js +0 -398
  268. package/test/ads/ad_manager_unit.js +0 -260
  269. package/test/assumptions/uint8_array_unit.js +0 -22
  270. package/test/cast/cast_proxy_unit.js +0 -736
  271. package/test/cast/cast_receiver_integration.js +0 -488
  272. package/test/cast/cast_receiver_unit.js +0 -1183
  273. package/test/cast/cast_sender_unit.js +0 -973
  274. package/test/cast/cast_utils_unit.js +0 -311
  275. package/test/cea/cea608_memory_unit.js +0 -411
  276. package/test/cea/cea708_service_unit.js +0 -674
  277. package/test/cea/cea708_window_unit.js +0 -373
  278. package/test/cea/cea_decoder_unit.js +0 -615
  279. package/test/cea/dtvcc_packet_builder_unit.js +0 -158
  280. package/test/cea/dtvcc_packet_unit.js +0 -60
  281. package/test/cea/mp4_cea_parser_unit.js +0 -127
  282. package/test/codec_switching/codec_switching_integration.js +0 -182
  283. package/test/dash/dash_parser_content_protection_unit.js +0 -998
  284. package/test/dash/dash_parser_integration.js +0 -74
  285. package/test/dash/dash_parser_live_unit.js +0 -1542
  286. package/test/dash/dash_parser_manifest_unit.js +0 -3121
  287. package/test/dash/dash_parser_segment_base_unit.js +0 -421
  288. package/test/dash/dash_parser_segment_list_unit.js +0 -380
  289. package/test/dash/dash_parser_segment_template_unit.js +0 -910
  290. package/test/dash/mpd_utils_unit.js +0 -794
  291. package/test/demo/demo_unit.js +0 -108
  292. package/test/deprecate/enforcer_unit.js +0 -74
  293. package/test/deprecate/version_unit.js +0 -57
  294. package/test/hls/hls_live_unit.js +0 -1330
  295. package/test/hls/hls_parser_unit.js +0 -5276
  296. package/test/hls/manifest_text_parser_unit.js +0 -545
  297. package/test/media/adaptation_set_criteria_unit.js +0 -806
  298. package/test/media/adaptation_set_unit.js +0 -229
  299. package/test/media/buffering_observer_unit.js +0 -143
  300. package/test/media/closed_caption_parser_unit.js +0 -18
  301. package/test/media/content_workarounds_unit.js +0 -43
  302. package/test/media/drm_engine_integration.js +0 -356
  303. package/test/media/drm_engine_unit.js +0 -2778
  304. package/test/media/media_source_engine_integration.js +0 -691
  305. package/test/media/media_source_engine_unit.js +0 -1512
  306. package/test/media/mp4_segment_index_parser_unit.js +0 -80
  307. package/test/media/play_rate_controller_unit.js +0 -69
  308. package/test/media/playhead_unit.js +0 -1394
  309. package/test/media/presentation_timeline_unit.js +0 -477
  310. package/test/media/quality_observer_unit.js +0 -138
  311. package/test/media/region_observer_unit.js +0 -374
  312. package/test/media/region_timeline_unit.js +0 -139
  313. package/test/media/segment_index_unit.js +0 -1080
  314. package/test/media/segment_prefetch_unit.js +0 -243
  315. package/test/media/segment_reference_unit.js +0 -63
  316. package/test/media/stall_detector_unit.js +0 -184
  317. package/test/media/streaming_engine_integration.js +0 -632
  318. package/test/media/streaming_engine_unit.js +0 -4211
  319. package/test/media/time_ranges_utils_unit.js +0 -123
  320. package/test/media/webm_segment_index_parser_unit.js +0 -90
  321. package/test/mss/mss_parser_content_protection_unit.js +0 -49
  322. package/test/mss/mss_parser_unit.js +0 -474
  323. package/test/mss/mss_player_integration.js +0 -124
  324. package/test/net/data_uri_plugin_unit.js +0 -105
  325. package/test/net/http_plugin_unit.js +0 -439
  326. package/test/net/networking_engine_unit.js +0 -1236
  327. package/test/net/networking_utils_unit.js +0 -37
  328. package/test/offline/download_progress_estimator_unit.js +0 -90
  329. package/test/offline/indexeddb_storage_unit.js +0 -192
  330. package/test/offline/manifest_convert_unit.js +0 -622
  331. package/test/offline/offline_integration.js +0 -168
  332. package/test/offline/offline_manifest_parser_unit.js +0 -231
  333. package/test/offline/offline_scheme_unit.js +0 -154
  334. package/test/offline/offline_uri_unit.js +0 -59
  335. package/test/offline/storage_compatibility_unit.js +0 -344
  336. package/test/offline/storage_integration.js +0 -1858
  337. package/test/player_external.js +0 -237
  338. package/test/player_integration.js +0 -1371
  339. package/test/player_load_graph_integration.js +0 -865
  340. package/test/player_src_equals_external.js +0 -154
  341. package/test/player_src_equals_integration.js +0 -527
  342. package/test/player_unit.js +0 -4434
  343. package/test/polyfill/media_capabilities_unit.js +0 -277
  344. package/test/polyfill/patchedmediakeys_apple_unit.js +0 -130
  345. package/test/test/assets/3675/chunk-stream0-00001.m4s +0 -0
  346. package/test/test/assets/3675/chunk-stream0-00002.m4s +0 -0
  347. package/test/test/assets/3675/chunk-stream0-00003.m4s +0 -0
  348. package/test/test/assets/3675/chunk-stream0-00004.m4s +0 -0
  349. package/test/test/assets/3675/chunk-stream0-00005.m4s +0 -0
  350. package/test/test/assets/3675/chunk-stream0-00006.m4s +0 -0
  351. package/test/test/assets/3675/chunk-stream0-00007.m4s +0 -0
  352. package/test/test/assets/3675/dash_0.mpd +0 -30
  353. package/test/test/assets/3675/dash_1.mpd +0 -30
  354. package/test/test/assets/3675/dash_2.mpd +0 -30
  355. package/test/test/assets/3675/dash_3.mpd +0 -30
  356. package/test/test/assets/3675/dash_4.mpd +0 -30
  357. package/test/test/assets/3675/dash_5.mpd +0 -26
  358. package/test/test/assets/3675/init-stream0.m4s +0 -0
  359. package/test/test/assets/audio-xhe-aac.mp4 +0 -0
  360. package/test/test/assets/audio.ts +0 -0
  361. package/test/test/assets/captions-test.ts +0 -0
  362. package/test/test/assets/cea-init.mp4 +0 -0
  363. package/test/test/assets/cea-segment.mp4 +0 -0
  364. package/test/test/assets/chapters.srt +0 -11
  365. package/test/test/assets/chapters.vtt +0 -10
  366. package/test/test/assets/chapters2.vtt +0 -10
  367. package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
  368. package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
  369. package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
  370. package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
  371. package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
  372. package/test/test/assets/dash-aes-128/dash.mpd +0 -18
  373. package/test/test/assets/dash-aes-128/license +0 -1
  374. package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
  375. package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
  376. package/test/test/assets/dash-multi-codec/dash.mpd +0 -32
  377. package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
  378. package/test/test/assets/db-dump-v1.json +0 -1
  379. package/test/test/assets/db-dump-v2-broken.json +0 -1
  380. package/test/test/assets/db-dump-v2-clean.json +0 -1
  381. package/test/test/assets/db-dump-v3.json +0 -1
  382. package/test/test/assets/db-dump-v4-broken.json +0 -1
  383. package/test/test/assets/db-dump-v5.json +0 -1
  384. package/test/test/assets/empty_caption_video_init.mp4 +0 -0
  385. package/test/test/assets/empty_caption_video_segment.mp4 +0 -0
  386. package/test/test/assets/encrypted-sintel-audio-init.mp4 +0 -0
  387. package/test/test/assets/encrypted-sintel-audio-segment.mp4 +0 -0
  388. package/test/test/assets/encrypted-sintel-video-init.mp4 +0 -0
  389. package/test/test/assets/encrypted-sintel-video-segment.mp4 +0 -0
  390. package/test/test/assets/green-pixel.mp4 +0 -0
  391. package/test/test/assets/green-pixel.txt +0 -15
  392. package/test/test/assets/h265-cea-init.mp4 +0 -0
  393. package/test/test/assets/h265-cea-segment.mp4 +0 -0
  394. package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
  395. package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
  396. package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
  397. package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
  398. package/test/test/assets/hls-raw-aac/manifest.m3u8 +0 -4
  399. package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +0 -14
  400. package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
  401. package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
  402. package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
  403. package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
  404. package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
  405. package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
  406. package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
  407. package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
  408. package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +0 -31
  409. package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
  410. package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
  411. package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
  412. package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
  413. package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
  414. package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
  415. package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
  416. package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
  417. package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +0 -31
  418. package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +0 -13
  419. package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
  420. package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
  421. package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
  422. package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
  423. package/test/test/assets/hls-raw-mp3/playlist.m3u8 +0 -4
  424. package/test/test/assets/hls-ts-aac/playlist.m3u8 +0 -23
  425. package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
  426. package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
  427. package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
  428. package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
  429. package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
  430. package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
  431. package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
  432. package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
  433. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
  434. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
  435. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
  436. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
  437. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
  438. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
  439. package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +0 -19
  440. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
  441. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
  442. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
  443. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
  444. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
  445. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
  446. package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +0 -19
  447. package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
  448. package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
  449. package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
  450. package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
  451. package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
  452. package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
  453. package/test/test/assets/hls-ts-h264/prog_index.m3u8 +0 -25
  454. package/test/test/assets/hls-ts-h265/0.ts +0 -0
  455. package/test/test/assets/hls-ts-h265/hevc.m3u8 +0 -6
  456. package/test/test/assets/hls-ts-h265/index.m3u8 +0 -7
  457. package/test/test/assets/hls-ts-mp3/manifest.m3u8 +0 -13
  458. package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
  459. package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
  460. package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
  461. package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
  462. package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +0 -17
  463. package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
  464. package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
  465. package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
  466. package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
  467. package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
  468. package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
  469. package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +0 -4
  470. package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
  471. package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
  472. package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +0 -9
  473. package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +0 -24
  474. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
  475. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
  476. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
  477. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
  478. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
  479. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
  480. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
  481. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
  482. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
  483. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
  484. package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +0 -14
  485. package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +0 -23
  486. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
  487. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
  488. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
  489. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
  490. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
  491. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
  492. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
  493. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
  494. package/test/test/assets/id3-metadata.aac +0 -0
  495. package/test/test/assets/id3-metadata.ts +0 -0
  496. package/test/test/assets/index-segment.mp4 +0 -0
  497. package/test/test/assets/index-segment.webm +0 -0
  498. package/test/test/assets/init-segment.webm +0 -0
  499. package/test/test/assets/large_file.mpd +0 -4930
  500. package/test/test/assets/multidrm-audio-init.mp4 +0 -0
  501. package/test/test/assets/multidrm-audio-segment.mp4 +0 -0
  502. package/test/test/assets/multidrm-video-init.mp4 +0 -0
  503. package/test/test/assets/multidrm-video-segment.mp4 +0 -0
  504. package/test/test/assets/multiple-trun-init.mp4 +0 -0
  505. package/test/test/assets/multiple-trun-segment.mp4 +0 -0
  506. package/test/test/assets/sintel-audio-init.mp4 +0 -0
  507. package/test/test/assets/sintel-audio-segment.mp4 +0 -0
  508. package/test/test/assets/sintel-video-init.mp4 +0 -0
  509. package/test/test/assets/sintel-video-segment.mp4 +0 -0
  510. package/test/test/assets/small.mp4 +0 -0
  511. package/test/test/assets/text-clip-alt.vtt +0 -63
  512. package/test/test/assets/text-clip.vtt +0 -63
  513. package/test/test/assets/thumbnails-sprites.vtt +0 -10
  514. package/test/test/assets/thumbnails.vtt +0 -10
  515. package/test/test/assets/ttml-init.mp4 +0 -0
  516. package/test/test/assets/ttml-segment-multiplemdat.mp4 +0 -0
  517. package/test/test/assets/ttml-segment.mp4 +0 -0
  518. package/test/test/assets/video.ts +0 -0
  519. package/test/test/assets/vtt-init.mp4 +0 -0
  520. package/test/test/assets/vtt-segment-multi-payload.mp4 +0 -0
  521. package/test/test/assets/vtt-segment-no-duration.mp4 +0 -0
  522. package/test/test/assets/vtt-segment-settings.mp4 +0 -0
  523. package/test/test/assets/vtt-segment.mp4 +0 -0
  524. package/test/test/boot.js +0 -495
  525. package/test/test/externs/filters.js +0 -44
  526. package/test/test/externs/fontfaceonload.js +0 -29
  527. package/test/test/externs/jasmine.js +0 -670
  528. package/test/test/externs/karma.js +0 -26
  529. package/test/test/externs/require.js +0 -21
  530. package/test/test/externs/sprintf.js +0 -18
  531. package/test/test/namespace.js +0 -10
  532. package/test/test/util/canned_idb.js +0 -379
  533. package/test/test/util/cea_utils.js +0 -60
  534. package/test/test/util/dash_parser_util.js +0 -329
  535. package/test/test/util/fake_ad.js +0 -321
  536. package/test/test/util/fake_ad_manager.js +0 -122
  537. package/test/test/util/fake_demo_main.js +0 -144
  538. package/test/test/util/fake_drm_engine.js +0 -103
  539. package/test/test/util/fake_media_source_engine.js +0 -464
  540. package/test/test/util/fake_networking_engine.js +0 -381
  541. package/test/test/util/fake_segment_prefetch.js +0 -84
  542. package/test/test/util/fake_text_displayer.js +0 -60
  543. package/test/test/util/id3_generator.js +0 -100
  544. package/test/test/util/indexeddb_utils.js +0 -124
  545. package/test/test/util/jasmine_fetch.js +0 -382
  546. package/test/test/util/layout_tests.js +0 -434
  547. package/test/test/util/loader.js +0 -88
  548. package/test/test/util/manifest_generator.js +0 -705
  549. package/test/test/util/manifest_parser_util.js +0 -101
  550. package/test/test/util/mss_parser_util.js +0 -119
  551. package/test/test/util/offline_utils.js +0 -105
  552. package/test/test/util/simple_fakes.js +0 -535
  553. package/test/test/util/stream_generator.js +0 -676
  554. package/test/test/util/streaming_engine_util.js +0 -506
  555. package/test/test/util/test_scheme.js +0 -778
  556. package/test/test/util/ttml_utils.js +0 -77
  557. package/test/test/util/ui_utils.js +0 -183
  558. package/test/test/util/util.js +0 -374
  559. package/test/test/util/waiter.js +0 -406
  560. package/test/text/cue_integration.js +0 -51
  561. package/test/text/lrc_text_parser_unit.js +0 -98
  562. package/test/text/mp4_ttml_parser_unit.js +0 -171
  563. package/test/text/mp4_vtt_parser_unit.js +0 -195
  564. package/test/text/sbv_text_parser_unit.js +0 -81
  565. package/test/text/simple_text_displayer_unit.js +0 -468
  566. package/test/text/srt_text_parser_unit.js +0 -163
  567. package/test/text/ssa_text_parser_unit.js +0 -382
  568. package/test/text/text_displayer_layout_unit.js +0 -323
  569. package/test/text/text_engine_unit.js +0 -500
  570. package/test/text/text_track_integration.js +0 -186
  571. package/test/text/ttml_text_parser_unit.js +0 -2176
  572. package/test/text/ui_text_displayer_unit.js +0 -608
  573. package/test/text/vtt_text_parser_unit.js +0 -1363
  574. package/test/text/web_vtt_generator_unit.js +0 -144
  575. package/test/text/web_vtt_layout_integration.js +0 -524
  576. package/test/transmuxer/transmuxer_engine_integration.js +0 -69
  577. package/test/transmuxer/transmuxer_integration.js +0 -443
  578. package/test/ui/ad_ui_unit.js +0 -369
  579. package/test/ui/localization_unit.js +0 -508
  580. package/test/ui/ui_customization_unit.js +0 -208
  581. package/test/ui/ui_integration.js +0 -669
  582. package/test/ui/ui_unit.js +0 -902
  583. package/test/util/abortable_operation_unit.js +0 -624
  584. package/test/util/array_utils_unit.js +0 -58
  585. package/test/util/buffer_utils_unit.js +0 -185
  586. package/test/util/cmcd_manager_unit.js +0 -440
  587. package/test/util/content_steering_manager_unit.js +0 -427
  588. package/test/util/data_view_reader_unit.js +0 -254
  589. package/test/util/ebml_parser_unit.js +0 -297
  590. package/test/util/event_manager_unit.js +0 -185
  591. package/test/util/fake_event_target_unit.js +0 -123
  592. package/test/util/id3_utils_unit.js +0 -168
  593. package/test/util/iterables_unit.js +0 -68
  594. package/test/util/language_utils_unit.js +0 -240
  595. package/test/util/manifest_parser_utils_unit.js +0 -55
  596. package/test/util/mime_utils_unit.js +0 -64
  597. package/test/util/mp4_box_parsers_unit.js +0 -246
  598. package/test/util/mp4_parser_unit.js +0 -373
  599. package/test/util/multi_map_unit.js +0 -94
  600. package/test/util/object_utils_unit.js +0 -79
  601. package/test/util/periods_unit.js +0 -1623
  602. package/test/util/pssh_unit.js +0 -226
  603. package/test/util/state_history_unit.js +0 -101
  604. package/test/util/stream_utils_unit.js +0 -1068
  605. package/test/util/string_utils_unit.js +0 -166
  606. package/test/util/text_parser_unit.js +0 -165
  607. package/test/util/ts_parser_unit.js +0 -77
  608. package/test/util/xml_utils_unit.js +0 -444
@@ -1,1371 +0,0 @@
1
- /*! @license
2
- * Shaka Player
3
- * Copyright 2016 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- describe('Player', () => {
8
- /** @type {!jasmine.Spy} */
9
- let onErrorSpy;
10
-
11
- /** @type {!HTMLVideoElement} */
12
- let video;
13
- /** @type {!shaka.Player} */
14
- let player;
15
- /** @type {!shaka.util.EventManager} */
16
- let eventManager;
17
-
18
- let compiledShaka;
19
-
20
- /** @type {shaka.test.Waiter} */
21
- let waiter;
22
-
23
- const Util = shaka.test.Util;
24
-
25
- beforeAll(async () => {
26
- video = shaka.test.UiUtils.createVideoElement();
27
- document.body.appendChild(video);
28
-
29
- compiledShaka =
30
- await shaka.test.Loader.loadShaka(getClientArg('uncompiled'));
31
- });
32
-
33
- beforeEach(async () => {
34
- await shaka.test.TestScheme.createManifests(compiledShaka, '_compiled');
35
- player = new compiledShaka.Player();
36
- await player.attach(video);
37
-
38
- // Disable stall detection, which can interfere with playback tests.
39
- player.configure('streaming.stallEnabled', false);
40
-
41
- // Grab event manager from the uncompiled library:
42
- eventManager = new shaka.util.EventManager();
43
- waiter = new shaka.test.Waiter(eventManager);
44
- waiter.setPlayer(player);
45
-
46
- onErrorSpy = jasmine.createSpy('onError');
47
- onErrorSpy.and.callFake((event) => {
48
- fail(event.detail);
49
- });
50
- eventManager.listen(player, 'error', Util.spyFunc(onErrorSpy));
51
- });
52
-
53
- afterEach(async () => {
54
- eventManager.release();
55
-
56
- await player.destroy();
57
- player.releaseAllMutexes();
58
- });
59
-
60
- afterAll(() => {
61
- document.body.removeChild(video);
62
- });
63
-
64
- describe('attach', () => {
65
- beforeEach(async () => {
66
- // To test attach, we want to construct a player without a video element
67
- // attached in advance. To do that, we destroy the player that was
68
- // constructed in the outermost beforeEach(), then construct a new one
69
- // without a video element.
70
- await player.destroy();
71
- player = new compiledShaka.Player();
72
- });
73
-
74
- it('can be used before load()', async () => {
75
- await player.attach(video);
76
- await player.load('test:sintel_compiled');
77
- });
78
- }); // describe('attach')
79
-
80
- describe('destroy', () => {
81
- // Regression test for:
82
- // https://github.com/shaka-project/shaka-player/issues/4850
83
- it('does not leave any lingering timers', async () => {
84
- shaka.util.Timer.activeTimers.clear();
85
-
86
- // Unlike the other tests in this file, this uses an uncompiled build of
87
- // Shaka, so that we don't need to expose shaka.util.Timer.activeTimers.
88
- player = new shaka.Player();
89
- await player.attach(video);
90
-
91
- // Disable stall detection, which can interfere with playback tests.
92
- player.configure('streaming.stallEnabled', false);
93
-
94
- waiter.setPlayer(player);
95
-
96
- // Play the video for a little while.
97
- await player.load('test:sintel');
98
- await video.play();
99
- await waiter.waitUntilPlayheadReachesOrFailOnTimeout(video, 1, 10);
100
-
101
- // Destroy the player.
102
- await player.destroy();
103
-
104
- // Are there any timers left?
105
- for (const timer of shaka.util.Timer.activeTimers.keys()) {
106
- const stackTrace = shaka.util.Timer.activeTimers.get(timer);
107
- fail('Lingering timer exists! Stack trace of creation: ' + stackTrace);
108
- }
109
- });
110
- });
111
-
112
- describe('updateStartTime() in manifestparsed event handler', () => {
113
- it('does not get segments prior to startTime', async () => {
114
- player.addEventListener('manifestparsed', () => {
115
- player.updateStartTime(24);
116
- });
117
- const results = {
118
- requestedVideoSegment0: false,
119
- requestedVideoSegment1: false,
120
- requestedVideoSegment2: false,
121
- };
122
- const expected = {
123
- requestedVideoSegment0: false,
124
- requestedVideoSegment1: false,
125
- requestedVideoSegment2: true,
126
- };
127
- player.getNetworkingEngine().registerRequestFilter(
128
- (type, request) => {
129
- if (request.uris[0] == 'test:sintel/video/0') {
130
- results.requestedVideoSegment0 = true;
131
- }
132
- if (request.uris[0] == 'test:sintel/video/1') {
133
- results.requestedVideoSegment1 = true;
134
- }
135
- if (request.uris[0] == 'test:sintel/video/2') {
136
- results.requestedVideoSegment2 = true;
137
- }
138
- });
139
- await player.load('test:sintel_compiled');
140
- await video.play();
141
- await waiter.waitUntilPlayheadReachesOrFailOnTimeout(video, 25, 30);
142
- expect(results).toEqual(expected);
143
- });
144
- });
145
-
146
-
147
- describe('getStats', () => {
148
- it('gives stats about current stream', async () => {
149
- // This is tested more in player_unit.js. This is here to test the public
150
- // API and to check for renaming.
151
- await player.load('test:sintel_compiled');
152
- await video.play();
153
- await waiter.waitUntilPlayheadReachesOrFailOnTimeout(video, 1, 10);
154
-
155
- const stats = player.getStats();
156
- const expected = {
157
- width: jasmine.any(Number),
158
- height: jasmine.any(Number),
159
- streamBandwidth: jasmine.any(Number),
160
-
161
- decodedFrames: jasmine.any(Number),
162
- droppedFrames: jasmine.any(Number),
163
- corruptedFrames: jasmine.any(Number),
164
- estimatedBandwidth: jasmine.any(Number),
165
-
166
- gapsJumped: jasmine.any(Number),
167
- stallsDetected: jasmine.any(Number),
168
-
169
- completionPercent: jasmine.any(Number),
170
- loadLatency: jasmine.any(Number),
171
- manifestTimeSeconds: jasmine.any(Number),
172
- drmTimeSeconds: jasmine.any(Number),
173
- playTime: jasmine.any(Number),
174
- pauseTime: jasmine.any(Number),
175
- bufferingTime: jasmine.any(Number),
176
- licenseTime: jasmine.any(Number),
177
- liveLatency: jasmine.any(Number),
178
-
179
- maxSegmentDuration: jasmine.any(Number),
180
-
181
- // We should have loaded the first Period by now, so we should have a
182
- // history.
183
- switchHistory: jasmine.arrayContaining([{
184
- timestamp: jasmine.any(Number),
185
- id: jasmine.any(Number),
186
- type: 'variant',
187
- fromAdaptation: true,
188
- bandwidth: 0,
189
- }]),
190
-
191
- stateHistory: jasmine.arrayContaining([{
192
- state: 'playing',
193
- timestamp: jasmine.any(Number),
194
- duration: jasmine.any(Number),
195
- }]),
196
- };
197
- expect(stats).toEqual(expected);
198
- });
199
-
200
- // Regression test for Issue #968 where trying to get the stats before
201
- // calling load would fail because not all components had been initialized.
202
- it('can get stats before loading content', async () => {
203
- // Destroy Player created in beforeEach.
204
- await player.destroy();
205
-
206
- // We are opting not to initialize the player with a video element so that
207
- // it is in the least loaded state possible.
208
- player = new compiledShaka.Player();
209
-
210
- const stats = player.getStats();
211
- expect(stats).toBeTruthy();
212
- await player.destroy();
213
- });
214
- }); // describe('getStats')
215
-
216
- describe('setTextTrackVisibility', () => {
217
- // Using mode='disabled' on TextTrack causes cues to go null, which leads
218
- // to a crash in TextEngine. This validates that we do not trigger this
219
- // behavior when changing visibility of text.
220
-
221
- it('does not cause cues to be null', async () => {
222
- await player.load('test:sintel_compiled');
223
- await video.play();
224
- await waiter.waitUntilPlayheadReachesOrFailOnTimeout(video, 1, 10);
225
-
226
- // This TextTrack was created as part of load() when we set up the
227
- // TextDisplayer.
228
- const textTrack = video.textTracks[0];
229
- expect(textTrack).not.toBe(null);
230
-
231
- if (textTrack) {
232
- // This should not be null initially.
233
- expect(textTrack.cues).not.toBe(null);
234
-
235
- await player.setTextTrackVisibility(true);
236
- // This should definitely not be null when visible.
237
- expect(textTrack.cues).not.toBe(null);
238
-
239
- await player.setTextTrackVisibility(false);
240
- // This should not transition to null when invisible.
241
- expect(textTrack.cues).not.toBe(null);
242
- }
243
- });
244
-
245
- // Repro for https://github.com/shaka-project/shaka-player/issues/1879.
246
- it('appends cues when enabled initially', async () => {
247
- let cues = [];
248
- /** @const {!shaka.test.FakeTextDisplayer} */
249
- const displayer = new shaka.test.FakeTextDisplayer();
250
- displayer.appendSpy.and.callFake((added) => {
251
- cues = cues.concat(added);
252
- });
253
-
254
- player.configure('textDisplayFactory', () => displayer);
255
-
256
- const preferredTextLanguage = 'fa'; // The same as in the content itself
257
- player.configure({preferredTextLanguage: preferredTextLanguage});
258
-
259
- await player.load('test:sintel_realistic_compiled');
260
-
261
- // Play until a time at which the external cues would be on screen.
262
- await video.play();
263
- await waiter.waitUntilPlayheadReachesOrFailOnTimeout(video, 4, 20);
264
-
265
- expect(player.isTextTrackVisible()).toBe(true);
266
- expect(displayer.isTextVisible()).toBe(true);
267
- expect(cues.length).toBeGreaterThan(0);
268
- });
269
-
270
- it('appends cues for external text', async () => {
271
- let cues = [];
272
- /** @const {!shaka.test.FakeTextDisplayer} */
273
- const displayer = new shaka.test.FakeTextDisplayer();
274
- displayer.appendSpy.and.callFake((added) => {
275
- cues = cues.concat(added);
276
- });
277
-
278
- player.configure('textDisplayFactory', () => displayer);
279
-
280
- await player.load('test:sintel_no_text_compiled');
281
- const locationUri = new goog.Uri(location.href);
282
- const partialUri = new goog.Uri('/base/test/test/assets/text-clip.vtt');
283
- const absoluteUri = locationUri.resolve(partialUri);
284
- const newTrack = await player.addTextTrackAsync(
285
- absoluteUri.toString(), 'en', 'subtitles', 'text/vtt');
286
-
287
- expect(player.getTextTracks()).toEqual([newTrack]);
288
-
289
- player.selectTextTrack(newTrack);
290
- player.setTextTrackVisibility(true);
291
- await waiter.waitForEvent(player, 'texttrackvisibility');
292
-
293
- // Play until a time at which the external cues would be on screen.
294
- await video.play();
295
- await waiter.waitUntilPlayheadReachesOrFailOnTimeout(video, 4, 20);
296
-
297
- expect(player.isTextTrackVisible()).toBe(true);
298
- expect(displayer.isTextVisible()).toBe(true);
299
- expect(cues.length).toBeGreaterThan(0);
300
- });
301
-
302
- // https://github.com/shaka-project/shaka-player/issues/2553
303
- it('does not change the selected track', async () => {
304
- player.configure('streaming.alwaysStreamText', false);
305
- await player.load('test:forced_subs_simulation_compiled');
306
-
307
- // In this content, both text tracks have the same language and role, and
308
- // so should look identical in terms of choosing one to match a
309
- // preference. This is important to the test, so verify it first.
310
- const tracks = player.getTextTracks();
311
- expect(tracks[0].language).toBe(tracks[1].language);
312
- expect(tracks[0].roles).toEqual(tracks[1].roles);
313
-
314
- const getTracksActive = () => player.getTextTracks().map((t) => t.active);
315
-
316
- // If we choose a track first, then turn on text, the track should not
317
- // change. Try this with both tracks.
318
- player.setTextTrackVisibility(false);
319
-
320
- player.selectTextTrack(tracks[0]);
321
- expect(getTracksActive()).toEqual([true, false]);
322
- player.setTextTrackVisibility(true);
323
- expect(getTracksActive()).toEqual([true, false]);
324
-
325
- player.setTextTrackVisibility(false);
326
-
327
- player.selectTextTrack(tracks[1]);
328
- expect(getTracksActive()).toEqual([false, true]);
329
- player.setTextTrackVisibility(true);
330
- expect(getTracksActive()).toEqual([false, true]);
331
- });
332
-
333
- // https://github.com/shaka-project/shaka-player/issues/4821
334
- it('loads a single text stream', async () => {
335
- player.configure({preferredTextLanguage: 'en'});
336
- await player.load('test:sintel_no_text_compiled');
337
-
338
- // Add preferred language text track.
339
- const locationUri = new goog.Uri(location.href);
340
- const partialUri = new goog.Uri('/base/test/test/assets/text-clip.vtt');
341
- const absoluteUri = locationUri.resolve(partialUri);
342
- await player.addTextTrackAsync(
343
- absoluteUri.toString(), 'en', 'subtitles', 'text/vtt');
344
-
345
- // Add alternate language text track.
346
- // Two text tracks with same timings but different text
347
- // are necessary for test.
348
- const partialUri2 =
349
- new goog.Uri('/base/test/test/assets/text-clip-alt.vtt');
350
- const absoluteUri2 = locationUri.resolve(partialUri2);
351
- await player.addTextTrackAsync(
352
- absoluteUri2.toString(), 'fr', 'subtitles', 'text/vtt');
353
-
354
- const textTracks = player.getTextTracks();
355
- expect(textTracks.length).toBe(2);
356
- expect(textTracks[0].language).toBe('en');
357
- expect(textTracks[1].language).toBe('fr');
358
-
359
- // Enable text visibilty and immediately change language.
360
- // Only one set of cues should be active.
361
- // Cues should be of the selected language track.
362
- player.setTextTrackVisibility(true);
363
- player.selectTextLanguage('fr');
364
- video.currentTime = 5;
365
- await video.play();
366
- await waiter.waitForMovementOrFailOnTimeout(video, 10);
367
-
368
- expect(video.textTracks[0].activeCues.length).toBe(1);
369
- expect(player.getTextTracks()[1].active).toBe(true);
370
- });
371
- }); // describe('setTextTrackVisibility')
372
-
373
- describe('autoShowText', () => {
374
- async function textMatchesAudioDoesNot() {
375
- const preferredTextLanguage = 'fa'; // The same as in the content
376
- player.configure({preferredTextLanguage: preferredTextLanguage});
377
-
378
- // NOTE: This is also a regression test for #1696, in which a change to
379
- // this feature broke StreamingEngine initialization.
380
-
381
- // Now load a version of Sintel with delayed setup of video & audio
382
- // streams and wait for completion.
383
- await player.load('test:sintel_realistic_compiled');
384
- // By this point, a MediaSource error would be thrown in a repro of bug
385
- // #1696.
386
-
387
- // Make sure the content we tested with has text tracks, that the config
388
- // we used matches the text language, and that the audio language differs.
389
- // These will catch any changes to the underlying content that would
390
- // invalidate the test setup.
391
- expect(player.getTextTracks().length).not.toBe(0);
392
- const textTrack = player.getTextTracks()[0];
393
- expect(textTrack.language).toBe(preferredTextLanguage);
394
-
395
- const variantTrack = player.getVariantTracks()[0];
396
- expect(variantTrack.language).not.toBe(textTrack.language);
397
- }
398
-
399
- async function textDoesNotMatch() {
400
- const preferredTextLanguage = 'xx'; // Differs from the content
401
- player.configure({preferredTextLanguage: preferredTextLanguage});
402
-
403
- // Now load the content and wait for completion.
404
- await player.load('test:sintel_realistic_compiled');
405
-
406
- // Make sure the content we tested with has text tracks, that the config
407
- // we used does not match the text language, and that the text and audio
408
- // languages do not match each other (to keep this distinct from the next
409
- // test case). This will catch any changes to the underlying content that
410
- // would invalidate the test setup.
411
- expect(player.getTextTracks().length).not.toBe(0);
412
- const textTrack = player.getTextTracks()[0];
413
- expect(textTrack.language).not.toBe(preferredTextLanguage);
414
-
415
- const variantTrack = player.getVariantTracks()[0];
416
- expect(variantTrack.language).not.toBe(textTrack.language);
417
- }
418
-
419
- async function textAndAudioMatch() {
420
- const preferredTextLanguage = 'und'; // The same as in the content
421
- player.configure({preferredTextLanguage: preferredTextLanguage});
422
-
423
- // Now load the content and wait for completion.
424
- await player.load('test:sintel_compiled');
425
-
426
- // Make sure the content we tested with has text tracks, that the config
427
- // we used matches the content, and that the text and audio languages
428
- // match each other. This will catch any changes to the underlying
429
- // content that would invalidate the test setup.
430
- expect(player.getTextTracks().length).not.toBe(0);
431
- const textTrack = player.getTextTracks()[0];
432
- expect(textTrack.language).toBe(preferredTextLanguage);
433
-
434
- const variantTrack = player.getVariantTracks()[0];
435
- expect(variantTrack.language).toBe(textTrack.language);
436
- }
437
-
438
- describe('IF_SUBTITLES_MAY_BE_NEEDED', () => {
439
- beforeEach(() => {
440
- player.configure(
441
- 'autoShowText',
442
- shaka.config.AutoShowText.IF_SUBTITLES_MAY_BE_NEEDED);
443
- });
444
-
445
- it('enables text if text matches and audio does not', async () => {
446
- await textMatchesAudioDoesNot();
447
- expect(player.isTextTrackVisible()).toBe(true);
448
- });
449
-
450
- it('disables text if text does not match', async () => {
451
- await textDoesNotMatch();
452
- expect(player.isTextTrackVisible()).toBe(false);
453
- });
454
-
455
- it('disables text if both text and audio match', async () => {
456
- await textAndAudioMatch();
457
- expect(player.isTextTrackVisible()).toBe(false);
458
- });
459
- }); // IF_SUBTITLES_MAY_BE_NEEDED
460
-
461
- describe('IF_PREFERRED_TEXT_LANGUAGE', () => {
462
- beforeEach(() => {
463
- player.configure(
464
- 'autoShowText',
465
- shaka.config.AutoShowText.IF_PREFERRED_TEXT_LANGUAGE);
466
- });
467
-
468
- it('enables text if text matches and audio does not', async () => {
469
- await textMatchesAudioDoesNot();
470
- expect(player.isTextTrackVisible()).toBe(true);
471
- });
472
-
473
- it('disables text if text does not match', async () => {
474
- await textDoesNotMatch();
475
- expect(player.isTextTrackVisible()).toBe(false);
476
- });
477
-
478
- it('enables text if both text and audio match', async () => {
479
- await textAndAudioMatch();
480
- expect(player.isTextTrackVisible()).toBe(true);
481
- });
482
- }); // IF_PREFERRED_TEXT_LANGUAGE
483
-
484
- describe('ALWAYS', () => {
485
- beforeEach(() => {
486
- player.configure('autoShowText', shaka.config.AutoShowText.ALWAYS);
487
- });
488
-
489
- it('enables text if text matches and audio does not', async () => {
490
- await textMatchesAudioDoesNot();
491
- expect(player.isTextTrackVisible()).toBe(true);
492
- });
493
-
494
- it('enables text if text does not match', async () => {
495
- await textDoesNotMatch();
496
- expect(player.isTextTrackVisible()).toBe(true);
497
- });
498
-
499
- it('enables text if both text and audio match', async () => {
500
- await textAndAudioMatch();
501
- expect(player.isTextTrackVisible()).toBe(true);
502
- });
503
- }); // ALWAYS
504
-
505
- describe('NEVER', () => {
506
- beforeEach(() => {
507
- player.configure('autoShowText', shaka.config.AutoShowText.NEVER);
508
- });
509
-
510
- it('disables text if text matches and audio does not', async () => {
511
- await textMatchesAudioDoesNot();
512
- expect(player.isTextTrackVisible()).toBe(false);
513
- });
514
-
515
- it('disables text if text does not match', async () => {
516
- await textDoesNotMatch();
517
- expect(player.isTextTrackVisible()).toBe(false);
518
- });
519
-
520
- it('disables text if both text and audio match', async () => {
521
- await textAndAudioMatch();
522
- expect(player.isTextTrackVisible()).toBe(false);
523
- });
524
- }); // NEVER
525
- }); // AutoShowText
526
-
527
- describe('plays', () => {
528
- it('with external text tracks', async () => {
529
- await player.load('test:sintel_no_text_compiled');
530
-
531
- // For some reason, using path-absolute URLs (i.e. without the hostname)
532
- // like this doesn't work on Safari. So manually resolve the URL.
533
- const locationUri = new goog.Uri(location.href);
534
- const partialUri = new goog.Uri('/base/test/test/assets/text-clip.vtt');
535
- const absoluteUri = locationUri.resolve(partialUri);
536
- const newTrack = await player.addTextTrackAsync(
537
- absoluteUri.toString(), 'en', 'subtitles', 'text/vtt');
538
-
539
- expect(newTrack.language).toBe('en');
540
- expect(player.getTextTracks()).toEqual([newTrack]);
541
-
542
- player.selectTextTrack(newTrack);
543
- expect(player.getTextTracks()[0].active).toBe(true);
544
- });
545
-
546
- it('with cea closed captions', async () => {
547
- await player.load('test:cea-708_mp4_compiled');
548
-
549
- const textTracks = player.getTextTracks();
550
- expect(textTracks).toBeTruthy();
551
- expect(textTracks.length).toBe(1);
552
- expect(textTracks[0].language).toBe('en');
553
- });
554
-
555
- it('at higher playback rates', async () => {
556
- await player.load('test:sintel_compiled');
557
- await video.play();
558
- await waiter.waitUntilPlayheadReachesOrFailOnTimeout(video, 1, 10);
559
-
560
- // Enabling trick play should change our playback rate to the same rate.
561
- player.trickPlay(2);
562
- expect(video.playbackRate).toBe(2);
563
-
564
- // Let playback continue playing for a bit longer.
565
- await shaka.test.Util.delay(2);
566
-
567
- // Cancelling trick play should return our playback rate to normal.
568
- player.cancelTrickPlay();
569
- expect(video.playbackRate).toBe(1);
570
- });
571
-
572
- it('in sequence mode', async () => {
573
- await player.load('test:sintel_sequence_compiled');
574
- expect(player.getManifest().sequenceMode).toBe(true);
575
-
576
- // Ensure the video plays.
577
- await video.play();
578
- await waiter.timeoutAfter(20).waitUntilPlayheadReaches(video, 5);
579
-
580
- // Seek the video, and see if it can continue playing from that point.
581
- // If this is a multiple of 10, it tends to flake on Tizen with stall
582
- // detection disabled. So use 25.
583
- video.currentTime = 25;
584
-
585
- // Expect that we can then reach the end of the video.
586
- await waiter.timeoutAfter(40).waitForEnd(video);
587
- });
588
-
589
- // Regression test for #2326.
590
- //
591
- // 1. Construct an instance with a video element.
592
- // 2. Don't call or await attach().
593
- // 3. Call load() with a MIME type, which triggers a check for native
594
- // playback support.
595
- //
596
- // Note that a real playback may use a HEAD request to fetch a MIME type,
597
- // even if one is not specified in load().
598
- it('immediately after construction with MIME type', async () => {
599
- const testSchemeMimeType = 'application/x-test-manifest';
600
- await player.load('test:sintel_compiled', 0, testSchemeMimeType);
601
- await video.play();
602
- await waiter.waitUntilPlayheadReachesOrFailOnTimeout(video, 1, 10);
603
- });
604
-
605
- /**
606
- * Gets the language of the active Variant.
607
- * @return {string}
608
- */
609
- function getActiveLanguage() {
610
- const tracks = player.getVariantTracks().filter((t) => {
611
- return t.active;
612
- });
613
- expect(tracks.length).toBeGreaterThan(0);
614
- return tracks[0].language;
615
- }
616
- }); // describe('plays')
617
-
618
- describe('TextDisplayer plugin', () => {
619
- // Simulate the use of an external TextDisplayer plugin.
620
- /** @type {shaka.test.FakeTextDisplayer} */
621
- let textDisplayer;
622
- beforeEach(() => {
623
- textDisplayer = new shaka.test.FakeTextDisplayer();
624
-
625
- textDisplayer.isTextVisibleSpy.and.callFake(() => {
626
- return false;
627
- });
628
- textDisplayer.destroySpy.and.returnValue(Promise.resolve());
629
- player.configure('textDisplayFactory', () => textDisplayer);
630
-
631
- // Make sure the configuration was taken.
632
- const configuredFactory = player.getConfiguration().textDisplayFactory;
633
- const configuredTextDisplayer = configuredFactory();
634
- expect(configuredTextDisplayer).toBe(textDisplayer);
635
- });
636
-
637
- // Regression test for https://github.com/shaka-project/shaka-player/issues/1187
638
- it('does not throw on destroy', async () => {
639
- await player.load('test:sintel_compiled');
640
- await video.play();
641
- await waiter.waitUntilPlayheadReachesOrFailOnTimeout(video, 1, 10);
642
- await player.unload();
643
- // Before we fixed #1187, the call to destroy() on textDisplayer was
644
- // renamed in the compiled version and could not be called.
645
- expect(textDisplayer.destroySpy).toHaveBeenCalled();
646
- });
647
- }); // describe('TextDisplayer plugin')
648
-
649
- describe('TextAndRoles', () => {
650
- // Regression Test. Makes sure that the language and role fields have been
651
- // properly exported from the player.
652
- it('exports language and roles fields', async () => {
653
- await player.load('test:sintel_compiled');
654
- const languagesAndRoles = player.getTextLanguagesAndRoles();
655
- expect(languagesAndRoles.length).toBeTruthy();
656
- for (const languageAndRole of languagesAndRoles) {
657
- expect(languageAndRole.language).not.toBeUndefined();
658
- expect(languageAndRole.role).not.toBeUndefined();
659
- }
660
- });
661
- }); // describe('TextAndRoles')
662
-
663
- describe('streaming event', () => {
664
- // Calling switch early during load() caused a failed assertion in Player
665
- // and the track selection was ignored. Because this bug involved
666
- // interactions between Player and StreamingEngine, it is an integration
667
- // test and not a unit test.
668
- // https://github.com/shaka-project/shaka-player/issues/1119
669
- it('allows early selection of specific tracks', async () => {
670
- /** @type {!jasmine.Spy} */
671
- const streamingListener = jasmine.createSpy('listener');
672
-
673
- // Because this is an issue with failed assertions, destroy the existing
674
- // player from the compiled version, and create a new one using the
675
- // uncompiled version. Then we will get assertions.
676
- eventManager.unlisten(player, 'error');
677
- await player.destroy();
678
- player = new shaka.Player(); // NOTE: MUST BE UNCOMPILED
679
- await player.attach(video);
680
- player.configure({abr: {enabled: false}});
681
- eventManager.listen(player, 'error', Util.spyFunc(onErrorSpy));
682
-
683
- // When 'streaming' fires, select the first track explicitly.
684
- player.addEventListener('streaming', Util.spyFunc(streamingListener));
685
- streamingListener.and.callFake(() => {
686
- const tracks = player.getVariantTracks();
687
- player.selectVariantTrack(tracks[0]);
688
- });
689
-
690
- // Now load the content.
691
- await player.load('test:sintel');
692
-
693
- // When the bug triggers, we fail assertions in Player.
694
- // Make sure the listener was triggered, so that it could trigger the
695
- // code path in this bug.
696
- expect(streamingListener).toHaveBeenCalled();
697
- });
698
-
699
- // After fixing the issue above, calling switch early during a second load()
700
- // caused a failed assertion in StreamingEngine, because we did not reset
701
- // switchingPeriods_ in Player. Because this bug involved interactions
702
- // between Player and StreamingEngine, it is an integration test and not a
703
- // unit test.
704
- // https://github.com/shaka-project/shaka-player/issues/1119
705
- it('allows selection of tracks in subsequent loads', async () => {
706
- /** @type {!jasmine.Spy} */
707
- const streamingListener = jasmine.createSpy('listener');
708
-
709
- // Because this is an issue with failed assertions, destroy the existing
710
- // player from the compiled version, and create a new one using the
711
- // uncompiled version. Then we will get assertions.
712
- eventManager.unlisten(player, 'error');
713
- await player.destroy();
714
- player = new shaka.Player(); // NOTE: MUST BE UNCOMPILED
715
- await player.attach(video);
716
- player.configure({abr: {enabled: false}});
717
- eventManager.listen(player, 'error', Util.spyFunc(onErrorSpy));
718
-
719
- // This bug only triggers when you do this on the second load.
720
- // So we load one piece of content, then set up the streaming listener
721
- // to change tracks, then we load a second piece of content.
722
- await player.load('test:sintel');
723
-
724
- // Give StreamingEngine time to complete all setup and to call back into
725
- // the Player with canSwitch_. If you move on too quickly to the next
726
- // load(), the bug does not reproduce.
727
- await shaka.test.Util.delay(1);
728
-
729
- player.addEventListener('streaming', Util.spyFunc(streamingListener));
730
-
731
- streamingListener.and.callFake(() => {
732
- const track = player.getVariantTracks()[0];
733
- player.selectVariantTrack(track);
734
- });
735
-
736
- // Now load again to trigger the failed assertion.
737
- await player.load('test:sintel');
738
-
739
- // When the bug triggers, we fail assertions in StreamingEngine.
740
- // So just make sure the listener was triggered, so that it could
741
- // trigger the code path in this bug.
742
- expect(streamingListener).toHaveBeenCalled();
743
- });
744
- }); // describe('streaming event')
745
-
746
- describe('tracks', () => {
747
- // This is a regression test for b/138941217, in which tracks briefly
748
- // vanished during the loading process. On Chromecast devices, where the
749
- // timing is very different from on desktop, this could occur such that
750
- // there were no tracks after load() is resolved.
751
- // This is an integration test so that we can check the behavior of the
752
- // Player against actual platform behavior on all supported platforms.
753
- it('remain available at every stage of loading', async () => {
754
- let tracksFound = false;
755
-
756
- /**
757
- * @param {string} when When the check takes place.
758
- *
759
- * Will fail the test if tracks disappear after they first become
760
- * available.
761
- */
762
- const checkTracks = (when) => {
763
- // If tracks have already been found, expect them to still be found.
764
- const tracksNow = player.getVariantTracks().length != 0;
765
- if (tracksFound) {
766
- expect(tracksNow).withContext(when).toBe(true);
767
- } else {
768
- // If tracks are now found, they should not, at any point during
769
- // the loading process, disappear again.
770
- if (tracksNow) {
771
- tracksFound = true;
772
- }
773
- }
774
- shaka.log.debug(
775
- 'checkTracks', when,
776
- 'tracksFound=', tracksFound,
777
- 'tracksNow=', tracksNow);
778
- };
779
-
780
- /** @param {Event} event */
781
- const checkOnEvent = (event) => {
782
- checkTracks(event.type + ' event');
783
- };
784
-
785
- // On each of these events, we will notice when tracks first appear, and
786
- // verify that they never disappear at any point in the loading sequence.
787
- eventManager.listen(video, 'canplay', checkOnEvent);
788
- eventManager.listen(video, 'canplaythrough', checkOnEvent);
789
- eventManager.listen(video, 'durationchange', checkOnEvent);
790
- eventManager.listen(video, 'emptied', checkOnEvent);
791
- eventManager.listen(video, 'loadeddata', checkOnEvent);
792
- eventManager.listen(video, 'loadedmetadata', checkOnEvent);
793
- eventManager.listen(video, 'loadstart', checkOnEvent);
794
- eventManager.listen(video, 'pause', checkOnEvent);
795
- eventManager.listen(video, 'play', checkOnEvent);
796
- eventManager.listen(video, 'playing', checkOnEvent);
797
- eventManager.listen(video, 'seeked', checkOnEvent);
798
- eventManager.listen(video, 'seeking', checkOnEvent);
799
- eventManager.listen(video, 'stalled', checkOnEvent);
800
- eventManager.listen(video, 'waiting', checkOnEvent);
801
- eventManager.listen(player, 'trackschanged', checkOnEvent);
802
-
803
- const waiter = new shaka.test.Waiter(eventManager)
804
- .setPlayer(player)
805
- .timeoutAfter(10);
806
- const canPlayThrough = waiter.waitForEvent(video, 'canplaythrough');
807
-
808
- await player.load('test:sintel_compiled', 5);
809
- shaka.log.debug('load resolved');
810
-
811
- // When load is resolved(), tracks should definitely exist.
812
- expect(tracksFound).toBe(true);
813
-
814
- // Let the test keep running until we can play through. In the original
815
- // bug, tracks would disappear _after_ load() on some platforms.
816
- await canPlayThrough;
817
- });
818
- }); // describe('tracks')
819
-
820
- describe('loading', () => {
821
- // A regression test for Issue #2433.
822
- it('can load very large files', async () => {
823
- // Reset the lazy function, so that it does not remember any chunk size
824
- // that was detected beforehand.
825
- compiledShaka.util.StringUtils.resetFromCharCode();
826
- const oldFromCharCode = String.fromCharCode;
827
- try {
828
- // Replace String.fromCharCode with a version that can only handle very
829
- // small chunks.
830
- // This has to be an old-style function, to use the "arguments" object.
831
- // eslint-disable-next-line no-restricted-syntax
832
- String.fromCharCode = function() {
833
- if (arguments.length > 2000) {
834
- throw new RangeError('Synthetic Range Error');
835
- }
836
- // eslint-disable-next-line prefer-spread
837
- return oldFromCharCode.apply(null, arguments);
838
- };
839
- await player.load('/base/test/test/assets/large_file.mpd');
840
- } finally {
841
- String.fromCharCode = oldFromCharCode;
842
- }
843
- });
844
- });
845
-
846
- describe('mediaQualityChanges', () => {
847
- /** @type {!jasmine.Spy} */
848
- let onQualityChange;
849
- /** @type {!shaka.test.Waiter} */
850
- let waiter;
851
-
852
- const qualityChange1 = jasmine.objectContaining({
853
- mediaQuality: jasmine.objectContaining({
854
- bandwidth: 1,
855
- codecs: 'mp4a.40.2',
856
- contentType: 'audio',
857
- mimeType: 'audio/mp4',
858
- }),
859
- type: 'mediaqualitychanged',
860
- position: jasmine.any(Number),
861
- });
862
- const qualityChange2 = jasmine.objectContaining({
863
- mediaQuality: jasmine.objectContaining({
864
- bandwidth: 1,
865
- codecs: 'avc1.42c01e',
866
- contentType: 'video',
867
- mimeType: 'video/mp4',
868
- }),
869
- type: 'mediaqualitychanged',
870
- position: jasmine.any(Number),
871
- });
872
-
873
- beforeEach(() => {
874
- onQualityChange = jasmine.createSpy('onQualityChange');
875
- // const spyFunc = Util.spyFunc(onQualityChange);
876
- player.addEventListener('mediaqualitychanged',
877
- Util.spyFunc(onQualityChange));
878
- waiter = new shaka.test.Waiter(eventManager)
879
- .setPlayer(player)
880
- .timeoutAfter(10)
881
- .failOnTimeout(true);
882
- });
883
-
884
- it('emits audio/video quality changes at start when enabled', async () => {
885
- player.configure('streaming.observeQualityChanges', true);
886
-
887
- await player.load('test:sintel_compiled');
888
- await video.play();
889
-
890
- // Wait for the video to start playback. If it takes longer than 10
891
- // seconds, fail the test.
892
- await waiter.waitForMovementOrFailOnTimeout(video, 10);
893
- expect(onQualityChange).toHaveBeenCalledTimes(2);
894
- expect(onQualityChange).toHaveBeenCalledWith(qualityChange1);
895
- expect(onQualityChange).toHaveBeenCalledWith(qualityChange2);
896
- });
897
-
898
- it('does not emit quality changes at start when disabled', async () => {
899
- player.configure('streaming.observeQualityChanges', false);
900
-
901
- await player.load('test:sintel_compiled');
902
- await video.play();
903
-
904
- // Wait for the video to start playback. If it takes longer than 10
905
- // seconds, fail the test.
906
- await waiter.waitForMovementOrFailOnTimeout(video, 10);
907
- expect(onQualityChange).not.toHaveBeenCalled();
908
- });
909
- });
910
-
911
- describe('seek range', () => {
912
- // Regression test for Issue #3675.
913
- it('has a reasonable seek range after going from live to VOD', async () => {
914
- const netEngine = player.getNetworkingEngine();
915
- const startTime = Date.now();
916
- netEngine.registerRequestFilter((type, request) => {
917
- if (type != shaka.net.NetworkingEngine.RequestType.MANIFEST) {
918
- return;
919
- }
920
- // Simulate a live stream by providing different manifests over time.
921
- const time = (Date.now() - startTime) / 1000;
922
- const manifestNumber = Math.min(5, Math.floor(0.5 + time / 2));
923
- request.uris = [
924
- '/base/test/test/assets/3675/dash_' + manifestNumber + '.mpd',
925
- ];
926
- console.log('getting manifest', request.uris);
927
- });
928
-
929
- // Play the stream.
930
- await player.load('/base/test/test/assets/3675/dash_0.mpd');
931
- await video.play();
932
-
933
- // Wait for the stream to be over.
934
- eventManager.listen(player, 'error', Util.spyFunc(onErrorSpy));
935
- /** @type {shaka.test.Waiter} */
936
- const waiter = new shaka.test.Waiter(eventManager)
937
- .setPlayer(player)
938
- .timeoutAfter(40)
939
- .failOnTimeout(true);
940
- await waiter.waitForEnd(video);
941
-
942
- // The stream should have transitioned to VOD by now.
943
- expect(player.isLive()).toBe(false);
944
-
945
- // Check that the final seek range is as expected.
946
- const seekRange = player.seekRange();
947
- expect(seekRange.end).toBeCloseTo(14);
948
- });
949
- });
950
-
951
- describe('buffering', () => {
952
- const startBuffering = jasmine.objectContaining({buffering: true});
953
- const endBuffering = jasmine.objectContaining({buffering: false});
954
- /** @type {!jasmine.Spy} */
955
- let onBuffering;
956
- /** @type {!shaka.test.Waiter} */
957
- let waiter;
958
-
959
- beforeEach(() => {
960
- onBuffering = jasmine.createSpy('onBuffering');
961
- player.addEventListener('buffering', Util.spyFunc(onBuffering));
962
-
963
- waiter = new shaka.test.Waiter(eventManager)
964
- .setPlayer(player)
965
- .timeoutAfter(10)
966
- .failOnTimeout(true);
967
- });
968
-
969
- it('enters/exits buffering state at start', async () => {
970
- // Set a large rebuffer goal to ensure we can see the buffering before
971
- // we start playing.
972
- player.configure('streaming.rebufferingGoal', 30);
973
-
974
- await player.load('test:sintel_long_compiled');
975
- video.pause();
976
- expect(onBuffering).toHaveBeenCalledTimes(1);
977
- expect(onBuffering).toHaveBeenCalledWith(startBuffering);
978
- onBuffering.calls.reset();
979
-
980
- await waiter.waitForEvent(player, 'buffering');
981
- expect(onBuffering).toHaveBeenCalledTimes(1);
982
- expect(onBuffering).toHaveBeenCalledWith(endBuffering);
983
-
984
- expect(getBufferedAhead()).toBeGreaterThanOrEqual(30);
985
- });
986
-
987
- it('enters/exits buffering state while playing', async () => {
988
- player.configure('streaming.rebufferingGoal', 1);
989
- player.configure('streaming.bufferingGoal', 10);
990
-
991
- await player.load('test:sintel_long_compiled');
992
- video.pause();
993
- if (player.isBuffering()) {
994
- await waiter.waitForEvent(player, 'buffering');
995
- }
996
- onBuffering.calls.reset();
997
-
998
- player.configure('streaming.rebufferingGoal', 30);
999
- video.currentTime = 70;
1000
- await waiter.waitForEvent(player, 'buffering');
1001
- expect(onBuffering).toHaveBeenCalledTimes(1);
1002
- expect(onBuffering).toHaveBeenCalledWith(startBuffering);
1003
- onBuffering.calls.reset();
1004
-
1005
- expect(getBufferedAhead()).toBeLessThan(30);
1006
-
1007
- await waiter.waitForEvent(player, 'buffering');
1008
- expect(onBuffering).toHaveBeenCalledTimes(1);
1009
- expect(onBuffering).toHaveBeenCalledWith(endBuffering);
1010
-
1011
- expect(getBufferedAhead()).toBeGreaterThanOrEqual(30);
1012
- });
1013
-
1014
- it('buffers ahead of the playhead', async () => {
1015
- player.configure('streaming.bufferingGoal', 10);
1016
-
1017
- await player.load('test:sintel_long_compiled');
1018
- video.pause();
1019
- await waiter.waitUntilBuffered(video, 10);
1020
-
1021
- player.configure('streaming.bufferingGoal', 30);
1022
- await waiter.waitUntilBuffered(video, 30);
1023
-
1024
- player.configure('streaming.bufferingGoal', 60);
1025
- await waiter.waitUntilBuffered(video, 60);
1026
- await Util.delay(1);
1027
- expect(getBufferedAhead()).toBeLessThan(70); // 60 + segment_size
1028
-
1029
- // We don't remove buffered content ahead of the playhead, so seek to
1030
- // clear the buffer.
1031
- player.configure('streaming.bufferingGoal', 10);
1032
- video.currentTime = 120;
1033
- await waiter.waitUntilBuffered(video, 10);
1034
- await Util.delay(1);
1035
- expect(getBufferedAhead()).toBeLessThan(20); // 10 + segment_size
1036
- });
1037
-
1038
- it('clears buffer behind playhead', async () => {
1039
- player.configure('streaming.bufferingGoal', 30);
1040
- player.configure('streaming.bufferBehind', 30);
1041
-
1042
- await player.load('test:sintel_long_compiled');
1043
- video.pause();
1044
- await waiter.waitUntilBuffered(video, 30);
1045
- video.currentTime = 20;
1046
- await waiter.waitUntilBuffered(video, 30);
1047
-
1048
- expect(getBufferedBehind()).toBe(20); // Buffered to start still.
1049
- video.currentTime = 50;
1050
- await waiter.waitUntilBuffered(video, 30);
1051
- await Util.delay(1);
1052
- expect(getBufferedBehind()).toBeLessThan(40); // 30 + segment_size
1053
-
1054
- player.configure('streaming.bufferBehind', 10);
1055
- // We only evict content when we append a segment, so increase the
1056
- // buffering goal so we append another segment.
1057
- player.configure('streaming.bufferingGoal', 40);
1058
- await waiter.waitUntilBuffered(video, 40);
1059
- await Util.delay(1);
1060
- expect(getBufferedBehind()).toBeLessThanOrEqual(10);
1061
- });
1062
-
1063
- function getBufferedAhead() {
1064
- const end = shaka.media.TimeRangesUtils.bufferEnd(video.buffered);
1065
- if (end == null) {
1066
- return 0;
1067
- }
1068
- return end - video.currentTime;
1069
- }
1070
-
1071
- function getBufferedBehind() {
1072
- const start = shaka.media.TimeRangesUtils.bufferStart(video.buffered);
1073
- if (start == null) {
1074
- return 0;
1075
- }
1076
- return video.currentTime - start;
1077
- }
1078
- }); // describe('buffering')
1079
-
1080
- describe('configuration', () => {
1081
- it('has the correct number of arguments in compiled callbacks', () => {
1082
- // Get the default configuration for both the compiled & uncompiled
1083
- // versions for comparison.
1084
- const compiledConfig = (new compiledShaka.Player()).getConfiguration();
1085
- const uncompiledConfig = (new shaka.Player()).getConfiguration();
1086
-
1087
- compareConfigFunctions(compiledConfig, uncompiledConfig);
1088
-
1089
- /**
1090
- * Find all the callbacks in the configuration recursively and compare
1091
- * their lengths (number of arguments). We warn the app developer when a
1092
- * configured callback has the wrong number of arguments, so our own
1093
- * compiled versions must be correct.
1094
- *
1095
- * @param {Object} compiled
1096
- * @param {Object} uncompiled
1097
- * @param {string=} basePath The path to this point in the config, for
1098
- * logging purposes.
1099
- */
1100
- function compareConfigFunctions(compiled, uncompiled, basePath = '') {
1101
- for (const key in uncompiled) {
1102
- const uncompiledValue = uncompiled[key];
1103
- const compiledValue = compiled[key];
1104
- const path = basePath + '.' + key;
1105
-
1106
- if (uncompiledValue && uncompiledValue.constructor == Object) {
1107
- // This is an anonymous Object, so recurse on it.
1108
- compareConfigFunctions(compiledValue, uncompiledValue, path);
1109
- } else if (typeof uncompiledValue == 'function') {
1110
- // This is a function, so check its length. The uncompiled version
1111
- // is considered canonically correct, so we use the uncompiled
1112
- // length as the expectation.
1113
- shaka.log.debug('[' + path + ']',
1114
- compiledValue.length, 'should be', uncompiledValue.length);
1115
- expect(compiledValue.length).withContext(path)
1116
- .toBe(uncompiledValue.length);
1117
- }
1118
- }
1119
- }
1120
- });
1121
- }); // describe('configuration')
1122
-
1123
- describe('adaptation', () => {
1124
- /** @type {!shaka.test.FakeAbrManager} */
1125
- let abrManager;
1126
-
1127
- beforeEach(() => {
1128
- abrManager = new shaka.test.FakeAbrManager();
1129
- player.configure('abrFactory', () => abrManager);
1130
- });
1131
-
1132
- it('fires "adaptation" event', async () => {
1133
- const abrEnabled = new Promise((resolve) => {
1134
- abrManager.enable.and.callFake(resolve);
1135
- });
1136
-
1137
- await player.load('test:sintel_multi_lingual_multi_res_compiled');
1138
-
1139
- expect(abrManager.switchCallback).toBeTruthy();
1140
- expect(abrManager.variants.length).toBeGreaterThan(1);
1141
- expect(abrManager.chooseIndex).toBe(0);
1142
-
1143
- /** @type {shaka.test.Waiter} */
1144
- const waiter = new shaka.test.Waiter(eventManager)
1145
- .setPlayer(player)
1146
- .timeoutAfter(1)
1147
- .failOnTimeout(true);
1148
-
1149
- await waiter.waitForPromise(abrEnabled, 'AbrManager enabled');
1150
-
1151
- const p = waiter.waitForEvent(player, 'adaptation');
1152
- abrManager.switchCallback(abrManager.variants[1]);
1153
- await expectAsync(p).toBeResolved();
1154
- });
1155
-
1156
- it('doesn\'t fire "adaptation" when not changing streams', async () => {
1157
- const abrEnabled = new Promise((resolve) => {
1158
- abrManager.enable.and.callFake(resolve);
1159
- });
1160
-
1161
- await player.load('test:sintel_multi_lingual_multi_res_compiled');
1162
-
1163
- expect(abrManager.switchCallback).toBeTruthy();
1164
-
1165
- /** @type {shaka.test.Waiter} */
1166
- const waiter = new shaka.test.Waiter(eventManager)
1167
- .setPlayer(player)
1168
- .timeoutAfter(1)
1169
- .failOnTimeout(true);
1170
-
1171
- await waiter.waitForPromise(abrEnabled, 'AbrManager enabled');
1172
-
1173
- const p = waiter.waitForEvent(player, 'adaptation');
1174
- for (let i = 0; i < 3; i++) {
1175
- abrManager.switchCallback(abrManager.variants[abrManager.chooseIndex]);
1176
- }
1177
- await expectAsync(p).toBeRejected(); // Timeout
1178
- });
1179
- }); // describe('adaptation')
1180
-
1181
- /** Regression test for Issue #2741 */
1182
- describe('unloading', () => {
1183
- drmIt('unloads properly after DRM error', async () => {
1184
- const drmSupport = await shaka.media.DrmEngine.probeSupport();
1185
- if (!drmSupport['com.widevine.alpha'] &&
1186
- !drmSupport['com.microsoft.playready']) {
1187
- pending('Skipping DRM error test, only runs on Widevine and PlayReady');
1188
- }
1189
-
1190
- let unloadPromise = null;
1191
- const errorPromise = new Promise((resolve, reject) => {
1192
- onErrorSpy.and.callFake((event) => {
1193
- unloadPromise = player.unload();
1194
- onErrorSpy.and.callThrough();
1195
- resolve();
1196
- });
1197
- });
1198
-
1199
- // Load an encrypted asset with the wrong license servers, so it errors.
1200
- const bogusUrl = 'http://foo/widevine';
1201
- player.configure('drm.servers', {
1202
- 'com.widevine.alpha': bogusUrl,
1203
- 'com.microsoft.playready': bogusUrl,
1204
- });
1205
- await player.load('test:sintel-enc_compiled');
1206
-
1207
- await errorPromise;
1208
- expect(unloadPromise).not.toBeNull();
1209
- if (unloadPromise) {
1210
- await unloadPromise;
1211
- }
1212
- });
1213
- }); // describe('unloading')
1214
-
1215
- describe('addChaptersTrack', () => {
1216
- it('adds external chapters in vtt format', async () => {
1217
- await player.load('test:sintel_no_text_compiled');
1218
- const locationUri = new goog.Uri(location.href);
1219
- const partialUri1 = new goog.Uri('/base/test/test/assets/chapters.vtt');
1220
- const absoluteUri1 = locationUri.resolve(partialUri1);
1221
- await player.addChaptersTrack(absoluteUri1.toString(), 'en');
1222
-
1223
- // Data should be available as soon as addChaptersTrack resolves.
1224
- // See https://github.com/shaka-project/shaka-player/issues/4186
1225
- const chapters = player.getChapters('en');
1226
- expect(chapters.length).toBe(3);
1227
- const chapter1 = chapters[0];
1228
- expect(chapter1.title).toBe('Chapter 1');
1229
- expect(chapter1.startTime).toBe(0);
1230
- expect(chapter1.endTime).toBe(5);
1231
- const chapter2 = chapters[1];
1232
- expect(chapter2.title).toBe('Chapter 2');
1233
- expect(chapter2.startTime).toBe(5);
1234
- expect(chapter2.endTime).toBe(10);
1235
- const chapter3 = chapters[2];
1236
- expect(chapter3.title).toBe('Chapter 3');
1237
- expect(chapter3.startTime).toBe(10);
1238
- expect(chapter3.endTime).toBe(20);
1239
-
1240
- const partialUri2 = new goog.Uri('/base/test/test/assets/chapters2.vtt');
1241
- const absoluteUri2 = locationUri.resolve(partialUri2);
1242
- await player.addChaptersTrack(absoluteUri2.toString(), 'en');
1243
-
1244
- const chaptersUpdated = player.getChapters('en');
1245
- expect(chaptersUpdated.length).toBe(6);
1246
- const chapterUpdated1 = chaptersUpdated[0];
1247
- expect(chapterUpdated1.title).toBe('Chapter 1');
1248
- expect(chapterUpdated1.startTime).toBe(0);
1249
- expect(chapterUpdated1.endTime).toBe(5);
1250
- const chapterUpdated2 = chaptersUpdated[1];
1251
- expect(chapterUpdated2.title).toBe('Chapter 2');
1252
- expect(chapterUpdated2.startTime).toBe(5);
1253
- expect(chapterUpdated2.endTime).toBe(10);
1254
- const chapterUpdated3 = chaptersUpdated[2];
1255
- expect(chapterUpdated3.title).toBe('Chapter 3');
1256
- expect(chapterUpdated3.startTime).toBe(10);
1257
- expect(chapterUpdated3.endTime).toBe(20);
1258
- const chapterUpdated4 = chaptersUpdated[3];
1259
- expect(chapterUpdated4.title).toBe('Chapter 4');
1260
- expect(chapterUpdated4.startTime).toBe(20);
1261
- expect(chapterUpdated4.endTime).toBe(30);
1262
- const chapterUpdated5 = chaptersUpdated[4];
1263
- expect(chapterUpdated5.title).toBe('Chapter 5');
1264
- expect(chapterUpdated5.startTime).toBe(30);
1265
- expect(chapterUpdated5.endTime).toBe(40);
1266
- const chapterUpdated6 = chaptersUpdated[5];
1267
- expect(chapterUpdated6.title).toBe('Chapter 6');
1268
- expect(chapterUpdated6.startTime).toBe(40);
1269
- expect(chapterUpdated6.endTime).toBe(61.349);
1270
- });
1271
-
1272
- it('adds external chapters in srt format', async () => {
1273
- await player.load('test:sintel_no_text_compiled');
1274
- const locationUri = new goog.Uri(location.href);
1275
- const partialUri = new goog.Uri('/base/test/test/assets/chapters.srt');
1276
- const absoluteUri = locationUri.resolve(partialUri);
1277
- await player.addChaptersTrack(absoluteUri.toString(), 'es');
1278
-
1279
- const chapters = player.getChapters('es');
1280
- expect(chapters.length).toBe(3);
1281
- const chapter1 = chapters[0];
1282
- expect(chapter1.title).toBe('Chapter 1');
1283
- expect(chapter1.startTime).toBe(0);
1284
- expect(chapter1.endTime).toBe(5);
1285
- const chapter2 = chapters[1];
1286
- expect(chapter2.title).toBe('Chapter 2');
1287
- expect(chapter2.startTime).toBe(5);
1288
- expect(chapter2.endTime).toBe(30);
1289
- const chapter3 = chapters[2];
1290
- expect(chapter3.title).toBe('Chapter 3');
1291
- expect(chapter3.startTime).toBe(30);
1292
- expect(chapter3.endTime).toBe(61.349);
1293
- });
1294
- }); // describe('addChaptersTrack')
1295
-
1296
- it('requires a license server for HLS ClearKey content', async () => {
1297
- const expectedError = Util.jasmineError(new shaka.util.Error(
1298
- shaka.util.Error.Severity.CRITICAL,
1299
- shaka.util.Error.Category.DRM,
1300
- shaka.util.Error.Code.NO_LICENSE_SERVER_GIVEN,
1301
- 'org.w3.clearkey'));
1302
- await expectAsync(player.load('test:sintel-hls-clearkey'))
1303
- .toBeRejectedWith(expectedError);
1304
- });
1305
-
1306
- describe('addThumbnailsTrack', () => {
1307
- it('appends thumbnails for external thumbnails with sprites',
1308
- async () => {
1309
- await player.load('test:sintel_no_text_compiled');
1310
- const locationUri = new goog.Uri(location.href);
1311
- const partialUri =
1312
- new goog.Uri('/base/test/test/assets/thumbnails-sprites.vtt');
1313
- const absoluteUri = locationUri.resolve(partialUri);
1314
- const newTrack =
1315
- await player.addThumbnailsTrack(absoluteUri.toString());
1316
-
1317
- expect(player.getImageTracks()).toEqual([newTrack]);
1318
-
1319
- const thumbnail1 = await player.getThumbnails(newTrack.id, 0);
1320
- expect(thumbnail1.startTime).toBe(0);
1321
- expect(thumbnail1.duration).toBe(5);
1322
- expect(thumbnail1.height).toBe(90);
1323
- expect(thumbnail1.positionX).toBe(0);
1324
- expect(thumbnail1.positionY).toBe(0);
1325
- expect(thumbnail1.width).toBe(160);
1326
- const thumbnail2 = await player.getThumbnails(newTrack.id, 10);
1327
- expect(thumbnail2.startTime).toBe(5);
1328
- expect(thumbnail2.duration).toBe(25);
1329
- expect(thumbnail2.height).toBe(90);
1330
- expect(thumbnail2.positionX).toBe(160);
1331
- expect(thumbnail2.positionY).toBe(0);
1332
- expect(thumbnail2.width).toBe(160);
1333
- const thumbnail3 = await player.getThumbnails(newTrack.id, 40);
1334
- expect(thumbnail3.startTime).toBe(30);
1335
- expect(thumbnail3.duration).toBe(30);
1336
- expect(thumbnail3.height).toBe(90);
1337
- expect(thumbnail3.positionX).toBe(160);
1338
- expect(thumbnail3.positionY).toBe(90);
1339
- expect(thumbnail3.width).toBe(160);
1340
-
1341
- const thumbnails = await player.getAllThumbnails(newTrack.id);
1342
- expect(thumbnails.length).toBe(3);
1343
- });
1344
-
1345
- it('appends thumbnails for external thumbnails without sprites',
1346
- async () => {
1347
- await player.load('test:sintel_no_text_compiled');
1348
- const locationUri = new goog.Uri(location.href);
1349
- const partialUri =
1350
- new goog.Uri('/base/test/test/assets/thumbnails.vtt');
1351
- const absoluteUri = locationUri.resolve(partialUri);
1352
- const newTrack =
1353
- await player.addThumbnailsTrack(absoluteUri.toString());
1354
-
1355
- expect(player.getImageTracks()).toEqual([newTrack]);
1356
-
1357
- const thumbnail1 = await player.getThumbnails(newTrack.id, 0);
1358
- expect(thumbnail1.startTime).toBe(0);
1359
- expect(thumbnail1.duration).toBe(5);
1360
- const thumbnail2 = await player.getThumbnails(newTrack.id, 10);
1361
- expect(thumbnail2.startTime).toBe(5);
1362
- expect(thumbnail2.duration).toBe(25);
1363
- const thumbnail3 = await player.getThumbnails(newTrack.id, 40);
1364
- expect(thumbnail3.startTime).toBe(30);
1365
- expect(thumbnail3.duration).toBe(30);
1366
-
1367
- const thumbnails = await player.getAllThumbnails(newTrack.id);
1368
- expect(thumbnails.length).toBe(3);
1369
- });
1370
- }); // describe('addThumbnailsTrack')
1371
- });