shaka-player 3.3.0 → 3.3.3

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 (344) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/pull_request_template.md +6 -34
  4. package/.github/workflows/build-and-test.yaml +130 -0
  5. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  6. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  7. package/.github/workflows/demo-version-index.yaml +29 -0
  8. package/.github/workflows/nightly-demo.yaml +42 -0
  9. package/.github/workflows/release-please.yaml +145 -0
  10. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  11. package/.github/workflows/selenium-lab-tests.yaml +93 -0
  12. package/AUTHORS +2 -0
  13. package/CHANGELOG.md +1722 -1640
  14. package/CONTRIBUTING.md +2 -2
  15. package/CONTRIBUTORS +2 -0
  16. package/README.md +7 -7
  17. package/app-engine/README.md +9 -0
  18. package/app-engine/demo-version-index/README.md +14 -0
  19. package/app-engine/demo-version-index/app.yaml +2 -0
  20. package/app-engine/demo-version-index/main.py +162 -0
  21. package/app-engine/demo-version-index/requirements.txt +6 -0
  22. package/app-engine/demo-version-index/templates/index.html +114 -0
  23. package/app-engine/shaka-player-demo/README.md +18 -0
  24. package/app-engine/shaka-player-demo/app.yaml +61 -0
  25. package/app-engine/shaka-player-demo/main.py +95 -0
  26. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  27. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  28. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  29. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  30. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  31. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  32. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  33. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  34. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  35. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  36. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  37. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  38. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  39. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  40. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  41. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  42. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  43. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  44. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  45. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  46. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  47. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  48. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  49. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  50. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  51. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  52. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  53. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  54. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  55. package/app-engine/shaka-player-demo/posters.py +110 -0
  56. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  57. package/app-engine/shaka-player-demo/time.txt +1 -0
  58. package/build/README.md +1 -1
  59. package/build/checkversion.py +1 -1
  60. package/build/conformance.textproto +196 -169
  61. package/build/docker/Dockerfile +20 -0
  62. package/build/docker/docker-compose.yml +10 -0
  63. package/build/gendeps.py +18 -15
  64. package/build/shaka-lab.yaml +163 -0
  65. package/build/shakaBuildHelpers.py +4 -29
  66. package/build/test.py +93 -28
  67. package/build/types/polyfill +1 -0
  68. package/build/wrapper.template.js +2 -2
  69. package/demo/TengwarTelcontar.woff2 +0 -0
  70. package/demo/asset_card.js +1 -2
  71. package/demo/cast_receiver/index.html +1 -1
  72. package/demo/cast_receiver/receiver_app.css +14 -14
  73. package/demo/common/assets.js +2 -0
  74. package/demo/config.js +0 -1
  75. package/demo/custom.js +0 -1
  76. package/demo/customWarning.txt +2 -2
  77. package/demo/demo.less +29 -18
  78. package/demo/demo_uncompiled.js +1 -13
  79. package/demo/index.html +1 -1
  80. package/demo/main.js +3 -3
  81. package/dist/controls.css +3 -3
  82. package/dist/controls.css.map +1 -1
  83. package/dist/demo.compiled.debug.js +191 -194
  84. package/dist/demo.compiled.debug.map +4 -4
  85. package/dist/demo.compiled.js +191 -194
  86. package/dist/demo.compiled.map +4 -4
  87. package/dist/demo.css +1 -1
  88. package/dist/demo.css.map +1 -1
  89. package/dist/deps.js +233 -226
  90. package/dist/locales.js +30 -30
  91. package/dist/receiver.compiled.debug.js +43 -45
  92. package/dist/receiver.compiled.debug.map +4 -4
  93. package/dist/receiver.compiled.js +43 -45
  94. package/dist/receiver.compiled.map +4 -4
  95. package/dist/shaka-player.compiled.d.ts +272 -238
  96. package/dist/shaka-player.compiled.debug.d.ts +272 -238
  97. package/dist/shaka-player.compiled.debug.externs.js +53 -16
  98. package/dist/shaka-player.compiled.debug.js +393 -394
  99. package/dist/shaka-player.compiled.debug.map +4 -4
  100. package/dist/shaka-player.compiled.externs.js +53 -16
  101. package/dist/shaka-player.compiled.js +840 -843
  102. package/dist/shaka-player.compiled.map +4 -4
  103. package/dist/shaka-player.ui.d.ts +318 -293
  104. package/dist/shaka-player.ui.debug.d.ts +318 -293
  105. package/dist/shaka-player.ui.debug.externs.js +55 -27
  106. package/dist/shaka-player.ui.debug.js +415 -417
  107. package/dist/shaka-player.ui.debug.map +4 -4
  108. package/dist/shaka-player.ui.externs.js +55 -27
  109. package/dist/shaka-player.ui.js +997 -1000
  110. package/dist/shaka-player.ui.map +4 -4
  111. package/docs/design/REDESIGN.md +33 -33
  112. package/docs/design/bg-fetch.md +2 -2
  113. package/docs/design/codec_preferences.md +1 -1
  114. package/docs/design/dash-audio-channels.md +3 -3
  115. package/docs/design/dash-manifests.md +1 -1
  116. package/docs/design/gap-jumping.md +3 -3
  117. package/docs/design/preload.md +2 -2
  118. package/docs/tutorials/faq.md +8 -8
  119. package/docs/tutorials/index.json +1 -0
  120. package/docs/tutorials/plugins.md +3 -3
  121. package/docs/tutorials/selenium-grid-config.md +122 -0
  122. package/docs/tutorials/welcome.md +10 -2
  123. package/externs/cmcd.js +186 -0
  124. package/externs/shaka/player.js +8 -0
  125. package/externs/shaka/text.js +10 -0
  126. package/karma.conf.js +156 -45
  127. package/lib/abr/simple_abr_manager.js +12 -6
  128. package/lib/ads/ad_manager.js +1 -0
  129. package/lib/cast/cast_proxy.js +6 -4
  130. package/lib/cast/cast_receiver.js +3 -0
  131. package/lib/cea/cea608_data_channel.js +2 -2
  132. package/lib/cea/cea708_service.js +5 -4
  133. package/lib/cea/mp4_cea_parser.js +11 -5
  134. package/lib/cea/sei_processor.js +6 -3
  135. package/lib/dash/dash_parser.js +40 -30
  136. package/lib/dash/mpd_utils.js +4 -5
  137. package/lib/dash/segment_list.js +1 -2
  138. package/lib/dash/segment_template.js +3 -3
  139. package/lib/hls/hls_parser.js +41 -9
  140. package/lib/hls/manifest_text_parser.js +4 -3
  141. package/lib/media/adaptation_set.js +1 -2
  142. package/lib/media/content_workarounds.js +2 -2
  143. package/lib/media/drm_engine.js +3 -2
  144. package/lib/media/media_source_engine.js +3 -2
  145. package/lib/media/mp4_segment_index_parser.js +1 -4
  146. package/lib/media/playhead.js +2 -2
  147. package/lib/media/presentation_timeline.js +18 -8
  148. package/lib/media/quality_observer.js +17 -34
  149. package/lib/media/region_observer.js +39 -33
  150. package/lib/media/region_timeline.js +17 -19
  151. package/lib/media/segment_index.js +2 -1
  152. package/lib/media/segment_reference.js +19 -1
  153. package/lib/media/streaming_engine.js +12 -9
  154. package/lib/media/time_ranges_utils.js +1 -3
  155. package/lib/media/video_wrapper.js +1 -1
  156. package/lib/net/networking_engine.js +5 -1
  157. package/lib/offline/storage.js +12 -13
  158. package/lib/player.js +87 -41
  159. package/lib/polyfill/all.js +2 -3
  160. package/lib/polyfill/encryption_scheme.js +1 -1
  161. package/lib/polyfill/media_capabilities.js +32 -17
  162. package/lib/polyfill/mediasource.js +1 -1
  163. package/lib/polyfill/symbol.js +46 -0
  164. package/lib/text/cue.js +7 -1
  165. package/lib/text/simple_text_displayer.js +2 -1
  166. package/lib/text/ttml_text_parser.js +92 -63
  167. package/lib/text/ui_text_displayer.js +18 -12
  168. package/lib/util/buffer_utils.js +1 -3
  169. package/lib/util/cmcd_manager.js +47 -201
  170. package/lib/util/ebml_parser.js +3 -3
  171. package/lib/util/error.js +1 -1
  172. package/lib/util/fake_event_target.js +21 -1
  173. package/lib/util/iterables.js +0 -46
  174. package/lib/util/mp4_box_parsers.js +1 -4
  175. package/lib/util/mp4_parser.js +5 -7
  176. package/lib/util/periods.js +10 -11
  177. package/lib/util/platform.js +3 -3
  178. package/lib/util/pssh.js +1 -4
  179. package/lib/util/stream_utils.js +88 -11
  180. package/lib/util/string_utils.js +3 -5
  181. package/lib/util/uint8array_utils.js +3 -5
  182. package/lib/util/xml_utils.js +34 -7
  183. package/package.json +62 -40
  184. package/roadmap.md +17 -17
  185. package/shaka-player.uncompiled.js +1 -0
  186. package/test/abr/simple_abr_manager_unit.js +3 -8
  187. package/test/ads/ad_manager_unit.js +0 -6
  188. package/test/cast/cast_proxy_unit.js +0 -8
  189. package/test/cast/cast_receiver_integration.js +1 -18
  190. package/test/cast/cast_receiver_unit.js +1 -9
  191. package/test/cast/cast_sender_unit.js +0 -6
  192. package/test/cast/cast_utils_unit.js +0 -13
  193. package/test/cea/cea608_memory_unit.js +0 -5
  194. package/test/cea/cea708_service_unit.js +0 -7
  195. package/test/cea/cea708_window_unit.js +0 -5
  196. package/test/cea/cea_decoder_unit.js +0 -6
  197. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  198. package/test/cea/dtvcc_packet_unit.js +0 -5
  199. package/test/cea/mp4_cea_parser_unit.js +0 -4
  200. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  201. package/test/dash/dash_parser_live_unit.js +45 -15
  202. package/test/dash/dash_parser_manifest_unit.js +4 -17
  203. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  204. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  205. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  206. package/test/dash/mpd_utils_unit.js +3 -11
  207. package/test/demo/demo_unit.js +0 -5
  208. package/test/deprecate/enforcer_unit.js +0 -4
  209. package/test/deprecate/version_unit.js +0 -2
  210. package/test/hls/hls_live_unit.js +2 -14
  211. package/test/hls/hls_parser_unit.js +76 -15
  212. package/test/hls/manifest_text_parser_unit.js +0 -10
  213. package/test/media/adaptation_set_criteria_unit.js +3 -7
  214. package/test/media/adaptation_set_unit.js +0 -2
  215. package/test/media/buffering_observer_unit.js +1 -4
  216. package/test/media/closed_caption_parser_unit.js +0 -3
  217. package/test/media/drm_engine_integration.js +2 -15
  218. package/test/media/drm_engine_unit.js +7 -27
  219. package/test/media/manifest_parser_unit.js +0 -4
  220. package/test/media/media_source_engine_integration.js +0 -7
  221. package/test/media/media_source_engine_unit.js +1 -14
  222. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  223. package/test/media/play_rate_controller_unit.js +0 -4
  224. package/test/media/playhead_unit.js +8 -16
  225. package/test/media/presentation_timeline_unit.js +4 -7
  226. package/test/media/quality_observer_unit.js +4 -5
  227. package/test/media/region_observer_unit.js +40 -10
  228. package/test/media/region_timeline_unit.js +40 -25
  229. package/test/media/segment_index_unit.js +0 -6
  230. package/test/media/segment_reference_unit.js +0 -3
  231. package/test/media/stall_detector_unit.js +0 -5
  232. package/test/media/streaming_engine_integration.js +11 -37
  233. package/test/media/streaming_engine_unit.js +155 -34
  234. package/test/media/time_ranges_utils_unit.js +0 -2
  235. package/test/media/transmuxer_integration.js +0 -6
  236. package/test/media/webm_segment_index_parser_unit.js +0 -4
  237. package/test/net/data_uri_plugin_unit.js +0 -7
  238. package/test/net/http_plugin_unit.js +0 -9
  239. package/test/net/networking_engine_unit.js +0 -11
  240. package/test/offline/download_progress_estimator_unit.js +0 -2
  241. package/test/offline/indexeddb_storage_unit.js +0 -6
  242. package/test/offline/manifest_convert_unit.js +0 -8
  243. package/test/offline/offline_integration.js +1 -10
  244. package/test/offline/offline_manifest_parser_unit.js +0 -6
  245. package/test/offline/offline_scheme_unit.js +0 -8
  246. package/test/offline/offline_uri_unit.js +0 -2
  247. package/test/offline/storage_compatibility_unit.js +1 -14
  248. package/test/offline/storage_integration.js +1 -27
  249. package/test/player_external.js +2 -10
  250. package/test/player_integration.js +63 -36
  251. package/test/player_load_graph_integration.js +1 -6
  252. package/test/player_src_equals_external.js +3 -9
  253. package/test/player_src_equals_integration.js +41 -15
  254. package/test/player_unit.js +71 -46
  255. package/test/routing/walker_unit.js +0 -8
  256. package/test/test/assets/chapters.vtt +2 -2
  257. package/test/test/assets/chapters2.vtt +10 -0
  258. package/test/test/assets/large_file.mpd +1 -1
  259. package/test/test/boot.js +75 -22
  260. package/test/test/externs/jasmine.js +2 -2
  261. package/test/test/externs/karma.js +4 -0
  262. package/test/test/namespace.js +10 -0
  263. package/test/test/util/canned_idb.js +0 -8
  264. package/test/test/util/cea_utils.js +0 -6
  265. package/test/test/util/dash_parser_util.js +0 -13
  266. package/test/test/util/fake_ad.js +0 -3
  267. package/test/test/util/fake_ad_manager.js +0 -9
  268. package/test/test/util/fake_demo_main.js +0 -5
  269. package/test/test/util/fake_drm_engine.js +0 -6
  270. package/test/test/util/fake_media_source_engine.js +0 -7
  271. package/test/test/util/fake_networking_engine.js +0 -5
  272. package/test/test/util/fake_text_displayer.js +0 -5
  273. package/test/test/util/indexeddb_utils.js +1 -10
  274. package/test/test/util/jasmine_fetch.js +0 -1
  275. package/test/test/util/loader.js +0 -18
  276. package/test/test/util/manifest_generator.js +9 -14
  277. package/test/test/util/manifest_parser_util.js +0 -6
  278. package/test/test/util/offline_utils.js +0 -5
  279. package/test/test/util/simple_fakes.js +9 -26
  280. package/test/test/util/stream_generator.js +0 -14
  281. package/test/test/util/streaming_engine_util.js +0 -15
  282. package/test/test/util/test_scheme.js +1 -19
  283. package/test/test/util/ttml_utils.js +79 -0
  284. package/test/test/util/ui_utils.js +0 -9
  285. package/test/test/util/util.js +15 -26
  286. package/test/test/util/waiter.js +84 -43
  287. package/test/text/cue_integration.js +0 -4
  288. package/test/text/lrc_text_parser_unit.js +0 -4
  289. package/test/text/mp4_ttml_parser_unit.js +10 -23
  290. package/test/text/mp4_vtt_parser_unit.js +1 -7
  291. package/test/text/sbv_text_parser_unit.js +0 -4
  292. package/test/text/simple_text_displayer_unit.js +1 -8
  293. package/test/text/srt_text_parser_unit.js +0 -4
  294. package/test/text/ssa_text_parser_unit.js +0 -5
  295. package/test/text/text_engine_unit.js +2 -7
  296. package/test/text/text_track_integration.js +0 -2
  297. package/test/text/ttml_text_parser_unit.js +499 -239
  298. package/test/text/ui_text_displayer_unit.js +44 -41
  299. package/test/text/vtt_text_parser_unit.js +0 -9
  300. package/test/text/web_vtt_generator_unit.js +0 -3
  301. package/test/ui/ad_ui_unit.js +0 -11
  302. package/test/ui/localization_unit.js +0 -3
  303. package/test/ui/text_displayer_layout_unit.js +9 -19
  304. package/test/ui/ui_customization_unit.js +0 -6
  305. package/test/ui/ui_integration.js +0 -16
  306. package/test/ui/ui_unit.js +1 -17
  307. package/test/util/abortable_operation_unit.js +4 -9
  308. package/test/util/array_utils_unit.js +0 -2
  309. package/test/util/buffer_utils_unit.js +0 -2
  310. package/test/util/cmcd_manager_unit.js +29 -18
  311. package/test/util/data_view_reader_unit.js +0 -4
  312. package/test/util/ebml_parser_unit.js +0 -4
  313. package/test/util/event_manager_unit.js +0 -3
  314. package/test/util/fake_event_target_unit.js +0 -5
  315. package/test/util/functional_unit.js +1 -1
  316. package/test/util/iterables_unit.js +0 -64
  317. package/test/util/language_utils_unit.js +0 -3
  318. package/test/util/manifest_parser_utils_unit.js +0 -2
  319. package/test/util/mp4_box_parsers_unit.js +0 -5
  320. package/test/util/mp4_parser_unit.js +0 -4
  321. package/test/util/multi_map_unit.js +0 -3
  322. package/test/util/object_utils_unit.js +0 -2
  323. package/test/util/periods_unit.js +14 -7
  324. package/test/util/pssh_unit.js +0 -5
  325. package/test/util/state_history_unit.js +0 -2
  326. package/test/util/stream_utils_unit.js +39 -38
  327. package/test/util/string_utils_unit.js +0 -6
  328. package/test/util/text_parser_unit.js +0 -2
  329. package/test/util/xml_utils_unit.js +0 -4
  330. package/third_party/closure-uri/uri.js +21 -0
  331. package/ui/controls.js +3 -0
  332. package/ui/less/ad_controls.less +4 -4
  333. package/ui/less/buttons.less +5 -5
  334. package/ui/less/containers.less +9 -11
  335. package/ui/less/overflow_menu.less +4 -4
  336. package/ui/less/range_elements.less +5 -0
  337. package/ui/less/tooltip.less +1 -1
  338. package/ui/locales/sjn-translations.yaml +257 -0
  339. package/ui/locales/sjn.json +42 -0
  340. package/ui/localization.js +12 -36
  341. package/ui/text_selection.js +1 -0
  342. package/externs/media_capabilities.js +0 -16
  343. package/externs/svgelement.js +0 -18
  344. package/externs/webcrypto.js +0 -18
@@ -0,0 +1,79 @@
1
+ /*! @license
2
+ * Shaka Player
3
+ * Copyright 2016 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ shaka.test.TtmlUtils = class {
8
+ /**
9
+ * @param {!Array} expectedCues
10
+ * @param {!Array} actualCues
11
+ * @param {!Object} bodyProperties
12
+ * @param {Object=} divProperties
13
+ */
14
+ static verifyHelper(expectedCues, actualCues, bodyProperties, divProperties) {
15
+ const mapExpected = (cue) => {
16
+ if (cue.region) {
17
+ cue.region = jasmine.objectContaining(cue.region);
18
+ }
19
+
20
+ if (cue.nestedCues && (cue.nestedCues instanceof Array)) {
21
+ cue.nestedCues = cue.nestedCues.map(mapExpected);
22
+ }
23
+
24
+ if (cue.isContainer == undefined) {
25
+ // If not specified to be true, check for isContainer to be false.
26
+ cue.isContainer = false;
27
+ }
28
+
29
+ return jasmine.objectContaining(cue);
30
+ };
31
+
32
+ /**
33
+ * @param {!Object} properties
34
+ * @return {!shaka.extern.Cue}
35
+ */
36
+ const makeContainer = (properties) => {
37
+ const region = {
38
+ id: '',
39
+ viewportAnchorX: 0,
40
+ viewportAnchorY: 0,
41
+ regionAnchorX: 0,
42
+ regionAnchorY: 0,
43
+ width: 100,
44
+ height: 100,
45
+ widthUnits: shaka.text.CueRegion.units.PERCENTAGE,
46
+ heightUnits: shaka.text.CueRegion.units.PERCENTAGE,
47
+ viewportAnchorUnits: shaka.text.CueRegion.units.PERCENTAGE,
48
+ scroll: '',
49
+ };
50
+ const containerCue = /** @type {!shaka.extern.Cue} */ ({
51
+ region,
52
+ nestedCues: jasmine.any(Object),
53
+ payload: '',
54
+ startTime: 0,
55
+ endTime: Infinity,
56
+ isContainer: true,
57
+ });
58
+ Object.assign(containerCue, properties);
59
+ return mapExpected(containerCue);
60
+ };
61
+
62
+ if (expectedCues.length == 0 && !divProperties) {
63
+ expect(actualCues.length).toBe(0);
64
+ } else {
65
+ // Body.
66
+ expect(actualCues.length).toBe(1);
67
+ const body = actualCues[0];
68
+ expect(body).toEqual(makeContainer(bodyProperties));
69
+
70
+ // Div.
71
+ expect(body.nestedCues.length).toBe(1);
72
+ const div = body.nestedCues[0];
73
+ expect(div).toEqual(makeContainer(divProperties || bodyProperties));
74
+
75
+ // Cues.
76
+ expect(div.nestedCues).toEqual(expectedCues.map(mapExpected));
77
+ }
78
+ }
79
+ };
@@ -4,15 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
-
8
- goog.provide('shaka.test.UiUtils');
9
-
10
- goog.require('shaka.Player');
11
- goog.require('shaka.test.Waiter');
12
- goog.require('shaka.ui.Overlay');
13
- goog.require('shaka.util.EventManager');
14
-
15
-
16
7
  shaka.test.UiUtils = class {
17
8
  /**
18
9
  * @param {!HTMLElement} videoContainer
@@ -4,19 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.StatusPromise');
8
- goog.provide('shaka.test.Util');
9
-
10
- goog.require('goog.asserts');
11
- goog.require('shaka.media.InitSegmentReference');
12
- goog.require('shaka.media.SegmentReference');
13
- goog.require('shaka.util.Functional');
14
- goog.require('shaka.util.Iterables');
15
- goog.require('shaka.util.StringUtils');
16
- goog.require('shaka.util.XmlUtils');
17
- goog.requireType('shaka.util.Error');
18
-
19
-
20
7
  /**
21
8
  * @extends {Promise}
22
9
  */
@@ -52,10 +39,9 @@ shaka.test.Util = class {
52
39
  */
53
40
  static async fakeEventLoop(duration, onTick) {
54
41
  // Run this synchronously:
55
- for (const time of shaka.util.Iterables.range(duration)) {
42
+ for (let time = 0; time < duration; time++) {
56
43
  // We shouldn't need more than 6 rounds.
57
- for (const _ of shaka.util.Iterables.range(6)) {
58
- shaka.util.Functional.ignored(_);
44
+ for (let i = 0; i < 6; i++) {
59
45
  jasmine.clock().tick(0);
60
46
  await Promise.resolve(); // eslint-disable-line no-await-in-loop
61
47
  }
@@ -203,7 +189,7 @@ shaka.test.Util = class {
203
189
  if (actual.childNodes.length != expected.childNodes.length) {
204
190
  return prospectiveDiff + 'Different child node list length.';
205
191
  }
206
- for (const i of shaka.util.Iterables.range(actual.childNodes.length)) {
192
+ for (let i = 0; i < actual.childNodes.length; i++) {
207
193
  const aNode = actual.childNodes[i];
208
194
  const eNode = expected.childNodes[i];
209
195
  const diff =
@@ -334,9 +320,9 @@ shaka.test.Util = class {
334
320
  // TODO: There should be a way to alter the externs for jasmine.Spy so that
335
321
  // this utility is not needed.
336
322
  // Why isn't there something like ICallable in Closure?
337
- // https://github.com/google/closure-compiler/issues/946
323
+ // https://github.com/shaka-project/closure-compiler/issues/946
338
324
  // Why isn't it enough that jasmine.Spy extends Function?
339
- // https://github.com/google/closure-compiler/issues/1422
325
+ // https://github.com/shaka-project/closure-compiler/issues/1422
340
326
  return /** @type {Function} */(spy)(...varArgs);
341
327
  }
342
328
 
@@ -401,10 +387,10 @@ shaka.test.Util = class {
401
387
  * within the bounds of the viewport.
402
388
  * @param {string} name An identifier for the screenshot. Use alphanumeric
403
389
  * plus dash and underscore only.
404
- * @param {number} threshold A change threshold in pixels.
390
+ * @param {number} minSimilarity A minimum similarity score between 0 and 1.
405
391
  * @return {!Promise}
406
392
  */
407
- static async checkScreenshot(element, name, threshold=0) {
393
+ static async checkScreenshot(element, name, minSimilarity=1) {
408
394
  // Make sure the DOM is up-to-date and layout has settled before continuing.
409
395
  // Without this delay, or with a shorter delay, we sometimes get missing
410
396
  // elements in our UITextDisplayer tests on some platforms.
@@ -448,13 +434,16 @@ shaka.test.Util = class {
448
434
  const buffer = await shaka.test.Util.fetch(
449
435
  '/screenshot/diff' + parentUrlParams + paramsString);
450
436
  const json = shaka.util.StringUtils.fromUTF8(buffer);
451
- const pixelsChanged = /** @type {number} */(JSON.parse(json));
437
+ const similarity = /** @type {number} */(JSON.parse(json));
452
438
 
453
- // If the change threshold is exceeded, you can review the new screenshot
439
+ // If the minimum similarity is not met, you can review the new screenshot
454
440
  // and the diff image in the screenshots folder. Look for images that end
455
- // with "-new" and "-diff". If cropping doesn't work right, you can view
456
- // the full-page screenshot in the image that ends with "-full".
457
- expect(pixelsChanged).withContext(name).not.toBeGreaterThan(threshold);
441
+ // with "-new" and "-diff". (NOTE: The diff is a pixel-wise diff for human
442
+ // review, and is not produced with the same structural similarity
443
+ // algorithm used to detect changes in the test.) If cropping doesn't work
444
+ // right, you can view the full-page screenshot in the image that ends with
445
+ // "-full".
446
+ expect(similarity).withContext(name).not.toBeLessThan(minSimilarity);
458
447
  }
459
448
  };
460
449
 
@@ -4,14 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.provide('shaka.test.Waiter');
8
-
9
- goog.require('shaka.log');
10
- goog.require('shaka.media.TimeRangesUtils');
11
- goog.require('shaka.test.Util');
12
- goog.require('shaka.util.EventManager');
13
-
14
-
15
7
  shaka.test.Waiter = class {
16
8
  /** @param {!shaka.util.EventManager} eventManager */
17
9
  constructor(eventManager) {
@@ -23,6 +15,12 @@ shaka.test.Waiter = class {
23
15
 
24
16
  /** @private {number} */
25
17
  this.timeoutSeconds_ = 5;
18
+
19
+ /** @private {shaka.Player} */
20
+ this.player_ = null;
21
+
22
+ /** @private {shaka.media.MediaSourceEngine} */
23
+ this.mediaSourceEngine_ = null;
26
24
  }
27
25
 
28
26
  // TODO: Consider replacing this with a settings argument on the individual
@@ -51,6 +49,30 @@ shaka.test.Waiter = class {
51
49
  return this;
52
50
  }
53
51
 
52
+ /**
53
+ * For tests with access to MediaSourceEngine, this can provide better
54
+ * debugging for buffered ranges on failure.
55
+ *
56
+ * @param {shaka.Player} player
57
+ * @return {!shaka.test.Waiter}
58
+ */
59
+ setPlayer(player) {
60
+ this.player_ = player;
61
+ return this;
62
+ }
63
+
64
+ /**
65
+ * For tests with access to MediaSourceEngine, this can provide better
66
+ * debugging for buffered ranges on failure.
67
+ *
68
+ * @param {shaka.media.MediaSourceEngine} mediaSourceEngine
69
+ * @return {!shaka.test.Waiter}
70
+ */
71
+ setMediaSourceEngine(mediaSourceEngine) {
72
+ this.mediaSourceEngine_ = mediaSourceEngine;
73
+ return this;
74
+ }
75
+
54
76
  /**
55
77
  * Wait for the video playhead to move forward by some meaningful delta. The
56
78
  * Promise is resolved when the playhead moves or the video ends.
@@ -109,7 +131,6 @@ shaka.test.Waiter = class {
109
131
  return this.waitUntilGeneric_(goalName, p, cleanup, mediaElement);
110
132
  }
111
133
 
112
-
113
134
  /**
114
135
  * Wait for the video playhead to reach a certain target time.
115
136
  * If the playhead reaches |timeGoal| or the video ends before |timeout|
@@ -132,40 +153,51 @@ shaka.test.Waiter = class {
132
153
  * @return {!Promise}
133
154
  */
134
155
  waitForEnd(mediaElement) {
135
- // Sometimes, the ended flag is not set, or the event does not fire,
136
- // (I'm looking at **you**, Safari), so also check if we've reached the
137
- // duration.
138
- if (mediaElement.ended ||
139
- mediaElement.currentTime >= mediaElement.duration) {
140
- return Promise.resolve();
141
- }
142
-
143
156
  // The name of what we're waiting for.
144
157
  const goalName = 'end of media';
145
158
 
159
+ // The conditions for success. Don't rely on either time, or the ended
160
+ // flag, or the ended event, specifically. Any of these is sufficient.
161
+ // This flexibility cuts down on test flake on Safari (currently 14) in
162
+ // particular, where the flag might be set, but the ended event did not
163
+ // fire. We also see flake on Firefox (currently 99), where test playbacks
164
+ // sometimes stop right before duration is reached. (Duration 60.01, audio
165
+ // buffered to 60.01, video buffered to exactly 60.)
166
+ const hasEnded = () => {
167
+ return mediaElement.currentTime >= mediaElement.duration - 0.1 ||
168
+ mediaElement.ended;
169
+ };
170
+
171
+ if (hasEnded()) {
172
+ return Promise.resolve();
173
+ }
174
+
146
175
  // Cleanup on timeout.
176
+ let timer = null;
147
177
  const cleanup = () => {
178
+ if (timer) {
179
+ timer.stop();
180
+ }
148
181
  this.eventManager_.unlisten(mediaElement, 'timeupdate');
149
182
  this.eventManager_.unlisten(mediaElement, 'ended');
150
183
  };
151
184
 
152
- // The conditions for success. Don't rely on either time, or the ended
153
- // flag, or the ended event, specifically. Any of these is sufficient.
154
- // This flexibility cuts down on test flake on Safari (currently 14) in
155
- // particular, where the flag might be set, but the ended event did not
156
- // fire.
157
185
  const p = new Promise((resolve) => {
158
- this.eventManager_.listen(mediaElement, 'timeupdate', () => {
159
- if (mediaElement.currentTime >= mediaElement.duration ||
160
- mediaElement.ended) {
186
+ const check = () => {
187
+ if (hasEnded()) {
161
188
  cleanup();
162
189
  resolve();
163
190
  }
164
- });
165
- this.eventManager_.listen(mediaElement, 'ended', () => {
166
- cleanup();
167
- resolve();
168
- });
191
+ };
192
+
193
+ // In Firefox 99, there appears to be some bug in the browser preventing
194
+ // events from being triggered at the end of the presentation. So we
195
+ // check for the end once per second. Without this, StreamingEngine
196
+ // integration tests were failing.
197
+ timer = new shaka.util.Timer(check);
198
+ timer.tickEvery(/* seconds= */ 1);
199
+ this.eventManager_.listen(mediaElement, 'timeupdate', check);
200
+ this.eventManager_.listen(mediaElement, 'ended', check);
169
201
  });
170
202
 
171
203
  return this.waitUntilGeneric_(goalName, p, cleanup, mediaElement);
@@ -263,7 +295,7 @@ shaka.test.Waiter = class {
263
295
 
264
296
  // Improve the error message with media-specific debug info.
265
297
  if (target instanceof HTMLMediaElement) {
266
- this.logDebugInfoForMedia_(error.message, target);
298
+ this.logDebugInfoForMedia_(error, target);
267
299
  }
268
300
 
269
301
  // Reject or resolve based on our settings.
@@ -276,20 +308,29 @@ shaka.test.Waiter = class {
276
308
  }
277
309
 
278
310
  /**
279
- * @param {string} message
311
+ * @param {!Error} error
280
312
  * @param {!HTMLMediaElement} mediaElement
281
313
  * @private
282
314
  */
283
- logDebugInfoForMedia_(message, mediaElement) {
284
- const buffered =
285
- shaka.media.TimeRangesUtils.getBufferedInfo(mediaElement.buffered);
286
- shaka.log.error(message,
287
- 'current time', mediaElement.currentTime,
288
- 'duration', mediaElement.duration,
289
- 'ready state', mediaElement.readyState,
290
- 'playback rate', mediaElement.playbackRate,
291
- 'paused', mediaElement.paused,
292
- 'ended', mediaElement.ended,
293
- 'buffered', buffered);
315
+ logDebugInfoForMedia_(error, mediaElement) {
316
+ let buffered;
317
+ if (this.player_) {
318
+ buffered = this.player_.getBufferedInfo();
319
+ } else if (this.mediaSourceEngine_) {
320
+ buffered = this.mediaSourceEngine_.getBufferedInfo();
321
+ } else {
322
+ buffered = shaka.media.TimeRangesUtils.getBufferedInfo(
323
+ mediaElement.buffered);
324
+ }
325
+
326
+ error.message += '\n' +
327
+ `current time: ${mediaElement.currentTime}\n` +
328
+ `duration: ${mediaElement.duration}\n` +
329
+ `ready state: ${mediaElement.readyState}\n` +
330
+ `playback rate: ${mediaElement.playbackRate}\n` +
331
+ `paused: ${mediaElement.paused}\n` +
332
+ `ended: ${mediaElement.ended}\n` +
333
+ `buffered: ${JSON.stringify(buffered)}\n`;
334
+ shaka.log.error(error.message);
294
335
  }
295
336
  };
@@ -4,10 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.text.VttTextParser');
8
- goog.require('shaka.util.BufferUtils');
9
- goog.require('shaka.util.StringUtils');
10
-
11
7
  describe('Cue', () => {
12
8
  // This integration test checks platform support for various cue scenarios
13
9
  // that have caused platform-specific issues. The unit tests for each parser
@@ -4,10 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.text.LrcTextParser');
8
- goog.require('shaka.util.BufferUtils');
9
- goog.require('shaka.util.StringUtils');
10
-
11
7
  describe('LrcTextParser', () => {
12
8
  it('supports no cues', () => {
13
9
  verifyHelper([],
@@ -4,11 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.test.Util');
8
- goog.require('shaka.text.Mp4TtmlParser');
9
- goog.require('shaka.util.BufferUtils');
10
- goog.require('shaka.util.Error');
11
-
12
7
  describe('Mp4TtmlParser', () => {
13
8
  const ttmlInitSegmentUri = '/base/test/test/assets/ttml-init.mp4';
14
9
  const ttmlSegmentUri = '/base/test/test/assets/ttml-segment.mp4';
@@ -48,7 +43,14 @@ describe('Mp4TtmlParser', () => {
48
43
  parser.parseInit(ttmlInitSegment);
49
44
  const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
50
45
  const ret = parser.parseMedia(ttmlSegmentMultipleMDAT, time);
51
- expect(ret.length).toBe(20);
46
+ // Bodies.
47
+ expect(ret.length).toBe(2);
48
+ // Divs.
49
+ expect(ret[0].nestedCues.length).toBe(1);
50
+ expect(ret[1].nestedCues.length).toBe(1);
51
+ // Cues.
52
+ expect(ret[0].nestedCues[0].nestedCues.length).toBe(10);
53
+ expect(ret[1].nestedCues[0].nestedCues.length).toBe(10);
52
54
  });
53
55
 
54
56
  it('accounts for offset', () => {
@@ -159,22 +161,7 @@ describe('Mp4TtmlParser', () => {
159
161
  parser.parseInit(ttmlInitSegment);
160
162
  const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
161
163
  const result = parser.parseMedia(ttmlSegment, time);
162
- verifyHelper(cues, result);
164
+ shaka.test.TtmlUtils.verifyHelper(
165
+ cues, result, {startTime: 23, endTime: 53.5});
163
166
  });
164
-
165
- function verifyHelper(/** !Array */ expected, /** !Array */ actual) {
166
- const mapExpected = (cue) => {
167
- if (cue.region) {
168
- cue.region = jasmine.objectContaining(cue.region);
169
- }
170
-
171
- if (cue.nestedCues) {
172
- cue.nestedCues = cue.nestedCues.map(mapExpected);
173
- }
174
-
175
- return jasmine.objectContaining(cue);
176
- };
177
-
178
- expect(actual).toEqual(expected.map(mapExpected));
179
- }
180
167
  });
@@ -4,12 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.test.Util');
8
- goog.require('shaka.text.Cue');
9
- goog.require('shaka.text.Mp4VttParser');
10
- goog.require('shaka.util.BufferUtils');
11
- goog.require('shaka.util.Error');
12
-
13
7
  describe('Mp4VttParser', () => {
14
8
  const vttInitSegmentUri = '/base/test/test/assets/vtt-init.mp4';
15
9
  const vttSegmentUri = '/base/test/test/assets/vtt-segment.mp4';
@@ -133,7 +127,7 @@ describe('Mp4VttParser', () => {
133
127
  });
134
128
 
135
129
  it('parses media segments without a sample duration', () => {
136
- // Regression test for https://github.com/google/shaka-player/issues/919
130
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/919
137
131
  const cues = [
138
132
  {startTime: 10, endTime: 11, payload: 'cue 10'},
139
133
  {startTime: 11, endTime: 12, payload: 'cue 11'},
@@ -4,10 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.text.SbvTextParser');
8
- goog.require('shaka.util.BufferUtils');
9
- goog.require('shaka.util.StringUtils');
10
-
11
7
  describe('SbvTextParser', () => {
12
8
  it('supports no cues', () => {
13
9
  verifyHelper([],
@@ -4,13 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
-
8
- goog.require('shaka.test.FakeVideo');
9
- goog.require('shaka.text.Cue');
10
- goog.require('shaka.text.SimpleTextDisplayer');
11
- goog.require('shaka.util.Functional');
12
- goog.requireType('shaka.test.FakeTextTrack');
13
-
14
7
  describe('SimpleTextDisplayer', () => {
15
8
  const originalVTTCue = window.VTTCue;
16
9
  const Cue = shaka.text.Cue;
@@ -74,7 +67,7 @@ describe('SimpleTextDisplayer', () => {
74
67
  });
75
68
 
76
69
  it('appends equal time cues in reverse order', () => {
77
- // Regression test for https://github.com/google/shaka-player/issues/848
70
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/848
78
71
 
79
72
  // When VTTCue is seen as the real thing (because of the presence of
80
73
  // VTTCue.prototype.line), then the reverse-order behavior comes into
@@ -4,10 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.text.SrtTextParser');
8
- goog.require('shaka.util.BufferUtils');
9
- goog.require('shaka.util.StringUtils');
10
-
11
7
  describe('SrtTextParser', () => {
12
8
  it('supports no cues', () => {
13
9
  verifyHelper([],
@@ -4,11 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.text.Cue');
8
- goog.require('shaka.text.SsaTextParser');
9
- goog.require('shaka.util.BufferUtils');
10
- goog.require('shaka.util.StringUtils');
11
-
12
7
  describe('SsaTextParser', () => {
13
8
  const Cue = shaka.text.Cue;
14
9
 
@@ -4,11 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.test.FakeTextDisplayer');
8
- goog.require('shaka.text.Cue');
9
- goog.require('shaka.text.TextEngine');
10
- goog.require('shaka.util.MimeUtils');
11
-
12
7
  describe('TextEngine', () => {
13
8
  const TextEngine = shaka.text.TextEngine;
14
9
 
@@ -336,7 +331,7 @@ describe('TextEngine', () => {
336
331
  it('does not use timestamp offset', async () => {
337
332
  // The start and end times passed to appendBuffer are now absolute, so
338
333
  // they already account for timestampOffset and period offset.
339
- // See https://github.com/google/shaka-player/issues/1562
334
+ // See https://github.com/shaka-project/shaka-player/issues/1562
340
335
  textEngine.setTimestampOffset(60);
341
336
  await textEngine.appendBuffer(dummyData, 0, 3);
342
337
  expect(textEngine.bufferStart()).toBe(0);
@@ -379,7 +374,7 @@ describe('TextEngine', () => {
379
374
  it('does not use timestamp offset', async () => {
380
375
  // The start and end times passed to appendBuffer are now absolute, so
381
376
  // they already account for timestampOffset and period offset.
382
- // See https://github.com/google/shaka-player/issues/1562
377
+ // See https://github.com/shaka-project/shaka-player/issues/1562
383
378
  textEngine.setTimestampOffset(60);
384
379
  await textEngine.appendBuffer(dummyData, 3, 6);
385
380
  expect(textEngine.bufferedAheadOf(4)).toBe(2);
@@ -4,8 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.test.UiUtils');
8
-
9
7
  // This tests three assumptions we make about text tracks in Shaka Player:
10
8
  // 1. If a non-null value for cues is stored, it will always be the
11
9
  // non-null value for cues when cues returns a non-null value.