shaka-player 4.6.4 → 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 (598) 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 +9 -5
  5. package/dist/locales.js +29 -29
  6. package/dist/shaka-player.compiled.d.ts +46 -3
  7. package/dist/shaka-player.compiled.debug.d.ts +46 -3
  8. package/dist/shaka-player.compiled.debug.externs.js +45 -0
  9. package/dist/shaka-player.compiled.debug.js +382 -351
  10. package/dist/shaka-player.compiled.debug.map +4 -4
  11. package/dist/shaka-player.compiled.externs.js +45 -0
  12. package/dist/shaka-player.compiled.js +1135 -1121
  13. package/dist/shaka-player.compiled.map +4 -4
  14. package/dist/shaka-player.ui.d.ts +68 -4
  15. package/dist/shaka-player.ui.debug.d.ts +68 -4
  16. package/dist/shaka-player.ui.debug.externs.js +77 -0
  17. package/dist/shaka-player.ui.debug.js +428 -392
  18. package/dist/shaka-player.ui.debug.map +4 -4
  19. package/dist/shaka-player.ui.externs.js +77 -0
  20. package/dist/shaka-player.ui.js +1304 -1290
  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/cea/cea708_service.js +1 -1
  28. package/lib/cea/cea708_window.js +95 -7
  29. package/lib/dash/dash_parser.js +55 -11
  30. package/lib/media/adaptation_set_criteria.js +76 -10
  31. package/lib/media/media_source_engine.js +42 -18
  32. package/lib/media/segment_reference.js +12 -0
  33. package/lib/media/streaming_engine.js +55 -3
  34. package/lib/player.js +92 -6
  35. package/lib/util/cmsd_manager.js +269 -0
  36. package/lib/util/content_steering_manager.js +5 -1
  37. package/lib/util/mime_utils.js +6 -2
  38. package/lib/util/periods.js +108 -39
  39. package/lib/util/player_configuration.js +19 -5
  40. package/lib/util/stream_utils.js +82 -13
  41. package/package.json +1 -1
  42. package/ui/audio_language_selection.js +3 -0
  43. package/ui/controls.js +60 -0
  44. package/ui/externs/ui.js +12 -1
  45. package/ui/hidden_fast_forward_button.js +32 -0
  46. package/ui/hidden_rewind_button.js +32 -0
  47. package/ui/hidden_seek_button.js +121 -0
  48. package/ui/less/buttons.less +50 -0
  49. package/ui/less/containers.less +18 -0
  50. package/ui/resolution_selection.js +2 -0
  51. package/ui/ui.js +2 -0
  52. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -75
  53. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -26
  54. package/.github/ISSUE_TEMPLATE/question.md +0 -26
  55. package/.github/config.yml +0 -1
  56. package/.github/workflows/appspot.yaml +0 -39
  57. package/.github/workflows/build-and-test.yaml +0 -222
  58. package/.github/workflows/compute-incremental-coverage.py +0 -265
  59. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +0 -56
  60. package/.github/workflows/custom-actions/set-commit-status/action.yaml +0 -37
  61. package/.github/workflows/deflake.yaml +0 -31
  62. package/.github/workflows/demo-version-index.yaml +0 -43
  63. package/.github/workflows/nightly-demo.yaml +0 -42
  64. package/.github/workflows/release-please.yaml +0 -193
  65. package/.github/workflows/report-incremental-coverage.yaml +0 -39
  66. package/.github/workflows/safari-homedir-launcher.sh +0 -18
  67. package/.github/workflows/selenium-lab-tests.yaml +0 -370
  68. package/.github/workflows/shaka-bot-commands/command-help.sh +0 -27
  69. package/.github/workflows/shaka-bot-commands/command-test.sh +0 -56
  70. package/.github/workflows/shaka-bot-commands/lib.sh +0 -83
  71. package/.github/workflows/shaka-bot-commands/main.sh +0 -51
  72. package/.github/workflows/sync-labels.yaml +0 -33
  73. package/.github/workflows/talk-to-shaka-bot.yaml +0 -29
  74. package/.github/workflows/update-issues.yaml +0 -31
  75. package/.github/workflows/update-screenshots.yaml +0 -142
  76. package/.github/workflows/validate-pr-title.yaml +0 -27
  77. package/CHANGELOG.md +0 -5774
  78. package/CODE_OF_CONDUCT.md +0 -93
  79. package/CONTRIBUTING.md +0 -76
  80. package/demo/TengwarTelcontar.woff2 +0 -0
  81. package/demo/app_logo_144.png +0 -0
  82. package/demo/app_logo_192.png +0 -0
  83. package/demo/app_logo_256.png +0 -0
  84. package/demo/app_logo_384.png +0 -0
  85. package/demo/app_logo_512.png +0 -0
  86. package/demo/app_manifest.json +0 -29
  87. package/demo/asset_card.js +0 -410
  88. package/demo/autoTemplate.txt +0 -61
  89. package/demo/cast_receiver/idle1.jpg +0 -0
  90. package/demo/cast_receiver/idle2.jpg +0 -0
  91. package/demo/cast_receiver/idle3.jpg +0 -0
  92. package/demo/cast_receiver/index.html +0 -75
  93. package/demo/cast_receiver/receiver_app.css +0 -111
  94. package/demo/cast_receiver/receiver_app.js +0 -158
  95. package/demo/close_button.js +0 -60
  96. package/demo/common/asset.js +0 -510
  97. package/demo/common/assets.js +0 -1634
  98. package/demo/config.js +0 -859
  99. package/demo/custom.js +0 -907
  100. package/demo/customWarning.txt +0 -8
  101. package/demo/demo.less +0 -591
  102. package/demo/demo_uncompiled.js +0 -11
  103. package/demo/demo_utils.js +0 -113
  104. package/demo/favicon.ico +0 -0
  105. package/demo/front.js +0 -156
  106. package/demo/icons/README.md +0 -4
  107. package/demo/icons/baseline-audiotrack-24px.svg +0 -1
  108. package/demo/icons/baseline-closed_caption-24px.svg +0 -1
  109. package/demo/icons/baseline-fast_forward-24px.svg +0 -1
  110. package/demo/icons/baseline-language-24px.svg +0 -1
  111. package/demo/icons/baseline-live_tv-24px.svg +0 -1
  112. package/demo/icons/baseline-subtitles-24px.svg +0 -1
  113. package/demo/icons/baseline-surround_sound-24px.svg +0 -1
  114. package/demo/icons/custom_ad.svg +0 -1
  115. package/demo/icons/custom_box_with_text.svg +0 -1
  116. package/demo/icons/custom_clear_key.svg +0 -1
  117. package/demo/icons/custom_high_definition.svg +0 -1
  118. package/demo/icons/custom_playready.svg +0 -1
  119. package/demo/icons/custom_ultra_high_definition.svg +0 -1
  120. package/demo/icons/custom_widevine.svg +0 -1
  121. package/demo/index.html +0 -173
  122. package/demo/input.js +0 -270
  123. package/demo/input_container.js +0 -218
  124. package/demo/load.js +0 -156
  125. package/demo/main.js +0 -1854
  126. package/demo/search.js +0 -452
  127. package/demo/service_worker.js +0 -355
  128. package/demo/shaka_logo_trans.png +0 -0
  129. package/demo/tooltip.js +0 -29
  130. package/demo/visualizer.js +0 -335
  131. package/demo/visualizer_button.js +0 -84
  132. package/dist/demo.compiled.debug.js +0 -340
  133. package/dist/demo.compiled.debug.map +0 -8
  134. package/dist/demo.compiled.js +0 -340
  135. package/dist/demo.compiled.map +0 -8
  136. package/dist/demo.css +0 -6
  137. package/dist/demo.css.map +0 -1
  138. package/dist/receiver.compiled.debug.js +0 -187
  139. package/dist/receiver.compiled.debug.map +0 -8
  140. package/dist/receiver.compiled.js +0 -187
  141. package/dist/receiver.compiled.map +0 -8
  142. package/docs/announcement-list-join-group.png +0 -0
  143. package/docs/api-mainpage.md +0 -28
  144. package/docs/design/REDESIGN.md +0 -283
  145. package/docs/design/architecture.md +0 -13
  146. package/docs/design/bg-fetch-after.gv +0 -29
  147. package/docs/design/bg-fetch-after.gv.png +0 -0
  148. package/docs/design/bg-fetch-before.gv +0 -18
  149. package/docs/design/bg-fetch-before.gv.png +0 -0
  150. package/docs/design/bg-fetch.md +0 -134
  151. package/docs/design/cast.gv +0 -35
  152. package/docs/design/cast.gv.png +0 -0
  153. package/docs/design/chromecast.md +0 -151
  154. package/docs/design/codec_preferences.md +0 -158
  155. package/docs/design/dash-audio-channels.md +0 -123
  156. package/docs/design/dash-manifests.md +0 -248
  157. package/docs/design/dash-timeline.svg +0 -4
  158. package/docs/design/dataflow.gv +0 -66
  159. package/docs/design/dataflow.gv.png +0 -0
  160. package/docs/design/export.md +0 -70
  161. package/docs/design/fuzzy-locale-matching.md +0 -40
  162. package/docs/design/gap-jumping.md +0 -151
  163. package/docs/design/lcevc-architecture.png +0 -0
  164. package/docs/design/lcevc-demo.png +0 -0
  165. package/docs/design/lcevc-integration.md +0 -72
  166. package/docs/design/locale_compatibility.svg +0 -1
  167. package/docs/design/locales_tree.svg +0 -1
  168. package/docs/design/localization-design-principles.md +0 -158
  169. package/docs/design/newdemo.gv +0 -83
  170. package/docs/design/newdemo.gv.png +0 -0
  171. package/docs/design/offline.gv +0 -43
  172. package/docs/design/offline.gv.png +0 -0
  173. package/docs/design/offline.md +0 -153
  174. package/docs/design/ownership.gv +0 -76
  175. package/docs/design/ownership.gv.png +0 -0
  176. package/docs/design/preload.md +0 -299
  177. package/docs/design/preload.png +0 -0
  178. package/docs/design/talking-about-languages.md +0 -46
  179. package/docs/design/timeline.svg +0 -152
  180. package/docs/design/ui.md +0 -31
  181. package/docs/design/ui_player_relationships.svg +0 -1
  182. package/docs/jsdoc-plugin.js +0 -74
  183. package/docs/jsdoc-template/README.md +0 -1
  184. package/docs/jsdoc-template/publish.js +0 -879
  185. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.eot +0 -0
  186. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.svg +0 -1830
  187. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.woff +0 -0
  188. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  189. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.svg +0 -1830
  190. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  191. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.eot +0 -0
  192. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.svg +0 -1830
  193. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.woff +0 -0
  194. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.eot +0 -0
  195. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.svg +0 -1831
  196. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.woff +0 -0
  197. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  198. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.svg +0 -1835
  199. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  200. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.eot +0 -0
  201. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.svg +0 -1831
  202. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.woff +0 -0
  203. package/docs/jsdoc-template/static/scripts/linenumber.js +0 -44
  204. package/docs/jsdoc-template/static/scripts/show-widget.js +0 -55
  205. package/docs/jsdoc-template/static/styles/jsdoc-default.css +0 -438
  206. package/docs/jsdoc-template/tmpl/augments.tmpl +0 -10
  207. package/docs/jsdoc-template/tmpl/container.tmpl +0 -205
  208. package/docs/jsdoc-template/tmpl/details.tmpl +0 -152
  209. package/docs/jsdoc-template/tmpl/example.tmpl +0 -2
  210. package/docs/jsdoc-template/tmpl/examples.tmpl +0 -13
  211. package/docs/jsdoc-template/tmpl/exceptions.tmpl +0 -32
  212. package/docs/jsdoc-template/tmpl/layout.tmpl +0 -50
  213. package/docs/jsdoc-template/tmpl/mainpage.tmpl +0 -14
  214. package/docs/jsdoc-template/tmpl/members.tmpl +0 -47
  215. package/docs/jsdoc-template/tmpl/method.tmpl +0 -140
  216. package/docs/jsdoc-template/tmpl/modifies.tmpl +0 -14
  217. package/docs/jsdoc-template/tmpl/params.tmpl +0 -131
  218. package/docs/jsdoc-template/tmpl/properties.tmpl +0 -125
  219. package/docs/jsdoc-template/tmpl/returns.tmpl +0 -19
  220. package/docs/jsdoc-template/tmpl/source.tmpl +0 -8
  221. package/docs/jsdoc-template/tmpl/tutorial.tmpl +0 -21
  222. package/docs/jsdoc-template/tmpl/type.tmpl +0 -7
  223. package/docs/jsdoc.conf.json +0 -38
  224. package/docs/shaka-player-logo.png +0 -0
  225. package/docs/style.md +0 -174
  226. package/docs/tutorials/a11y.md +0 -64
  227. package/docs/tutorials/ad_monetization.md +0 -292
  228. package/docs/tutorials/application-level-redirects.md +0 -94
  229. package/docs/tutorials/architecture.md +0 -32
  230. package/docs/tutorials/basic-usage.md +0 -89
  231. package/docs/tutorials/blob-url.md +0 -15
  232. package/docs/tutorials/config.md +0 -148
  233. package/docs/tutorials/debugging.md +0 -189
  234. package/docs/tutorials/drm-config.md +0 -274
  235. package/docs/tutorials/errors.md +0 -95
  236. package/docs/tutorials/fairplay.md +0 -242
  237. package/docs/tutorials/faq.md +0 -252
  238. package/docs/tutorials/index.json +0 -29
  239. package/docs/tutorials/lcevc.md +0 -118
  240. package/docs/tutorials/license-server-auth.md +0 -248
  241. package/docs/tutorials/license-wrapping.md +0 -168
  242. package/docs/tutorials/manifest-parser.md +0 -365
  243. package/docs/tutorials/network-and-buffering-config.md +0 -119
  244. package/docs/tutorials/offline.md +0 -683
  245. package/docs/tutorials/plugins.md +0 -184
  246. package/docs/tutorials/selenium-grid-config.md +0 -174
  247. package/docs/tutorials/service-worker.md +0 -106
  248. package/docs/tutorials/ui-customization.md +0 -288
  249. package/docs/tutorials/ui.md +0 -232
  250. package/docs/tutorials/upgrade-manifest.md +0 -281
  251. package/docs/tutorials/upgrade.md +0 -104
  252. package/docs/tutorials/welcome.md +0 -108
  253. package/docs/tutorials/widevine-service-certs.md +0 -45
  254. package/karma.conf.js +0 -879
  255. package/maintained-branches.md +0 -15
  256. package/roadmap.md +0 -186
  257. package/test/abr/simple_abr_manager_unit.js +0 -398
  258. package/test/ads/ad_manager_unit.js +0 -260
  259. package/test/assumptions/uint8_array_unit.js +0 -22
  260. package/test/cast/cast_proxy_unit.js +0 -736
  261. package/test/cast/cast_receiver_integration.js +0 -488
  262. package/test/cast/cast_receiver_unit.js +0 -1183
  263. package/test/cast/cast_sender_unit.js +0 -973
  264. package/test/cast/cast_utils_unit.js +0 -311
  265. package/test/cea/cea608_memory_unit.js +0 -411
  266. package/test/cea/cea708_service_unit.js +0 -674
  267. package/test/cea/cea708_window_unit.js +0 -373
  268. package/test/cea/cea_decoder_unit.js +0 -615
  269. package/test/cea/dtvcc_packet_builder_unit.js +0 -158
  270. package/test/cea/dtvcc_packet_unit.js +0 -60
  271. package/test/cea/mp4_cea_parser_unit.js +0 -127
  272. package/test/codec_switching/codec_switching_integration.js +0 -182
  273. package/test/dash/dash_parser_content_protection_unit.js +0 -998
  274. package/test/dash/dash_parser_integration.js +0 -74
  275. package/test/dash/dash_parser_live_unit.js +0 -1542
  276. package/test/dash/dash_parser_manifest_unit.js +0 -3121
  277. package/test/dash/dash_parser_segment_base_unit.js +0 -421
  278. package/test/dash/dash_parser_segment_list_unit.js +0 -380
  279. package/test/dash/dash_parser_segment_template_unit.js +0 -910
  280. package/test/dash/mpd_utils_unit.js +0 -794
  281. package/test/demo/demo_unit.js +0 -108
  282. package/test/deprecate/enforcer_unit.js +0 -74
  283. package/test/deprecate/version_unit.js +0 -57
  284. package/test/hls/hls_live_unit.js +0 -1330
  285. package/test/hls/hls_parser_unit.js +0 -5276
  286. package/test/hls/manifest_text_parser_unit.js +0 -545
  287. package/test/media/adaptation_set_criteria_unit.js +0 -806
  288. package/test/media/adaptation_set_unit.js +0 -229
  289. package/test/media/buffering_observer_unit.js +0 -143
  290. package/test/media/closed_caption_parser_unit.js +0 -18
  291. package/test/media/content_workarounds_unit.js +0 -43
  292. package/test/media/drm_engine_integration.js +0 -356
  293. package/test/media/drm_engine_unit.js +0 -2805
  294. package/test/media/media_source_engine_integration.js +0 -691
  295. package/test/media/media_source_engine_unit.js +0 -1512
  296. package/test/media/mp4_segment_index_parser_unit.js +0 -80
  297. package/test/media/play_rate_controller_unit.js +0 -69
  298. package/test/media/playhead_unit.js +0 -1394
  299. package/test/media/presentation_timeline_unit.js +0 -477
  300. package/test/media/quality_observer_unit.js +0 -138
  301. package/test/media/region_observer_unit.js +0 -374
  302. package/test/media/region_timeline_unit.js +0 -139
  303. package/test/media/segment_index_unit.js +0 -1080
  304. package/test/media/segment_prefetch_unit.js +0 -243
  305. package/test/media/segment_reference_unit.js +0 -63
  306. package/test/media/stall_detector_unit.js +0 -184
  307. package/test/media/streaming_engine_integration.js +0 -632
  308. package/test/media/streaming_engine_unit.js +0 -4211
  309. package/test/media/time_ranges_utils_unit.js +0 -123
  310. package/test/media/webm_segment_index_parser_unit.js +0 -90
  311. package/test/mss/mss_parser_content_protection_unit.js +0 -49
  312. package/test/mss/mss_parser_unit.js +0 -474
  313. package/test/mss/mss_player_integration.js +0 -124
  314. package/test/net/data_uri_plugin_unit.js +0 -105
  315. package/test/net/http_plugin_unit.js +0 -439
  316. package/test/net/networking_engine_unit.js +0 -1236
  317. package/test/net/networking_utils_unit.js +0 -37
  318. package/test/offline/download_progress_estimator_unit.js +0 -90
  319. package/test/offline/indexeddb_storage_unit.js +0 -192
  320. package/test/offline/manifest_convert_unit.js +0 -622
  321. package/test/offline/offline_integration.js +0 -168
  322. package/test/offline/offline_manifest_parser_unit.js +0 -231
  323. package/test/offline/offline_scheme_unit.js +0 -154
  324. package/test/offline/offline_uri_unit.js +0 -59
  325. package/test/offline/storage_compatibility_unit.js +0 -344
  326. package/test/offline/storage_integration.js +0 -1858
  327. package/test/player_external.js +0 -237
  328. package/test/player_integration.js +0 -1371
  329. package/test/player_load_graph_integration.js +0 -865
  330. package/test/player_src_equals_external.js +0 -154
  331. package/test/player_src_equals_integration.js +0 -527
  332. package/test/player_unit.js +0 -4434
  333. package/test/polyfill/media_capabilities_unit.js +0 -277
  334. package/test/polyfill/patchedmediakeys_apple_unit.js +0 -130
  335. package/test/test/assets/3675/chunk-stream0-00001.m4s +0 -0
  336. package/test/test/assets/3675/chunk-stream0-00002.m4s +0 -0
  337. package/test/test/assets/3675/chunk-stream0-00003.m4s +0 -0
  338. package/test/test/assets/3675/chunk-stream0-00004.m4s +0 -0
  339. package/test/test/assets/3675/chunk-stream0-00005.m4s +0 -0
  340. package/test/test/assets/3675/chunk-stream0-00006.m4s +0 -0
  341. package/test/test/assets/3675/chunk-stream0-00007.m4s +0 -0
  342. package/test/test/assets/3675/dash_0.mpd +0 -30
  343. package/test/test/assets/3675/dash_1.mpd +0 -30
  344. package/test/test/assets/3675/dash_2.mpd +0 -30
  345. package/test/test/assets/3675/dash_3.mpd +0 -30
  346. package/test/test/assets/3675/dash_4.mpd +0 -30
  347. package/test/test/assets/3675/dash_5.mpd +0 -26
  348. package/test/test/assets/3675/init-stream0.m4s +0 -0
  349. package/test/test/assets/audio-xhe-aac.mp4 +0 -0
  350. package/test/test/assets/audio.ts +0 -0
  351. package/test/test/assets/captions-test.ts +0 -0
  352. package/test/test/assets/cea-init.mp4 +0 -0
  353. package/test/test/assets/cea-segment.mp4 +0 -0
  354. package/test/test/assets/chapters.srt +0 -11
  355. package/test/test/assets/chapters.vtt +0 -10
  356. package/test/test/assets/chapters2.vtt +0 -10
  357. package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
  358. package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
  359. package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
  360. package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
  361. package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
  362. package/test/test/assets/dash-aes-128/dash.mpd +0 -18
  363. package/test/test/assets/dash-aes-128/license +0 -1
  364. package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
  365. package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
  366. package/test/test/assets/dash-multi-codec/dash.mpd +0 -32
  367. package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
  368. package/test/test/assets/db-dump-v1.json +0 -1
  369. package/test/test/assets/db-dump-v2-broken.json +0 -1
  370. package/test/test/assets/db-dump-v2-clean.json +0 -1
  371. package/test/test/assets/db-dump-v3.json +0 -1
  372. package/test/test/assets/db-dump-v4-broken.json +0 -1
  373. package/test/test/assets/db-dump-v5.json +0 -1
  374. package/test/test/assets/empty_caption_video_init.mp4 +0 -0
  375. package/test/test/assets/empty_caption_video_segment.mp4 +0 -0
  376. package/test/test/assets/encrypted-sintel-audio-init.mp4 +0 -0
  377. package/test/test/assets/encrypted-sintel-audio-segment.mp4 +0 -0
  378. package/test/test/assets/encrypted-sintel-video-init.mp4 +0 -0
  379. package/test/test/assets/encrypted-sintel-video-segment.mp4 +0 -0
  380. package/test/test/assets/green-pixel.mp4 +0 -0
  381. package/test/test/assets/green-pixel.txt +0 -15
  382. package/test/test/assets/h265-cea-init.mp4 +0 -0
  383. package/test/test/assets/h265-cea-segment.mp4 +0 -0
  384. package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
  385. package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
  386. package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
  387. package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
  388. package/test/test/assets/hls-raw-aac/manifest.m3u8 +0 -4
  389. package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +0 -14
  390. package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
  391. package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
  392. package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
  393. package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
  394. package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
  395. package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
  396. package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
  397. package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
  398. package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +0 -31
  399. package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
  400. package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
  401. package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
  402. package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
  403. package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
  404. package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
  405. package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
  406. package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
  407. package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +0 -31
  408. package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +0 -13
  409. package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
  410. package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
  411. package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
  412. package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
  413. package/test/test/assets/hls-raw-mp3/playlist.m3u8 +0 -4
  414. package/test/test/assets/hls-ts-aac/playlist.m3u8 +0 -23
  415. package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
  416. package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
  417. package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
  418. package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
  419. package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
  420. package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
  421. package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
  422. package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
  423. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
  424. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
  425. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
  426. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
  427. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
  428. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
  429. package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +0 -19
  430. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
  431. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
  432. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
  433. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
  434. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
  435. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
  436. package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +0 -19
  437. package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
  438. package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
  439. package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
  440. package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
  441. package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
  442. package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
  443. package/test/test/assets/hls-ts-h264/prog_index.m3u8 +0 -25
  444. package/test/test/assets/hls-ts-h265/0.ts +0 -0
  445. package/test/test/assets/hls-ts-h265/hevc.m3u8 +0 -6
  446. package/test/test/assets/hls-ts-h265/index.m3u8 +0 -7
  447. package/test/test/assets/hls-ts-mp3/manifest.m3u8 +0 -13
  448. package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
  449. package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
  450. package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
  451. package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
  452. package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +0 -17
  453. package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
  454. package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
  455. package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
  456. package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
  457. package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
  458. package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
  459. package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +0 -4
  460. package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
  461. package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
  462. package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +0 -9
  463. package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +0 -24
  464. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
  465. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
  466. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
  467. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
  468. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
  469. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
  470. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
  471. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
  472. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
  473. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
  474. package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +0 -14
  475. package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +0 -23
  476. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
  477. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
  478. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
  479. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
  480. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
  481. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
  482. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
  483. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
  484. package/test/test/assets/id3-metadata.aac +0 -0
  485. package/test/test/assets/id3-metadata.ts +0 -0
  486. package/test/test/assets/index-segment.mp4 +0 -0
  487. package/test/test/assets/index-segment.webm +0 -0
  488. package/test/test/assets/init-segment.webm +0 -0
  489. package/test/test/assets/large_file.mpd +0 -4930
  490. package/test/test/assets/multidrm-audio-init.mp4 +0 -0
  491. package/test/test/assets/multidrm-audio-segment.mp4 +0 -0
  492. package/test/test/assets/multidrm-video-init.mp4 +0 -0
  493. package/test/test/assets/multidrm-video-segment.mp4 +0 -0
  494. package/test/test/assets/multiple-trun-init.mp4 +0 -0
  495. package/test/test/assets/multiple-trun-segment.mp4 +0 -0
  496. package/test/test/assets/sintel-audio-init.mp4 +0 -0
  497. package/test/test/assets/sintel-audio-segment.mp4 +0 -0
  498. package/test/test/assets/sintel-video-init.mp4 +0 -0
  499. package/test/test/assets/sintel-video-segment.mp4 +0 -0
  500. package/test/test/assets/small.mp4 +0 -0
  501. package/test/test/assets/text-clip-alt.vtt +0 -63
  502. package/test/test/assets/text-clip.vtt +0 -63
  503. package/test/test/assets/thumbnails-sprites.vtt +0 -10
  504. package/test/test/assets/thumbnails.vtt +0 -10
  505. package/test/test/assets/ttml-init.mp4 +0 -0
  506. package/test/test/assets/ttml-segment-multiplemdat.mp4 +0 -0
  507. package/test/test/assets/ttml-segment.mp4 +0 -0
  508. package/test/test/assets/video.ts +0 -0
  509. package/test/test/assets/vtt-init.mp4 +0 -0
  510. package/test/test/assets/vtt-segment-multi-payload.mp4 +0 -0
  511. package/test/test/assets/vtt-segment-no-duration.mp4 +0 -0
  512. package/test/test/assets/vtt-segment-settings.mp4 +0 -0
  513. package/test/test/assets/vtt-segment.mp4 +0 -0
  514. package/test/test/boot.js +0 -495
  515. package/test/test/externs/filters.js +0 -44
  516. package/test/test/externs/fontfaceonload.js +0 -29
  517. package/test/test/externs/jasmine.js +0 -670
  518. package/test/test/externs/karma.js +0 -26
  519. package/test/test/externs/require.js +0 -21
  520. package/test/test/externs/sprintf.js +0 -18
  521. package/test/test/namespace.js +0 -10
  522. package/test/test/util/canned_idb.js +0 -379
  523. package/test/test/util/cea_utils.js +0 -60
  524. package/test/test/util/dash_parser_util.js +0 -329
  525. package/test/test/util/fake_ad.js +0 -321
  526. package/test/test/util/fake_ad_manager.js +0 -122
  527. package/test/test/util/fake_demo_main.js +0 -144
  528. package/test/test/util/fake_drm_engine.js +0 -103
  529. package/test/test/util/fake_media_source_engine.js +0 -464
  530. package/test/test/util/fake_networking_engine.js +0 -381
  531. package/test/test/util/fake_segment_prefetch.js +0 -84
  532. package/test/test/util/fake_text_displayer.js +0 -60
  533. package/test/test/util/id3_generator.js +0 -100
  534. package/test/test/util/indexeddb_utils.js +0 -124
  535. package/test/test/util/jasmine_fetch.js +0 -382
  536. package/test/test/util/layout_tests.js +0 -435
  537. package/test/test/util/loader.js +0 -88
  538. package/test/test/util/manifest_generator.js +0 -705
  539. package/test/test/util/manifest_parser_util.js +0 -101
  540. package/test/test/util/mss_parser_util.js +0 -119
  541. package/test/test/util/offline_utils.js +0 -105
  542. package/test/test/util/simple_fakes.js +0 -535
  543. package/test/test/util/stream_generator.js +0 -676
  544. package/test/test/util/streaming_engine_util.js +0 -506
  545. package/test/test/util/test_scheme.js +0 -778
  546. package/test/test/util/ttml_utils.js +0 -77
  547. package/test/test/util/ui_utils.js +0 -183
  548. package/test/test/util/util.js +0 -374
  549. package/test/test/util/waiter.js +0 -406
  550. package/test/text/cue_integration.js +0 -51
  551. package/test/text/lrc_text_parser_unit.js +0 -98
  552. package/test/text/mp4_ttml_parser_unit.js +0 -171
  553. package/test/text/mp4_vtt_parser_unit.js +0 -195
  554. package/test/text/sbv_text_parser_unit.js +0 -81
  555. package/test/text/simple_text_displayer_unit.js +0 -468
  556. package/test/text/srt_text_parser_unit.js +0 -163
  557. package/test/text/ssa_text_parser_unit.js +0 -382
  558. package/test/text/text_displayer_layout_unit.js +0 -323
  559. package/test/text/text_engine_unit.js +0 -500
  560. package/test/text/text_track_integration.js +0 -186
  561. package/test/text/ttml_text_parser_unit.js +0 -2176
  562. package/test/text/ui_text_displayer_unit.js +0 -608
  563. package/test/text/vtt_text_parser_unit.js +0 -1363
  564. package/test/text/web_vtt_generator_unit.js +0 -144
  565. package/test/text/web_vtt_layout_integration.js +0 -524
  566. package/test/transmuxer/transmuxer_engine_integration.js +0 -69
  567. package/test/transmuxer/transmuxer_integration.js +0 -443
  568. package/test/ui/ad_ui_unit.js +0 -369
  569. package/test/ui/localization_unit.js +0 -508
  570. package/test/ui/ui_customization_unit.js +0 -208
  571. package/test/ui/ui_integration.js +0 -669
  572. package/test/ui/ui_unit.js +0 -902
  573. package/test/util/abortable_operation_unit.js +0 -624
  574. package/test/util/array_utils_unit.js +0 -58
  575. package/test/util/buffer_utils_unit.js +0 -185
  576. package/test/util/cmcd_manager_unit.js +0 -440
  577. package/test/util/content_steering_manager_unit.js +0 -427
  578. package/test/util/data_view_reader_unit.js +0 -254
  579. package/test/util/ebml_parser_unit.js +0 -297
  580. package/test/util/event_manager_unit.js +0 -185
  581. package/test/util/fake_event_target_unit.js +0 -123
  582. package/test/util/id3_utils_unit.js +0 -168
  583. package/test/util/iterables_unit.js +0 -68
  584. package/test/util/language_utils_unit.js +0 -240
  585. package/test/util/manifest_parser_utils_unit.js +0 -55
  586. package/test/util/mime_utils_unit.js +0 -64
  587. package/test/util/mp4_box_parsers_unit.js +0 -246
  588. package/test/util/mp4_parser_unit.js +0 -373
  589. package/test/util/multi_map_unit.js +0 -94
  590. package/test/util/object_utils_unit.js +0 -79
  591. package/test/util/periods_unit.js +0 -1623
  592. package/test/util/pssh_unit.js +0 -226
  593. package/test/util/state_history_unit.js +0 -101
  594. package/test/util/stream_utils_unit.js +0 -1068
  595. package/test/util/string_utils_unit.js +0 -166
  596. package/test/util/text_parser_unit.js +0 -165
  597. package/test/util/ts_parser_unit.js +0 -77
  598. 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
- });