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,1183 +0,0 @@
1
- /*! @license
2
- * Shaka Player
3
- * Copyright 2016 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- // The receiver is only meant to run on the Chromecast, so we have the
8
- // ability to use modern APIs there that may not be available on all of the
9
- // browsers our library supports. Because of this, CastReceiver tests will
10
- // only be run on Chrome and Chromecast.
11
- /** @return {boolean} */
12
- const castReceiverSupport =
13
- () => shaka.util.Platform.isChrome() || shaka.util.Platform.isChromecast();
14
- filterDescribe('CastReceiver', castReceiverSupport, () => {
15
- const CastReceiver = shaka.cast.CastReceiver;
16
- const CastUtils = shaka.cast.CastUtils;
17
- const Util = shaka.test.Util;
18
-
19
- const originalCast = window['cast'];
20
- const originalUserAgent = navigator.userAgent;
21
- const originalPollInterval = CastReceiver.POLL_INTERVAL;
22
- const originalIdleInterval = CastReceiver.IDLE_INTERVAL;
23
-
24
- /** @type {!shaka.test.FakeVideo} */
25
- let mockVideo;
26
- /** @type {!jasmine.Spy} */
27
- let mockAppDataCallback;
28
- let mockPlayer;
29
- let mockReceiverManager;
30
-
31
- let mockReceiverApi;
32
- let mockShakaMessageBus;
33
- let mockGenericMessageBus;
34
- /** @type {!jasmine.Spy} */
35
- let mockCanDisplayType;
36
-
37
- /** @type {shaka.cast.CastReceiver} */
38
- let receiver;
39
-
40
- beforeAll(() => {
41
- // In uncompiled mode, there is a UA check for Chromecast in order to make
42
- // manual testing easier. For these automated tests, we want to act as if
43
- // we are running on the Chromecast, even in Chrome.
44
- // Since we can't write to window.navigator or navigator.userAgent, we use
45
- // Object.defineProperty.
46
- Object.defineProperty(window['navigator'],
47
- 'userAgent', {value: 'CrKey', configurable: true});
48
-
49
- CastReceiver.POLL_INTERVAL = 0.001;
50
- CastReceiver.IDLE_INTERVAL = 0.001;
51
- });
52
-
53
- beforeEach(() => {
54
- mockReceiverApi = createMockReceiverApi();
55
- mockCanDisplayType = jasmine.createSpy('canDisplayType');
56
- mockCanDisplayType.and.returnValue(false);
57
-
58
- // We're using quotes to access window.cast because the compiler
59
- // knows about lots of Cast-specific APIs we aren't mocking. We
60
- // don't need this mock strictly type-checked.
61
- window['cast'] = {
62
- receiver: mockReceiverApi,
63
- __platform__: {canDisplayType: mockCanDisplayType},
64
- };
65
-
66
- mockReceiverManager = createMockReceiverManager();
67
- mockShakaMessageBus = createMockMessageBus();
68
- mockGenericMessageBus = createMockMessageBus();
69
- mockVideo = new shaka.test.FakeVideo();
70
- mockPlayer = createMockPlayer();
71
- mockAppDataCallback = jasmine.createSpy('appDataCallback');
72
- });
73
-
74
- afterEach(async () => {
75
- if (receiver) {
76
- await receiver.destroy();
77
- }
78
- });
79
-
80
- afterAll(() => {
81
- if (originalUserAgent) {
82
- window['cast'] = originalCast;
83
- Object.defineProperty(window['navigator'],
84
- 'userAgent', {value: originalUserAgent});
85
- }
86
- CastReceiver.POLL_INTERVAL = originalPollInterval;
87
- CastReceiver.IDLE_INTERVAL = originalIdleInterval;
88
- });
89
-
90
- describe('constructor', () => {
91
- it('starts the receiver manager', () => {
92
- receiver = new CastReceiver(
93
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
94
- expect(mockReceiverManager.start).toHaveBeenCalled();
95
- });
96
-
97
- it('listens for video and player events', () => {
98
- receiver = new CastReceiver(
99
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
100
- expect(Object.keys(mockVideo.on).length).toBeGreaterThan(0);
101
- expect(Object.keys(mockPlayer.listeners).length).toBeGreaterThan(0);
102
- });
103
-
104
- it('limits streams to 1080p on Chromecast v1 and v2', () => {
105
- // Simulate the canDisplayType reponse of Chromecast v1 or v2
106
- mockCanDisplayType.and.callFake((type) => {
107
- const matches = /height=(\d+)/.exec(type);
108
- const height = parseInt(matches[1], 10);
109
- if (height && height > 1080) {
110
- return false;
111
- }
112
- return true;
113
- });
114
- receiver = new CastReceiver(
115
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
116
- expect(mockCanDisplayType).toHaveBeenCalled();
117
- expect(mockPlayer.setMaxHardwareResolution)
118
- .toHaveBeenCalledWith(1920, 1080);
119
- });
120
-
121
- it('limits streams to 4k on Chromecast Ultra', () => {
122
- // Simulate the canDisplayType reponse of Chromecast Ultra
123
- mockCanDisplayType.and.callFake((type) => {
124
- const matches = /height=(\d+)/.exec(type);
125
- const height = parseInt(matches[1], 10);
126
- if (height && height > 2160) {
127
- return false;
128
- }
129
- return true;
130
- });
131
- receiver = new CastReceiver(
132
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
133
- expect(mockCanDisplayType).toHaveBeenCalled();
134
- expect(mockPlayer.setMaxHardwareResolution)
135
- .toHaveBeenCalledWith(3840, 2160);
136
- });
137
-
138
- it('does not start polling', () => {
139
- receiver = new CastReceiver(
140
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
141
- expect(mockPlayer.getConfiguration).not.toHaveBeenCalled();
142
- expect(mockShakaMessageBus.messages.length).toBe(0);
143
- });
144
- });
145
-
146
- describe('isConnected', () => {
147
- beforeEach(() => {
148
- receiver = new CastReceiver(
149
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
150
- });
151
-
152
- it('is true when there are senders', () => {
153
- expect(receiver.isConnected()).toBe(false);
154
- fakeConnectedSenders(1);
155
- expect(receiver.isConnected()).toBe(true);
156
- fakeConnectedSenders(2);
157
- expect(receiver.isConnected()).toBe(true);
158
- fakeConnectedSenders(99);
159
- expect(receiver.isConnected()).toBe(true);
160
- fakeConnectedSenders(0);
161
- expect(receiver.isConnected()).toBe(false);
162
- });
163
- });
164
-
165
- describe('"caststatuschanged" event', () => {
166
- beforeEach(() => {
167
- receiver = new CastReceiver(
168
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
169
- });
170
-
171
- it('triggers when senders connect or disconnect', async () => {
172
- /** @type {!jasmine.Spy} */
173
- const listener = jasmine.createSpy('listener');
174
- receiver.addEventListener('caststatuschanged', Util.spyFunc(listener));
175
-
176
- await shaka.test.Util.shortDelay();
177
- expect(listener).not.toHaveBeenCalled();
178
- fakeConnectedSenders(1);
179
- await shaka.test.Util.shortDelay();
180
-
181
- expect(listener).toHaveBeenCalled();
182
- listener.calls.reset();
183
- mockReceiverManager.onSenderDisconnected();
184
- await shaka.test.Util.shortDelay();
185
-
186
- expect(listener).toHaveBeenCalled();
187
- });
188
-
189
- it('triggers when idle state changes', async () => {
190
- /** @type {!jasmine.Spy} */
191
- const listener = jasmine.createSpy('listener');
192
- receiver.addEventListener('caststatuschanged', Util.spyFunc(listener));
193
-
194
- const fakeLoadingEvent = {type: 'loading'};
195
- const fakeUnloadingEvent = {type: 'unloading'};
196
- const fakeEndedEvent = {type: 'ended'};
197
- const fakePlayingEvent = {type: 'playing'};
198
-
199
- await shaka.test.Util.shortDelay();
200
- expect(listener).not.toHaveBeenCalled();
201
- expect(receiver.isIdle()).toBe(true);
202
-
203
- mockPlayer.listeners['loading'](fakeLoadingEvent);
204
- await shaka.test.Util.shortDelay();
205
-
206
- expect(listener).toHaveBeenCalled();
207
- expect(receiver.isIdle()).toBe(false);
208
- listener.calls.reset();
209
-
210
- mockPlayer.listeners['unloading'](fakeUnloadingEvent);
211
- await shaka.test.Util.shortDelay();
212
-
213
- expect(listener).toHaveBeenCalled();
214
- expect(receiver.isIdle()).toBe(true);
215
- listener.calls.reset();
216
-
217
- mockVideo.ended = true;
218
- mockVideo.on['ended'](fakeEndedEvent);
219
- await shaka.test.Util.shortDelay();
220
-
221
- expect(listener).toHaveBeenCalled();
222
- listener.calls.reset();
223
- expect(receiver.isIdle()).toBe(true);
224
-
225
- mockVideo.ended = false;
226
- mockVideo.on['playing'](fakePlayingEvent);
227
- await Promise.resolve();
228
-
229
- expect(listener).toHaveBeenCalled();
230
- expect(receiver.isIdle()).toBe(false);
231
- });
232
- });
233
-
234
- describe('local events', () => {
235
- beforeEach(() => {
236
- receiver = new CastReceiver(
237
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
238
- });
239
-
240
- it('trigger "update" and "event" messages', () => {
241
- fakeConnectedSenders(1);
242
-
243
- // No messages yet.
244
- expect(mockShakaMessageBus.messages).toEqual([]);
245
- const fakeEvent = {type: 'timeupdate'};
246
- mockVideo.on['timeupdate'](fakeEvent);
247
-
248
- // There are now some number of "update" and "event" messages, in that
249
- // order.
250
- expect(mockShakaMessageBus.messages).toContain({
251
- type: 'update',
252
- update: jasmine.any(Object),
253
- });
254
- expect(mockShakaMessageBus.messages).toContain({
255
- type: 'event',
256
- targetName: 'video',
257
- event: jasmine.objectContaining(fakeEvent),
258
- });
259
- const eventIndex = mockShakaMessageBus.messages.findIndex(
260
- (message) => message.type == 'event');
261
- expect(eventIndex).toBe(mockShakaMessageBus.messages.length - 1);
262
- });
263
- });
264
-
265
- describe('"init" message', () => {
266
- /** @const */
267
- const fakeConfig = {key: 'value'};
268
- /** @const */
269
- const fakeAppData = {myFakeAppData: 1234};
270
- let fakeInitState;
271
-
272
- beforeEach(() => {
273
- receiver = new CastReceiver(
274
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
275
-
276
- fakeInitState = {
277
- manifest: null,
278
- startTime: null,
279
- player: {
280
- configure: fakeConfig,
281
- },
282
- playerAfterLoad: {
283
- setTextTrackVisibility: true,
284
- },
285
- video: {
286
- loop: true,
287
- playbackRate: 5,
288
- },
289
- };
290
- });
291
-
292
- it('sets initial state', async () => {
293
- expect(mockVideo.loop).toBe(false);
294
- expect(mockVideo.playbackRate).toBe(1);
295
- expect(mockPlayer.configure).not.toHaveBeenCalled();
296
-
297
- fakeIncomingMessage({
298
- type: 'init',
299
- initState: fakeInitState,
300
- appData: fakeAppData,
301
- }, mockShakaMessageBus);
302
-
303
- // Initial Player state first:
304
- expect(mockPlayer.configure).toHaveBeenCalledWith(fakeConfig);
305
- // App data next:
306
- expect(mockAppDataCallback).toHaveBeenCalledWith(fakeAppData);
307
- // Nothing else yet:
308
- expect(mockPlayer.setTextTrackVisibility).not.toHaveBeenCalled();
309
- expect(mockVideo.loop).toBe(false);
310
- expect(mockVideo.playbackRate).toBe(1);
311
-
312
- // The rest is done async:
313
- await shaka.test.Util.shortDelay();
314
- expect(mockPlayer.setTextTrackVisibility).toHaveBeenCalledWith(
315
- fakeInitState.playerAfterLoad.setTextTrackVisibility);
316
- expect(mockVideo.loop).toBe(fakeInitState.video.loop);
317
- expect(mockVideo.playbackRate).toBe(fakeInitState.video.playbackRate);
318
- });
319
-
320
- it('starts polling', () => {
321
- const fakeConfig = {key: 'value'};
322
- mockPlayer.getConfiguration.and.returnValue(fakeConfig);
323
-
324
- fakeConnectedSenders(1);
325
-
326
- mockPlayer.getConfiguration.calls.reset();
327
-
328
- expect(mockShakaMessageBus.messages.length).toBe(0);
329
- fakeIncomingMessage({
330
- type: 'init',
331
- initState: fakeInitState,
332
- appData: fakeAppData,
333
- }, mockShakaMessageBus);
334
-
335
- expect(mockPlayer.getConfiguration).toHaveBeenCalled();
336
- expect(mockShakaMessageBus.messages).toContain(jasmine.objectContaining({
337
- type: 'update',
338
- update: jasmine.objectContaining({
339
- player: jasmine.objectContaining({
340
- getConfiguration: fakeConfig,
341
- }),
342
- }),
343
- }));
344
- });
345
-
346
- it('doesn\'t poll live methods while loading a VOD', () => {
347
- mockPlayer.getConfiguration.and.returnValue({key: 'value'});
348
- mockPlayer.isLive.and.returnValue(false);
349
-
350
- fakeConnectedSenders(1);
351
-
352
- expect(mockShakaMessageBus.messages.length).toBe(0);
353
- fakeIncomingMessage({
354
- type: 'init',
355
- initState: fakeInitState,
356
- appData: fakeAppData,
357
- }, mockShakaMessageBus);
358
-
359
- expect(mockPlayer.getPlayheadTimeAsDate).not.toHaveBeenCalled();
360
- });
361
-
362
- it('does poll live methods while loading a livestream', () => {
363
- mockPlayer.getConfiguration.and.returnValue({key: 'value'});
364
- mockPlayer.isLive.and.returnValue(true);
365
-
366
- fakeConnectedSenders(1);
367
-
368
- expect(mockShakaMessageBus.messages.length).toBe(0);
369
- fakeIncomingMessage({
370
- type: 'init',
371
- initState: fakeInitState,
372
- appData: fakeAppData,
373
- }, mockShakaMessageBus);
374
-
375
- expect(mockPlayer.getPlayheadTimeAsDate).toHaveBeenCalled();
376
- });
377
-
378
- it('loads the manifest', () => {
379
- fakeInitState.startTime = 12;
380
- fakeInitState.manifest = 'foo://bar';
381
- expect(mockPlayer.load).not.toHaveBeenCalled();
382
-
383
- fakeIncomingMessage({
384
- type: 'init',
385
- initState: fakeInitState,
386
- appData: fakeAppData,
387
- }, mockShakaMessageBus);
388
-
389
- expect(mockPlayer.load).toHaveBeenCalledWith('foo://bar', 12);
390
- });
391
-
392
- it('plays the video after loading', async () => {
393
- fakeInitState.manifest = 'foo://bar';
394
- mockVideo.autoplay = true;
395
-
396
- fakeIncomingMessage({
397
- type: 'init',
398
- initState: fakeInitState,
399
- appData: fakeAppData,
400
- }, mockShakaMessageBus);
401
-
402
- // Video autoplay inhibited:
403
- expect(mockVideo.autoplay).toBe(false);
404
- await shaka.test.Util.shortDelay();
405
- expect(mockVideo.play).toHaveBeenCalled();
406
- // Video autoplay restored:
407
- expect(mockVideo.autoplay).toBe(true);
408
- });
409
-
410
- it('does not load or play without a manifest URI', async () => {
411
- fakeInitState.manifest = null;
412
-
413
- fakeIncomingMessage({
414
- type: 'init',
415
- initState: fakeInitState,
416
- appData: fakeAppData,
417
- }, mockShakaMessageBus);
418
-
419
- await shaka.test.Util.shortDelay();
420
- // Nothing loaded or played:
421
- expect(mockPlayer.load).not.toHaveBeenCalled();
422
- expect(mockVideo.play).not.toHaveBeenCalled();
423
-
424
- // State was still transferred, though:
425
- expect(mockPlayer.setTextTrackVisibility).toHaveBeenCalledWith(
426
- fakeInitState.playerAfterLoad.setTextTrackVisibility);
427
- expect(mockVideo.loop).toBe(fakeInitState.video.loop);
428
- expect(mockVideo.playbackRate).toBe(fakeInitState.video.playbackRate);
429
- });
430
-
431
- it('triggers an "error" event if load fails', async () => {
432
- fakeInitState.manifest = 'foo://bar';
433
- const fakeError = new shaka.util.Error(
434
- shaka.util.Error.Severity.CRITICAL,
435
- shaka.util.Error.Category.MANIFEST,
436
- shaka.util.Error.Code.UNABLE_TO_GUESS_MANIFEST_TYPE);
437
- mockPlayer.load.and.returnValue(Promise.reject(fakeError));
438
-
439
- const listener = jasmine.createSpy('listener');
440
- mockPlayer.addEventListener('error', listener);
441
- expect(listener).not.toHaveBeenCalled();
442
-
443
- fakeIncomingMessage({
444
- type: 'init',
445
- initState: fakeInitState,
446
- appData: fakeAppData,
447
- }, mockShakaMessageBus);
448
-
449
- await shaka.test.Util.shortDelay();
450
- expect(mockPlayer.load).toHaveBeenCalled();
451
- expect(mockPlayer.dispatchEvent).toHaveBeenCalledWith(
452
- jasmine.objectContaining({type: 'error', detail: fakeError}));
453
- });
454
- });
455
-
456
- describe('"appData" message', () => {
457
- beforeEach(() => {
458
- receiver = new CastReceiver(
459
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
460
- });
461
-
462
- it('triggers the app data callback', () => {
463
- expect(mockAppDataCallback).not.toHaveBeenCalled();
464
-
465
- const fakeAppData = {myFakeAppData: 1234};
466
- fakeIncomingMessage({
467
- type: 'appData',
468
- appData: fakeAppData,
469
- }, mockShakaMessageBus);
470
-
471
- expect(mockAppDataCallback).toHaveBeenCalledWith(fakeAppData);
472
- });
473
- });
474
-
475
- describe('"set" message', () => {
476
- beforeEach(() => {
477
- receiver = new CastReceiver(
478
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
479
- });
480
-
481
- it('sets local properties', () => {
482
- expect(mockVideo.currentTime).toBe(0);
483
- fakeIncomingMessage({
484
- type: 'set',
485
- targetName: 'video',
486
- property: 'currentTime',
487
- value: 12,
488
- }, mockShakaMessageBus);
489
- expect(mockVideo.currentTime).toBe(12);
490
-
491
- expect(mockPlayer['arbitraryName']).toBe(undefined);
492
- fakeIncomingMessage({
493
- type: 'set',
494
- targetName: 'player',
495
- property: 'arbitraryName',
496
- value: 'arbitraryValue',
497
- }, mockShakaMessageBus);
498
- expect(mockPlayer['arbitraryName']).toBe('arbitraryValue');
499
- });
500
-
501
- it('routes volume properties to the receiver manager', () => {
502
- expect(mockVideo.volume).toBe(1);
503
- expect(mockVideo.muted).toBe(false);
504
- expect(mockReceiverManager.setSystemVolumeLevel).not.toHaveBeenCalled();
505
- expect(mockReceiverManager.setSystemVolumeMuted).not.toHaveBeenCalled();
506
-
507
- fakeIncomingMessage({
508
- type: 'set',
509
- targetName: 'video',
510
- property: 'volume',
511
- value: 0.5,
512
- }, mockShakaMessageBus);
513
- fakeIncomingMessage({
514
- type: 'set',
515
- targetName: 'video',
516
- property: 'muted',
517
- value: true,
518
- }, mockShakaMessageBus);
519
-
520
- expect(mockVideo.volume).toBe(1);
521
- expect(mockVideo.muted).toBe(false);
522
- expect(mockReceiverManager.setSystemVolumeLevel)
523
- .toHaveBeenCalledWith(0.5);
524
- expect(mockReceiverManager.setSystemVolumeMuted)
525
- .toHaveBeenCalledWith(true);
526
- });
527
- });
528
-
529
- describe('"call" message', () => {
530
- beforeEach(() => {
531
- receiver = new CastReceiver(
532
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
533
- });
534
-
535
- it('calls local methods', () => {
536
- expect(mockVideo.play).not.toHaveBeenCalled();
537
- fakeIncomingMessage({
538
- type: 'call',
539
- targetName: 'video',
540
- methodName: 'play',
541
- args: [1, 2, 3],
542
- }, mockShakaMessageBus);
543
- expect(mockVideo.play).toHaveBeenCalledWith(1, 2, 3);
544
-
545
- expect(mockPlayer.configure).not.toHaveBeenCalled();
546
- fakeIncomingMessage({
547
- type: 'call',
548
- targetName: 'player',
549
- methodName: 'configure',
550
- args: [42],
551
- }, mockShakaMessageBus);
552
- expect(mockPlayer.configure).toHaveBeenCalledWith(42);
553
- });
554
- });
555
-
556
- describe('"asyncCall" message', () => {
557
- /** @const */
558
- const fakeSenderId = 'senderId';
559
- /** @const */
560
- const fakeCallId = '5';
561
- /** @type {!shaka.util.PublicPromise} */
562
- let p;
563
-
564
- beforeEach(() => {
565
- receiver = new CastReceiver(
566
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
567
-
568
- fakeConnectedSenders(1);
569
- p = new shaka.util.PublicPromise();
570
- mockPlayer.load.and.returnValue(p);
571
-
572
- expect(mockPlayer.load).not.toHaveBeenCalled();
573
- fakeIncomingMessage({
574
- type: 'asyncCall',
575
- id: fakeCallId,
576
- targetName: 'player',
577
- methodName: 'load',
578
- args: ['foo://bar', 12],
579
- }, mockShakaMessageBus, fakeSenderId);
580
- });
581
-
582
- it('calls local async methods', () => {
583
- expect(mockPlayer.load).toHaveBeenCalledWith('foo://bar', 12);
584
- p.resolve();
585
- });
586
-
587
- it('sends "asyncComplete" replies when resolved', async () => {
588
- // No messages have been sent, either broadcast or privately.
589
- expect(mockShakaMessageBus.broadcast).not.toHaveBeenCalled();
590
- expect(mockShakaMessageBus.getCastChannel).not.toHaveBeenCalled();
591
-
592
- p.resolve();
593
- await shaka.test.Util.shortDelay();
594
- // No broadcast messages have been sent, but a private message has
595
- // been sent to the sender who started the async call.
596
- expect(mockShakaMessageBus.broadcast).not.toHaveBeenCalled();
597
- expect(mockShakaMessageBus.getCastChannel).toHaveBeenCalledWith(
598
- fakeSenderId);
599
- const senderChannel = mockShakaMessageBus.getCastChannel();
600
- expect(senderChannel.messages).toEqual([{
601
- type: 'asyncComplete',
602
- id: fakeCallId,
603
- error: null,
604
- }]);
605
- });
606
-
607
- it('sends "asyncComplete" replies when rejected', async () => {
608
- // No messages have been sent, either broadcast or privately.
609
- expect(mockShakaMessageBus.broadcast).not.toHaveBeenCalled();
610
- expect(mockShakaMessageBus.getCastChannel).not.toHaveBeenCalled();
611
-
612
- const fakeError = new shaka.util.Error(
613
- shaka.util.Error.Severity.CRITICAL,
614
- shaka.util.Error.Category.MANIFEST,
615
- shaka.util.Error.Code.UNABLE_TO_GUESS_MANIFEST_TYPE);
616
- p.reject(fakeError);
617
- await shaka.test.Util.shortDelay();
618
- // No broadcast messages have been sent, but a private message has
619
- // been sent to the sender who started the async call.
620
- expect(mockShakaMessageBus.broadcast).not.toHaveBeenCalled();
621
- expect(mockShakaMessageBus.getCastChannel).toHaveBeenCalledWith(
622
- fakeSenderId);
623
- const senderChannel = mockShakaMessageBus.getCastChannel();
624
- expect(senderChannel.messages).toEqual([{
625
- type: 'asyncComplete',
626
- id: fakeCallId,
627
- error: jasmine.any(Object),
628
- }]);
629
- if (senderChannel.messages.length) {
630
- const error = senderChannel.messages[0].error;
631
- shaka.test.Util.expectToEqualError(fakeError, error);
632
- }
633
- });
634
- });
635
-
636
- describe('sends duration', () => {
637
- beforeEach(async () => {
638
- receiver = new CastReceiver(
639
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
640
- fakeConnectedSenders(1);
641
- mockPlayer.load.and.callFake(() => {
642
- mockVideo.duration = 1;
643
- mockPlayer.getAssetUri = () => 'URI A';
644
- return Promise.resolve();
645
- });
646
- fakeIncomingMessage({
647
- type: 'init',
648
- initState: {manifest: 'URI A'},
649
- appData: {},
650
- }, mockShakaMessageBus);
651
-
652
- // The messages will show up asychronously:
653
- await Util.shortDelay();
654
- expectMediaInfo('URI A', 1);
655
- mockGenericMessageBus.messages = [];
656
- });
657
-
658
- it('only once, if nothing else changes', async () => {
659
- await Util.shortDelay();
660
- expect(mockGenericMessageBus.messages.length).toBe(0);
661
- });
662
-
663
- it('after new sender connects', async () => {
664
- fakeConnectedSenders(1);
665
- await Util.shortDelay();
666
- expectMediaInfo('URI A', 1);
667
- expect(mockGenericMessageBus.messages.length).toBe(0);
668
- });
669
-
670
- it('for correct manifest after loading new', async () => {
671
- // Change media information, but only after a delay.
672
- mockPlayer.load.and.callFake(async () => {
673
- await Util.shortDelay();
674
- mockVideo.duration = 2;
675
- mockPlayer.getAssetUri = () => 'URI B';
676
- });
677
- fakeIncomingMessage({
678
- type: 'asyncCall',
679
- id: '5',
680
- targetName: 'player',
681
- methodName: 'load',
682
- args: ['URI B'],
683
- }, mockShakaMessageBus, 'senderId');
684
-
685
- // Wait for the mockPlayer to finish 'loading' before checking again.
686
- await Util.shortDelay();
687
- await Util.shortDelay(); // Delay again for the delay in "load" above.
688
- expectMediaInfo('URI B', 2); // pollAttributes_
689
- expect(mockGenericMessageBus.messages.length).toBe(0);
690
- });
691
-
692
- it('after LOAD system message', async () => {
693
- mockPlayer.load.and.callFake(() => {
694
- mockVideo.duration = 2;
695
- mockPlayer.getAssetUri = () => 'URI B';
696
- return Promise.resolve();
697
- });
698
- const message = {
699
- // Arbitrary number
700
- 'requestId': 0,
701
- 'type': 'LOAD',
702
- 'autoplay': false,
703
- 'currentTime': 10,
704
- 'media': {
705
- 'contentId': 'URI B',
706
- 'contentType': 'video/mp4',
707
- 'streamType': 'BUFFERED',
708
- },
709
- };
710
- fakeIncomingMessage(message, mockGenericMessageBus);
711
-
712
- await Util.shortDelay();
713
- expectMediaInfo('URI B', 2);
714
- expect(mockGenericMessageBus.messages.length).toBe(0);
715
- });
716
- });
717
-
718
- describe('respects generic control messages', () => {
719
- beforeEach(async () => {
720
- receiver = new CastReceiver(
721
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
722
- fakeConnectedSenders(1);
723
-
724
- mockPlayer.load.and.callFake(() => {
725
- mockVideo.duration = 1;
726
- mockPlayer.getAssetUri = () => 'URI A';
727
- return Promise.resolve();
728
- });
729
- fakeIncomingMessage({
730
- type: 'init',
731
- initState: {manifest: 'URI A'},
732
- appData: {},
733
- }, mockShakaMessageBus);
734
-
735
- // The messages will show up asychronously:
736
- await Util.shortDelay();
737
- expectMediaInfo('URI A', 1);
738
- mockGenericMessageBus.messages = [];
739
- });
740
-
741
- it('get status', () => {
742
- const message = {
743
- // Arbitrary number
744
- 'requestId': 0,
745
- 'type': 'GET_STATUS',
746
- };
747
-
748
- mockGenericMessageBus.broadcast.calls.reset();
749
- fakeIncomingMessage(message, mockGenericMessageBus);
750
- expect(mockGenericMessageBus.broadcast).toHaveBeenCalledTimes(1);
751
-
752
- // This covers the lack of scrubber in the Google Home app, as described
753
- // in https://github.com/shaka-project/shaka-player/issues/2606
754
- expectMediaInfo('URI A', 1);
755
- });
756
-
757
- it('play', () => {
758
- const message = {
759
- // Arbitrary number
760
- 'requestId': 0,
761
- 'type': 'PLAY',
762
- };
763
-
764
- fakeIncomingMessage(message, mockGenericMessageBus);
765
- expect(mockVideo.play).toHaveBeenCalled();
766
- });
767
-
768
- it('pause', () => {
769
- const message = {
770
- // Arbitrary number
771
- 'requestId': 0,
772
- 'type': 'PAUSE',
773
- };
774
-
775
- fakeIncomingMessage(message, mockGenericMessageBus);
776
- expect(mockVideo.pause).toHaveBeenCalled();
777
- });
778
-
779
- it('seek', () => {
780
- const message = {
781
- // Arbitrary number
782
- 'requestId': 0,
783
- 'type': 'SEEK',
784
- 'resumeState': 'PLAYBACK_START',
785
- 'currentTime': 10,
786
- };
787
-
788
- fakeIncomingMessage(message, mockGenericMessageBus);
789
- expect(mockVideo.play).toHaveBeenCalled();
790
- expect(mockVideo.currentTime).toBe(10);
791
- });
792
-
793
- it('stop', () => {
794
- const message = {
795
- // Arbitrary number
796
- 'requestId': 0,
797
- 'type': 'STOP',
798
- };
799
-
800
- fakeIncomingMessage(message, mockGenericMessageBus);
801
- expect(mockPlayer.unload).toHaveBeenCalled();
802
- });
803
-
804
- it('volume', () => {
805
- const message = {
806
- // Arbitrary number
807
- 'requestId': 0,
808
- 'type': 'VOLUME',
809
- 'volume': {
810
- 'level': 0.5,
811
- 'muted': true,
812
- },
813
- };
814
-
815
- fakeIncomingMessage(message, mockGenericMessageBus);
816
- expect(mockVideo.volume).toBe(0.5);
817
- expect(mockVideo.muted).toBe(true);
818
- });
819
-
820
- it('load', () => {
821
- const message = {
822
- // Arbitrary number
823
- 'requestId': 0,
824
- 'type': 'LOAD',
825
- 'autoplay': false,
826
- 'currentTime': 10,
827
- 'media': {
828
- 'contentId': 'manifestUri',
829
- 'contentType': 'video/mp4',
830
- 'streamType': 'BUFFERED',
831
- },
832
- };
833
-
834
- fakeIncomingMessage(message, mockGenericMessageBus);
835
- expect(mockPlayer.load).toHaveBeenCalled();
836
- });
837
-
838
- it('dispatches error on unrecognized request type', () => {
839
- const message = {
840
- // Arbitrary number
841
- 'requestId': 0,
842
- 'type': 'UNKNOWN_TYPE',
843
- };
844
-
845
- mockGenericMessageBus.broadcast.calls.reset();
846
- fakeIncomingMessage(message, mockGenericMessageBus);
847
- expect(mockGenericMessageBus.broadcast).toHaveBeenCalledTimes(1);
848
- expect(mockGenericMessageBus.messages).toEqual(jasmine.arrayContaining([
849
- jasmine.objectContaining({
850
- requestId: 0,
851
- type: 'INVALID_REQUEST',
852
- reason: 'INVALID_COMMAND',
853
- }),
854
- ]));
855
- });
856
- });
857
-
858
- describe('content metadata methods', () => {
859
- beforeEach(async () => {
860
- receiver = new CastReceiver(
861
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
862
- fakeConnectedSenders(1);
863
-
864
- mockPlayer.load.and.callFake(() => {
865
- mockVideo.duration = 1;
866
- mockPlayer.getAssetUri = () => 'URI A';
867
- return Promise.resolve();
868
- });
869
- fakeIncomingMessage({
870
- type: 'init',
871
- initState: {manifest: 'URI A'},
872
- appData: {},
873
- }, mockShakaMessageBus);
874
-
875
- // The messages will show up asychronously:
876
- await Util.shortDelay();
877
- expectMediaInfo('URI A', 1);
878
- mockGenericMessageBus.messages = [];
879
- });
880
-
881
- it('setContentMetadata sets arbitrary metadata', () => {
882
- // In reality, this should follow one of the object formats defined by the
883
- // Cast SDK. For unit testing, it can be anything.
884
- const metadata = {
885
- foo: 42,
886
- bar: 'any old bar',
887
- };
888
- receiver.setContentMetadata(metadata);
889
-
890
- getStatus();
891
- expectMediaInfo('URI A', 1, metadata);
892
- });
893
-
894
- it('setContentTitle sets the title individually', () => {
895
- const title = 'Title of the Song';
896
- receiver.setContentTitle(title);
897
-
898
- const expectedMetadata = {
899
- metadataType: cast.receiver.media.MetadataType.GENERIC,
900
- title,
901
- };
902
- getStatus();
903
- expectMediaInfo('URI A', 1, expectedMetadata);
904
- });
905
-
906
- it('setContentImage sets the image individually', () => {
907
- const imageUrl = 'https://i.ytimg.com/vi/281ax7Ovlsg/hqdefault.jpg';
908
- receiver.setContentImage(imageUrl);
909
-
910
- const expectedMetadata = {
911
- metadataType: cast.receiver.media.MetadataType.GENERIC,
912
- images: [
913
- {url: imageUrl},
914
- ],
915
- };
916
- getStatus();
917
- expectMediaInfo('URI A', 1, expectedMetadata);
918
- });
919
-
920
- it('setContentArtist sets the artist individually', () => {
921
- const artist = 'Da Vinci\'s Notebook';
922
-
923
- receiver.setContentArtist(artist);
924
-
925
- const expectedMetadata = {
926
- metadataType: cast.receiver.media.MetadataType.MUSIC_TRACK,
927
- artist,
928
- };
929
- getStatus();
930
- expectMediaInfo('URI A', 1, expectedMetadata);
931
- });
932
-
933
- it('setContentArtist creates music metadata after title', () => {
934
- const title = 'Title of the Song';
935
- const artist = 'Da Vinci\'s Notebook';
936
- // https://www.youtube.com/watch?v=734wnHnnNR4
937
-
938
- receiver.setContentTitle(title);
939
- receiver.setContentArtist(artist);
940
-
941
- const expectedMetadata = {
942
- metadataType: cast.receiver.media.MetadataType.MUSIC_TRACK,
943
- title,
944
- artist,
945
- };
946
- getStatus();
947
- expectMediaInfo('URI A', 1, expectedMetadata);
948
- });
949
-
950
- it('setContentArtist creates music metadata before title', () => {
951
- const title = 'Title of the Song';
952
- const artist = 'Da Vinci\'s Notebook';
953
- // https://www.youtube.com/watch?v=734wnHnnNR4
954
-
955
- receiver.setContentArtist(artist);
956
- receiver.setContentTitle(title);
957
-
958
- const expectedMetadata = {
959
- metadataType: cast.receiver.media.MetadataType.MUSIC_TRACK,
960
- title,
961
- artist,
962
- };
963
- getStatus();
964
- expectMediaInfo('URI A', 1, expectedMetadata);
965
- });
966
-
967
- it('clearContentMetadata clears all metadata', () => {
968
- const title = 'Title of the Song';
969
-
970
- receiver.setContentTitle(title);
971
- receiver.clearContentMetadata();
972
-
973
- const expectedMetadata = undefined;
974
- getStatus();
975
- expectMediaInfo('URI A', 1, expectedMetadata);
976
- });
977
-
978
- function getStatus() {
979
- const message = {
980
- // Arbitrary number
981
- 'requestId': 0,
982
- 'type': 'GET_STATUS',
983
- };
984
-
985
- mockGenericMessageBus.broadcast.calls.reset();
986
- fakeIncomingMessage(message, mockGenericMessageBus);
987
- expect(mockGenericMessageBus.broadcast).toHaveBeenCalledTimes(1);
988
- }
989
- });
990
-
991
- describe('destroy', () => {
992
- beforeEach(() => {
993
- receiver = new CastReceiver(
994
- mockVideo, mockPlayer, Util.spyFunc(mockAppDataCallback));
995
- });
996
-
997
- it('destroys the local player', async () => {
998
- expect(mockPlayer.destroy).not.toHaveBeenCalled();
999
- await receiver.destroy();
1000
- expect(mockPlayer.destroy).toHaveBeenCalled();
1001
- });
1002
-
1003
- it('stops polling', async () => {
1004
- // Start polling:
1005
- fakeIncomingMessage({
1006
- type: 'init',
1007
- initState: {},
1008
- appData: {},
1009
- }, mockShakaMessageBus);
1010
-
1011
- mockPlayer.getConfiguration.calls.reset();
1012
- await shaka.test.Util.shortDelay();
1013
- // We have polled at least once, so this getter has been called.
1014
- expect(mockPlayer.getConfiguration).toHaveBeenCalled();
1015
- mockPlayer.getConfiguration.calls.reset();
1016
- // Destroy the receiver.
1017
- await receiver.destroy();
1018
-
1019
- // Wait another second.
1020
- await shaka.test.Util.shortDelay();
1021
-
1022
- // We have not polled again since destruction.
1023
- expect(mockPlayer.getConfiguration).not.toHaveBeenCalled();
1024
- });
1025
-
1026
- it('stops the receiver manager', async () => {
1027
- expect(mockReceiverManager.stop).not.toHaveBeenCalled();
1028
- await receiver.destroy();
1029
- expect(mockReceiverManager.stop).toHaveBeenCalled();
1030
- });
1031
- });
1032
-
1033
- function createMockReceiverApi() {
1034
- return {
1035
- CastReceiverManager: {
1036
- getInstance: () => mockReceiverManager,
1037
- },
1038
- media: {
1039
- // Defined by the SDK, but we aren't loading it here.
1040
- MetadataType: {
1041
- GENERIC: 0,
1042
- MUSIC_TRACK: 3,
1043
- },
1044
- },
1045
- };
1046
- }
1047
-
1048
- function createMockReceiverManager() {
1049
- return {
1050
- start: jasmine.createSpy('CastReceiverManager.start'),
1051
- stop: jasmine.createSpy('CastReceiverManager.stop'),
1052
- setSystemVolumeLevel:
1053
- jasmine.createSpy('CastReceiverManager.setSystemVolumeLevel'),
1054
- setSystemVolumeMuted:
1055
- jasmine.createSpy('CastReceiverManager.setSystemVolumeMuted'),
1056
- getSenders: jasmine.createSpy('CastReceiverManager.getSenders'),
1057
- getSystemVolume: () => ({level: 1, muted: false}),
1058
- getCastMessageBus: (namespace) => {
1059
- if (namespace == shaka.cast.CastUtils.SHAKA_MESSAGE_NAMESPACE) {
1060
- return mockShakaMessageBus;
1061
- }
1062
-
1063
- return mockGenericMessageBus;
1064
- },
1065
- };
1066
- }
1067
-
1068
- function createMockMessageBus() {
1069
- const bus = {
1070
- messages: [],
1071
- broadcast: jasmine.createSpy('CastMessageBus.broadcast'),
1072
- getCastChannel: jasmine.createSpy('CastMessageBus.getCastChannel'),
1073
- };
1074
- // For convenience, deserialize and store sent messages.
1075
- bus.broadcast.and.callFake((message) => {
1076
- bus.messages.push(CastUtils.deserialize(message));
1077
- });
1078
- const channel = {
1079
- messages: [],
1080
- send: (message) => {
1081
- channel.messages.push(CastUtils.deserialize(message));
1082
- },
1083
- };
1084
- bus.getCastChannel.and.returnValue(channel);
1085
- return bus;
1086
- }
1087
-
1088
- function createMockPlayer() {
1089
- const player = {
1090
- destroy: jasmine.createSpy('destroy').and.returnValue(Promise.resolve()),
1091
- setMaxHardwareResolution: jasmine.createSpy('setMaxHardwareResolution'),
1092
-
1093
- addEventListener: (eventName, listener) => {
1094
- player.listeners[eventName] = listener;
1095
- },
1096
- removeEventListener: (eventName, listener) => {
1097
- player.listeners[eventName] = null;
1098
- },
1099
- dispatchEvent: jasmine.createSpy('dispatchEvent'),
1100
- // For convenience:
1101
- listeners: {},
1102
- };
1103
-
1104
- for (const name of CastUtils.PlayerVoidMethods) {
1105
- player[name] = jasmine.createSpy(name);
1106
- }
1107
- for (const name in CastUtils.PlayerGetterMethods) {
1108
- player[name] = jasmine.createSpy(name);
1109
- }
1110
- for (const name in CastUtils.LargePlayerGetterMethods) {
1111
- player[name] = jasmine.createSpy(name);
1112
- }
1113
- for (const name in CastUtils.PlayerGetterMethodsThatRequireLive) {
1114
- player[name] = jasmine.createSpy(name);
1115
- }
1116
- for (const name of CastUtils.PlayerPromiseMethods) {
1117
- player[name] = jasmine.createSpy(name).and.returnValue(Promise.resolve());
1118
- }
1119
-
1120
- return player;
1121
- }
1122
-
1123
- /**
1124
- * @param {number} num
1125
- */
1126
- function fakeConnectedSenders(num) {
1127
- const senderArray = [];
1128
- while (num--) {
1129
- senderArray.push('senderId');
1130
- }
1131
-
1132
- mockReceiverManager.getSenders.and.returnValue(senderArray);
1133
- mockReceiverManager.onSenderConnected();
1134
- }
1135
-
1136
- /**
1137
- * @param {*} message
1138
- * @param {!cast.receiver.CastMessageBus} bus
1139
- * @param {string=} senderId
1140
- */
1141
- function fakeIncomingMessage(message, bus, senderId) {
1142
- const serialized = CastUtils.serialize(message);
1143
- const messageEvent = {
1144
- senderId: senderId,
1145
- data: serialized,
1146
- };
1147
- bus.onMessage(messageEvent);
1148
- }
1149
-
1150
- /**
1151
- * @param {string} expectedUri
1152
- * @param {number} expectedDuration
1153
- * @param {Object=} metadata
1154
- */
1155
- function expectMediaInfo(expectedUri, expectedDuration, metadata=null) {
1156
- expect(mockGenericMessageBus.messages.length).toBeGreaterThan(0);
1157
- if (mockGenericMessageBus.messages.length == 0) {
1158
- return;
1159
- }
1160
-
1161
- const expectedMedia = {
1162
- contentId: expectedUri,
1163
- streamType: 'BUFFERED',
1164
- duration: expectedDuration,
1165
- contentType: '',
1166
- };
1167
-
1168
- if (metadata) {
1169
- // This field only sometimes shows up.
1170
- // Setting it to null would cause the check below to fail.
1171
- expectedMedia.metadata = metadata;
1172
- }
1173
-
1174
- expect(mockGenericMessageBus.messages[0]).toEqual({
1175
- requestId: 0,
1176
- type: 'MEDIA_STATUS',
1177
- status: [jasmine.objectContaining({
1178
- media: expectedMedia,
1179
- })],
1180
- });
1181
- mockGenericMessageBus.messages.shift();
1182
- }
1183
- });