shaka-player 3.2.2 → 3.2.5

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 (331) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/workflows/build-and-test.yaml +130 -0
  4. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  5. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  6. package/.github/workflows/demo-version-index.yaml +29 -0
  7. package/.github/workflows/nightly-demo.yaml +42 -0
  8. package/.github/workflows/release-please.yaml +145 -0
  9. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  10. package/.github/workflows/selenium-lab-tests.yaml +93 -0
  11. package/AUTHORS +2 -0
  12. package/CHANGELOG.md +1598 -1525
  13. package/CONTRIBUTING.md +2 -2
  14. package/CONTRIBUTORS +2 -0
  15. package/README.md +7 -7
  16. package/app-engine/README.md +9 -0
  17. package/app-engine/demo-version-index/README.md +14 -0
  18. package/app-engine/demo-version-index/app.yaml +2 -0
  19. package/app-engine/demo-version-index/main.py +162 -0
  20. package/app-engine/demo-version-index/requirements.txt +6 -0
  21. package/app-engine/demo-version-index/templates/index.html +114 -0
  22. package/app-engine/shaka-player-demo/README.md +18 -0
  23. package/app-engine/shaka-player-demo/app.yaml +61 -0
  24. package/app-engine/shaka-player-demo/main.py +95 -0
  25. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  26. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  27. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  28. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  29. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  30. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  31. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  32. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  33. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  34. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  35. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  36. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  37. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  38. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  39. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  40. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  41. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  42. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  43. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  44. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  45. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  46. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  47. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  48. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  49. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  50. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  51. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  52. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  53. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  54. package/app-engine/shaka-player-demo/posters.py +110 -0
  55. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  56. package/app-engine/shaka-player-demo/time.txt +1 -0
  57. package/build/README.md +1 -1
  58. package/build/checkversion.py +1 -1
  59. package/build/conformance.textproto +13 -0
  60. package/build/docker/Dockerfile +20 -0
  61. package/build/docker/docker-compose.yml +10 -0
  62. package/build/gendeps.py +18 -15
  63. package/build/shaka-lab.yaml +163 -0
  64. package/build/shakaBuildHelpers.py +4 -29
  65. package/build/test.py +93 -28
  66. package/build/wrapper.template.js +2 -2
  67. package/demo/TengwarTelcontar.woff2 +0 -0
  68. package/demo/asset_card.js +1 -2
  69. package/demo/cast_receiver/index.html +1 -1
  70. package/demo/cast_receiver/receiver_app.css +14 -14
  71. package/demo/common/assets.js +2 -0
  72. package/demo/config.js +0 -1
  73. package/demo/custom.js +0 -1
  74. package/demo/customWarning.txt +2 -2
  75. package/demo/demo.less +29 -18
  76. package/demo/demo_uncompiled.js +1 -13
  77. package/demo/index.html +1 -1
  78. package/demo/main.js +3 -3
  79. package/dist/controls.css +2 -2
  80. package/dist/controls.css.map +1 -1
  81. package/dist/demo.compiled.debug.js +191 -194
  82. package/dist/demo.compiled.debug.map +4 -4
  83. package/dist/demo.compiled.js +191 -194
  84. package/dist/demo.compiled.map +4 -4
  85. package/dist/demo.css +1 -1
  86. package/dist/demo.css.map +1 -1
  87. package/dist/deps.js +225 -219
  88. package/dist/locales.js +31 -31
  89. package/dist/receiver.compiled.debug.js +43 -45
  90. package/dist/receiver.compiled.debug.map +4 -4
  91. package/dist/receiver.compiled.js +43 -45
  92. package/dist/receiver.compiled.map +4 -4
  93. package/dist/shaka-player.compiled.d.ts +247 -227
  94. package/dist/shaka-player.compiled.debug.d.ts +247 -227
  95. package/dist/shaka-player.compiled.debug.externs.js +43 -16
  96. package/dist/shaka-player.compiled.debug.js +384 -388
  97. package/dist/shaka-player.compiled.debug.map +4 -4
  98. package/dist/shaka-player.compiled.externs.js +43 -16
  99. package/dist/shaka-player.compiled.js +818 -817
  100. package/dist/shaka-player.compiled.map +4 -4
  101. package/dist/shaka-player.ui.d.ts +291 -280
  102. package/dist/shaka-player.ui.debug.d.ts +291 -280
  103. package/dist/shaka-player.ui.debug.externs.js +45 -27
  104. package/dist/shaka-player.ui.debug.js +389 -394
  105. package/dist/shaka-player.ui.debug.map +4 -4
  106. package/dist/shaka-player.ui.externs.js +45 -27
  107. package/dist/shaka-player.ui.js +964 -965
  108. package/dist/shaka-player.ui.map +4 -4
  109. package/docs/design/REDESIGN.md +33 -33
  110. package/docs/design/codec_preferences.md +1 -1
  111. package/docs/design/dash-audio-channels.md +3 -3
  112. package/docs/design/dash-manifests.md +1 -1
  113. package/docs/design/gap-jumping.md +3 -3
  114. package/docs/design/preload.md +2 -2
  115. package/docs/tutorials/faq.md +8 -8
  116. package/docs/tutorials/index.json +1 -0
  117. package/docs/tutorials/plugins.md +3 -3
  118. package/docs/tutorials/selenium-grid-config.md +122 -0
  119. package/docs/tutorials/welcome.md +10 -2
  120. package/externs/shaka/player.js +8 -0
  121. package/externs/shaka/text.js +10 -0
  122. package/karma.conf.js +156 -45
  123. package/lib/abr/simple_abr_manager.js +12 -6
  124. package/lib/ads/ad_manager.js +1 -0
  125. package/lib/cast/cast_proxy.js +6 -4
  126. package/lib/cast/cast_receiver.js +3 -0
  127. package/lib/cea/cea608_data_channel.js +2 -2
  128. package/lib/cea/cea708_service.js +5 -4
  129. package/lib/cea/mp4_cea_parser.js +11 -5
  130. package/lib/cea/sei_processor.js +6 -3
  131. package/lib/dash/dash_parser.js +43 -31
  132. package/lib/dash/mpd_utils.js +4 -5
  133. package/lib/dash/segment_list.js +1 -2
  134. package/lib/dash/segment_template.js +3 -3
  135. package/lib/hls/hls_parser.js +41 -9
  136. package/lib/hls/manifest_text_parser.js +4 -3
  137. package/lib/media/adaptation_set.js +1 -2
  138. package/lib/media/content_workarounds.js +2 -2
  139. package/lib/media/drm_engine.js +3 -2
  140. package/lib/media/media_source_engine.js +3 -2
  141. package/lib/media/mp4_segment_index_parser.js +1 -4
  142. package/lib/media/playhead.js +2 -2
  143. package/lib/media/presentation_timeline.js +18 -8
  144. package/lib/media/region_observer.js +39 -33
  145. package/lib/media/region_timeline.js +17 -19
  146. package/lib/media/segment_index.js +2 -1
  147. package/lib/media/segment_reference.js +19 -1
  148. package/lib/media/streaming_engine.js +12 -9
  149. package/lib/media/time_ranges_utils.js +1 -3
  150. package/lib/media/video_wrapper.js +1 -1
  151. package/lib/net/networking_engine.js +5 -1
  152. package/lib/offline/storage.js +12 -13
  153. package/lib/player.js +77 -36
  154. package/lib/polyfill/all.js +2 -3
  155. package/lib/polyfill/encryption_scheme.js +1 -1
  156. package/lib/polyfill/media_capabilities.js +32 -17
  157. package/lib/polyfill/mediasource.js +1 -1
  158. package/lib/text/cue.js +7 -1
  159. package/lib/text/simple_text_displayer.js +2 -1
  160. package/lib/text/ttml_text_parser.js +92 -63
  161. package/lib/text/ui_text_displayer.js +18 -12
  162. package/lib/util/buffer_utils.js +1 -3
  163. package/lib/util/ebml_parser.js +3 -3
  164. package/lib/util/error.js +1 -1
  165. package/lib/util/fake_event_target.js +21 -1
  166. package/lib/util/iterables.js +0 -46
  167. package/lib/util/mp4_box_parsers.js +1 -4
  168. package/lib/util/mp4_parser.js +5 -7
  169. package/lib/util/periods.js +8 -9
  170. package/lib/util/platform.js +3 -3
  171. package/lib/util/pssh.js +1 -4
  172. package/lib/util/stream_utils.js +88 -11
  173. package/lib/util/string_utils.js +3 -5
  174. package/lib/util/uint8array_utils.js +3 -5
  175. package/lib/util/xml_utils.js +34 -7
  176. package/package.json +62 -40
  177. package/roadmap.md +17 -17
  178. package/test/abr/simple_abr_manager_unit.js +3 -8
  179. package/test/ads/ad_manager_unit.js +0 -6
  180. package/test/cast/cast_proxy_unit.js +0 -8
  181. package/test/cast/cast_receiver_integration.js +1 -18
  182. package/test/cast/cast_receiver_unit.js +1 -9
  183. package/test/cast/cast_sender_unit.js +0 -6
  184. package/test/cast/cast_utils_unit.js +0 -13
  185. package/test/cea/cea608_memory_unit.js +0 -5
  186. package/test/cea/cea708_service_unit.js +0 -7
  187. package/test/cea/cea708_window_unit.js +0 -5
  188. package/test/cea/cea_decoder_unit.js +0 -6
  189. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  190. package/test/cea/dtvcc_packet_unit.js +0 -5
  191. package/test/cea/mp4_cea_parser_unit.js +0 -4
  192. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  193. package/test/dash/dash_parser_live_unit.js +45 -15
  194. package/test/dash/dash_parser_manifest_unit.js +37 -18
  195. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  196. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  197. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  198. package/test/dash/mpd_utils_unit.js +3 -11
  199. package/test/demo/demo_unit.js +0 -5
  200. package/test/deprecate/enforcer_unit.js +0 -4
  201. package/test/deprecate/version_unit.js +0 -2
  202. package/test/hls/hls_live_unit.js +2 -14
  203. package/test/hls/hls_parser_unit.js +76 -15
  204. package/test/hls/manifest_text_parser_unit.js +0 -10
  205. package/test/media/adaptation_set_criteria_unit.js +3 -7
  206. package/test/media/adaptation_set_unit.js +0 -2
  207. package/test/media/buffering_observer_unit.js +1 -4
  208. package/test/media/closed_caption_parser_unit.js +0 -3
  209. package/test/media/drm_engine_integration.js +2 -15
  210. package/test/media/drm_engine_unit.js +7 -27
  211. package/test/media/manifest_parser_unit.js +0 -4
  212. package/test/media/media_source_engine_integration.js +0 -7
  213. package/test/media/media_source_engine_unit.js +1 -14
  214. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  215. package/test/media/play_rate_controller_unit.js +0 -4
  216. package/test/media/playhead_unit.js +8 -16
  217. package/test/media/presentation_timeline_unit.js +4 -7
  218. package/test/media/region_observer_unit.js +40 -10
  219. package/test/media/region_timeline_unit.js +40 -25
  220. package/test/media/segment_index_unit.js +0 -6
  221. package/test/media/segment_reference_unit.js +0 -3
  222. package/test/media/stall_detector_unit.js +0 -5
  223. package/test/media/streaming_engine_integration.js +11 -37
  224. package/test/media/streaming_engine_unit.js +155 -34
  225. package/test/media/time_ranges_utils_unit.js +0 -2
  226. package/test/media/transmuxer_integration.js +0 -6
  227. package/test/media/webm_segment_index_parser_unit.js +0 -4
  228. package/test/net/data_uri_plugin_unit.js +0 -7
  229. package/test/net/http_plugin_unit.js +0 -9
  230. package/test/net/networking_engine_unit.js +0 -11
  231. package/test/offline/download_progress_estimator_unit.js +0 -2
  232. package/test/offline/indexeddb_storage_unit.js +0 -6
  233. package/test/offline/manifest_convert_unit.js +0 -8
  234. package/test/offline/offline_integration.js +1 -10
  235. package/test/offline/offline_manifest_parser_unit.js +0 -6
  236. package/test/offline/offline_scheme_unit.js +0 -8
  237. package/test/offline/offline_uri_unit.js +0 -2
  238. package/test/offline/storage_compatibility_unit.js +1 -14
  239. package/test/offline/storage_integration.js +1 -25
  240. package/test/player_external.js +2 -10
  241. package/test/player_integration.js +62 -36
  242. package/test/player_load_graph_integration.js +1 -6
  243. package/test/player_src_equals_external.js +3 -9
  244. package/test/player_src_equals_integration.js +41 -15
  245. package/test/player_unit.js +71 -46
  246. package/test/routing/walker_unit.js +0 -8
  247. package/test/test/assets/chapters.vtt +2 -2
  248. package/test/test/assets/chapters2.vtt +10 -0
  249. package/test/test/assets/large_file.mpd +1 -1
  250. package/test/test/boot.js +75 -22
  251. package/test/test/externs/jasmine.js +2 -2
  252. package/test/test/externs/karma.js +4 -0
  253. package/test/test/namespace.js +10 -0
  254. package/test/test/util/canned_idb.js +0 -8
  255. package/test/test/util/cea_utils.js +0 -6
  256. package/test/test/util/dash_parser_util.js +0 -13
  257. package/test/test/util/fake_ad.js +0 -3
  258. package/test/test/util/fake_ad_manager.js +0 -9
  259. package/test/test/util/fake_demo_main.js +0 -5
  260. package/test/test/util/fake_drm_engine.js +0 -6
  261. package/test/test/util/fake_media_source_engine.js +0 -7
  262. package/test/test/util/fake_networking_engine.js +0 -5
  263. package/test/test/util/fake_text_displayer.js +0 -5
  264. package/test/test/util/indexeddb_utils.js +1 -10
  265. package/test/test/util/jasmine_fetch.js +0 -1
  266. package/test/test/util/loader.js +0 -18
  267. package/test/test/util/manifest_generator.js +9 -14
  268. package/test/test/util/manifest_parser_util.js +0 -6
  269. package/test/test/util/offline_utils.js +0 -5
  270. package/test/test/util/simple_fakes.js +9 -26
  271. package/test/test/util/stream_generator.js +0 -14
  272. package/test/test/util/streaming_engine_util.js +0 -15
  273. package/test/test/util/test_scheme.js +1 -19
  274. package/test/test/util/ttml_utils.js +79 -0
  275. package/test/test/util/ui_utils.js +0 -9
  276. package/test/test/util/util.js +15 -26
  277. package/test/test/util/waiter.js +84 -43
  278. package/test/text/cue_integration.js +0 -4
  279. package/test/text/lrc_text_parser_unit.js +0 -4
  280. package/test/text/mp4_ttml_parser_unit.js +10 -23
  281. package/test/text/mp4_vtt_parser_unit.js +1 -7
  282. package/test/text/sbv_text_parser_unit.js +0 -4
  283. package/test/text/simple_text_displayer_unit.js +1 -8
  284. package/test/text/srt_text_parser_unit.js +0 -4
  285. package/test/text/ssa_text_parser_unit.js +0 -5
  286. package/test/text/text_engine_unit.js +2 -7
  287. package/test/text/text_track_integration.js +0 -2
  288. package/test/text/ttml_text_parser_unit.js +495 -237
  289. package/test/text/ui_text_displayer_unit.js +44 -41
  290. package/test/text/vtt_text_parser_unit.js +0 -9
  291. package/test/text/web_vtt_generator_unit.js +0 -3
  292. package/test/ui/ad_ui_unit.js +0 -11
  293. package/test/ui/localization_unit.js +0 -3
  294. package/test/ui/text_displayer_layout_unit.js +9 -19
  295. package/test/ui/ui_customization_unit.js +0 -6
  296. package/test/ui/ui_integration.js +0 -16
  297. package/test/ui/ui_unit.js +1 -17
  298. package/test/util/abortable_operation_unit.js +4 -9
  299. package/test/util/array_utils_unit.js +0 -2
  300. package/test/util/buffer_utils_unit.js +0 -2
  301. package/test/util/data_view_reader_unit.js +0 -4
  302. package/test/util/ebml_parser_unit.js +0 -4
  303. package/test/util/event_manager_unit.js +0 -3
  304. package/test/util/fake_event_target_unit.js +0 -5
  305. package/test/util/functional_unit.js +1 -1
  306. package/test/util/iterables_unit.js +0 -64
  307. package/test/util/language_utils_unit.js +0 -3
  308. package/test/util/manifest_parser_utils_unit.js +0 -2
  309. package/test/util/mp4_box_parsers_unit.js +0 -5
  310. package/test/util/mp4_parser_unit.js +0 -4
  311. package/test/util/multi_map_unit.js +0 -3
  312. package/test/util/object_utils_unit.js +0 -2
  313. package/test/util/periods_unit.js +14 -7
  314. package/test/util/pssh_unit.js +0 -5
  315. package/test/util/state_history_unit.js +0 -2
  316. package/test/util/stream_utils_unit.js +39 -38
  317. package/test/util/string_utils_unit.js +0 -6
  318. package/test/util/text_parser_unit.js +0 -2
  319. package/test/util/xml_utils_unit.js +0 -4
  320. package/ui/controls.js +3 -0
  321. package/ui/less/ad_controls.less +4 -4
  322. package/ui/less/buttons.less +5 -9
  323. package/ui/less/containers.less +5 -7
  324. package/ui/less/overflow_menu.less +4 -4
  325. package/ui/less/range_elements.less +5 -0
  326. package/ui/locales/sjn-translations.yaml +257 -0
  327. package/ui/locales/sjn.json +42 -0
  328. package/ui/localization.js +12 -36
  329. package/ui/text_selection.js +1 -0
  330. package/externs/media_capabilities.js +0 -16
  331. package/externs/svgelement.js +0 -18
package/karma.conf.js CHANGED
@@ -9,10 +9,13 @@
9
9
 
10
10
  const Jimp = require('jimp');
11
11
  const fs = require('fs');
12
+ const glob = require('glob');
12
13
  const path = require('path');
13
14
  const rimraf = require('rimraf');
15
+ const {ssim} = require('ssim.js');
14
16
  const util = require('karma/common/util');
15
17
  const which = require('which');
18
+ const yaml = require('js-yaml');
16
19
 
17
20
  /**
18
21
  * @param {Object} config
@@ -42,6 +45,58 @@ module.exports = (config) => {
42
45
  const settings =
43
46
  settingsIndex >= 0 ? JSON.parse(args[settingsIndex + 1]) : {};
44
47
 
48
+ if (settings.grid_config) {
49
+ const gridBrowserMetadata =
50
+ yaml.load(fs.readFileSync(settings.grid_config, 'utf8'));
51
+ const customLaunchers = {};
52
+ const [gridHostname, gridPort] = settings.grid_address.split(':');
53
+ console.log(`Using Selenium grid at ${gridHostname}:${gridPort}`);
54
+
55
+ // By default, run on all grid browsers instead of the platform-specific
56
+ // default. This does not disable local browsers, though. Users can still
57
+ // specify a mix of grid and local browsers explicitly.
58
+ settings.default_browsers = [];
59
+
60
+ for (const name in gridBrowserMetadata) {
61
+ if (name == 'vars') {
62
+ // Skip variable defs in the YAML file
63
+ continue;
64
+ }
65
+
66
+ const metadata = gridBrowserMetadata[name];
67
+
68
+ const launcher = {};
69
+ customLaunchers[name] = launcher;
70
+
71
+ // Disabled-by-default browsers are still defined, but not put in the
72
+ // default list. A user can ask for one explicitly. This allows us to
73
+ // disable a browser that is down for some reason in the lab, but still
74
+ // ask for it manually if we want to test it before re-enabling it for
75
+ // everyone.
76
+ if (!metadata.disabled) {
77
+ settings.default_browsers.push(name);
78
+ }
79
+
80
+ // Add standard WebDriver configs.
81
+ Object.assign(launcher, {
82
+ base: 'WebDriver',
83
+ config: {hostname: gridHostname, port: gridPort},
84
+ pseudoActivityInterval: 20000,
85
+ browserName: metadata.browser,
86
+ platform: metadata.os,
87
+ version: metadata.version,
88
+ });
89
+
90
+ if (metadata.extra_config) {
91
+ Object.assign(launcher, metadata.extra_config);
92
+ }
93
+ }
94
+
95
+ config.set({
96
+ customLaunchers: customLaunchers,
97
+ });
98
+ }
99
+
45
100
  if (settings.browsers && settings.browsers.length == 1 &&
46
101
  settings.browsers[0] == 'help') {
47
102
  console.log('Available browsers:');
@@ -52,6 +107,24 @@ module.exports = (config) => {
52
107
  process.exit(1);
53
108
  }
54
109
 
110
+ // Resolve the set of browsers we will use.
111
+ const browserSet = new Set(settings.browsers && settings.browsers.length ?
112
+ settings.browsers : settings.default_browsers);
113
+ if (settings.exclude_browsers) {
114
+ for (const excluded of settings.exclude_browsers) {
115
+ browserSet.delete(excluded);
116
+ }
117
+ }
118
+
119
+ let browsers = Array.from(browserSet).sort();
120
+ if (settings.no_browsers) {
121
+ console.warn(
122
+ '--no-browsers: In this mode, you must connect browsers to Karma.');
123
+ browsers = null;
124
+ } else {
125
+ console.warn('Running tests on: ' + browsers.join(', '));
126
+ }
127
+
55
128
  config.set({
56
129
  // base path that will be used to resolve all patterns (eg. files, exclude)
57
130
  basePath: '.',
@@ -86,7 +159,7 @@ module.exports = (config) => {
86
159
  // Promise polyfill, required since we test uncompiled code on IE11
87
160
  'node_modules/es6-promise-polyfill/promise.js',
88
161
  // Babel polyfill, required for async/await
89
- 'node_modules/babel-polyfill/dist/polyfill.js',
162
+ 'node_modules/@babel/polyfill/dist/polyfill.js',
90
163
  // TextDecoder polyfill, required for TextDecoder/TextEncoder on IE and
91
164
  // legacy Edge
92
165
  // eslint-disable-next-line max-len
@@ -106,46 +179,46 @@ module.exports = (config) => {
106
179
  'dist/deps.js',
107
180
  'shaka-player.uncompiled.js',
108
181
 
182
+ // the demo's config tab will register with shakaDemoMain, and will be
183
+ // tested in test/demo/demo_unit.js
184
+ 'demo/config.js',
185
+
109
186
  // cajon module (an AMD variant of requirejs) next
110
187
  'node_modules/cajon/cajon.js',
111
188
 
112
- // bootstrapping for the test suite
113
- 'test/test/boot.js',
189
+ // define the test namespace next (shaka.test)
190
+ 'test/test/namespace.js',
114
191
 
115
- // test utils next
192
+ // test utilities next, which fill in that namespace
116
193
  'test/test/util/*.js',
117
194
 
118
- // list of test assets next
119
- 'demo/common/message_ids.js',
120
- 'demo/common/asset.js',
121
- 'demo/common/assets.js',
195
+ // bootstrapping for the test suite last; this will load the actual tests
196
+ 'test/test/boot.js',
122
197
 
123
198
  // if --test-custom-asset *is not* present, we will add unit tests.
124
199
  // if --quick *is not* present, we will add integration tests.
125
200
  // if --external *is* present, we will add external asset tests.
126
201
 
127
- // load relevant demo files
128
- {
129
- pattern: 'demo/!(main|load|demo_uncompiled|service_worker).js',
130
- included: true,
131
- },
132
-
133
- // source files - these are only watched and served
202
+ // source files - these are only watched and served.
203
+ // anything not listed here can't be dynamically loaded by other scripts.
134
204
  {pattern: 'lib/**/*.js', included: false},
135
205
  {pattern: 'ui/**/*.js', included: false},
136
206
  {pattern: 'ui/**/*.less', included: false},
137
207
  {pattern: 'third_party/**/*.js', included: false},
138
- {
139
- pattern: 'node_modules/google-closure-library/closure/goog/**/*.js',
140
- included: false,
141
- },
208
+ {pattern: 'test/**/*.js', included: false},
142
209
  {pattern: 'test/test/assets/*', included: false},
143
210
  {pattern: 'test/test/assets/3675/*', included: false},
144
211
  {pattern: 'dist/shaka-player.ui.js', included: false},
145
212
  {pattern: 'dist/locales.js', included: false},
213
+ {pattern: 'demo/**/*.js', included: false},
146
214
  {pattern: 'demo/locales/en.json', included: false},
147
215
  {pattern: 'demo/locales/source.json', included: false},
148
- {pattern: 'node_modules/**/*.js', included: false},
216
+ {pattern: 'node_modules/sprintf-js/src/sprintf.js', included: false},
217
+ {pattern: 'node_modules/less/dist/less.js', included: false},
218
+ {
219
+ pattern: 'node_modules/fontfaceonload/dist/fontfaceonload.js',
220
+ included: false,
221
+ },
149
222
  ],
150
223
 
151
224
  // NOTE: Do not use proxies at all! They cannot be used with the --hostname
@@ -211,7 +284,7 @@ module.exports = (config) => {
211
284
 
212
285
  // Set which browsers to run on. If this is null, then Karma will wait for
213
286
  // an incoming connection.
214
- browsers: settings.browsers,
287
+ browsers,
215
288
 
216
289
  // Enable / disable colors in the output (reporters and logs). Defaults
217
290
  // to true.
@@ -242,6 +315,7 @@ module.exports = (config) => {
242
315
 
243
316
  specReporter: {
244
317
  suppressSkipped: true,
318
+ showBrowser: true,
245
319
  },
246
320
  });
247
321
 
@@ -259,7 +333,7 @@ module.exports = (config) => {
259
333
 
260
334
  babelPreprocessor: {
261
335
  options: {
262
- presets: ['env'],
336
+ presets: ['@babel/preset-env'],
263
337
  // Add source maps so that backtraces refer to the original code.
264
338
  // Babel will output inline source maps, and the 'sourcemap'
265
339
  // preprocessor will read them and feed them to Karma. Karma will
@@ -282,26 +356,30 @@ module.exports = (config) => {
282
356
  });
283
357
  }
284
358
 
359
+ const clientArgs = config.client.args[0];
360
+ clientArgs.testFiles = [];
361
+
285
362
  if (settings.test_custom_asset) {
286
363
  // If testing custom assets, we don't serve other unit or integration tests.
287
364
  // External asset tests are the basis for custom asset testing, so this file
288
365
  // is automatically included.
289
- config.files.push('test/player_external.js');
366
+ clientArgs.testFiles.push('test/player_external.js');
290
367
  } else {
291
368
  // In a normal test run, we serve unit tests.
292
- config.files.push('test/**/*_unit.js');
369
+ clientArgs.testFiles.push('test/**/*_unit.js');
293
370
 
294
371
  if (!settings.quick) {
295
372
  // If --quick is present, we don't serve integration tests.
296
- config.files.push('test/**/*_integration.js');
373
+ clientArgs.testFiles.push('test/**/*_integration.js');
297
374
  }
298
375
  if (settings.external) {
299
376
  // If --external is present, we serve external asset tests.
300
- config.files.push('test/**/*_external.js');
377
+ clientArgs.testFiles.push('test/**/*_external.js');
301
378
  }
302
379
  }
303
- // We just modified the config in-place. No need for config.set() after we
304
- // push to config.files.
380
+
381
+ // These are the test files that will be dynamically loaded by boot.js.
382
+ clientArgs.testFiles = resolveGlobs(clientArgs.testFiles);
305
383
 
306
384
  const reporters = [];
307
385
 
@@ -336,20 +414,54 @@ module.exports = (config) => {
336
414
 
337
415
  config.set({reporters: reporters});
338
416
 
417
+ if (reporters.includes('spec') && settings.spec_hide_passed) {
418
+ config.set({specReporter: {suppressPassed: true}});
419
+ }
420
+
339
421
  if (settings.random) {
340
422
  // If --seed was specified use that value, else generate a seed so that the
341
423
  // exact order can be reproduced if it catches an issue.
342
424
  const seed = settings.seed == null ? new Date().getTime() : settings.seed;
343
425
 
344
426
  // Run tests in a random order.
345
- const clientArgs = config.client.args[0];
346
427
  clientArgs.random = true;
347
428
  clientArgs.seed = seed;
348
429
 
349
430
  console.log('Using a random test order (--random) with --seed=' + seed);
350
431
  }
432
+
433
+ if (settings.tls_key && settings.tls_cert) {
434
+ config.set({
435
+ protocol: 'https',
436
+ httpsServerOptions: {
437
+ key: fs.readFileSync(settings.tls_key),
438
+ cert: fs.readFileSync(settings.tls_cert),
439
+ },
440
+ });
441
+ }
351
442
  };
352
443
 
444
+ /**
445
+ * Resolves a list of paths using globs into a list of explicit paths.
446
+ * Paths are all relative to the source directory.
447
+ *
448
+ * @param {!Array.<string>} list
449
+ * @return {!Array.<string>}
450
+ */
451
+ function resolveGlobs(list) {
452
+ const options = {
453
+ cwd: __dirname,
454
+ };
455
+
456
+ const resolved = [];
457
+ for (const path of list) {
458
+ for (const resolvedPath of glob.sync(path, options)) {
459
+ resolved.push(resolvedPath);
460
+ }
461
+ }
462
+ return resolved;
463
+ }
464
+
353
465
  /**
354
466
  * Determines which launchers and customLaunchers can be used and returns an
355
467
  * array of strings.
@@ -416,7 +528,7 @@ function allUsableBrowserLaunchers(config) {
416
528
  browsers.push(...Object.keys(config.customLaunchers));
417
529
  }
418
530
 
419
- return browsers;
531
+ return browsers.sort();
420
532
  }
421
533
 
422
534
  /**
@@ -518,8 +630,7 @@ function WebDriverScreenshotMiddlewareFactory(launcher) {
518
630
  *
519
631
  * @param {karma.Launcher.Browser} browser
520
632
  * @param {!Object.<string, string>} params
521
- * @return {!Promise.<number>} The number of pixels changed between the old
522
- * and new screenshots, after cropping and scaling.
633
+ * @return {!Promise.<number>} A similarity score between 0 and 1.
523
634
  */
524
635
  async function diffScreenshot(browser, params) {
525
636
  const webDriverClient = getWebDriverClient(browser);
@@ -604,22 +715,22 @@ function WebDriverScreenshotMiddlewareFactory(launcher) {
604
715
  // Compare the new screenshot to the old one and produce a diff image.
605
716
  // Initially, the image data will be raw pixels, 4 bytes per pixel.
606
717
  // The threshold parameter affects the sensitivity of individual pixel
607
- // comparisons. Setting it too low means small rendering changes in the
608
- // browser can cause failures even when a human can't see the difference,
609
- // and setting it too high means human-noticeable changes could go
610
- // undetected by a test.
611
- const diff = Jimp.diff(oldScreenshot, newScreenshot, /* threshold= */ 0.07);
718
+ // comparisons. This diff is only used for visual review, not for
719
+ // automated similarity checks, so the threshold setting is not so critical
720
+ // as it used to be.
721
+ const threshold = 0.10;
722
+ const diff = Jimp.diff(oldScreenshot, newScreenshot, threshold);
612
723
 
613
724
  // Write the diff to disk. This is used to review when there are changes.
725
+ const fullSizeDiff =
726
+ diff.image.clone().resize(width, height, Jimp.RESIZE_BICUBIC);
614
727
  fs.writeFileSync(
615
- diffScreenshotPath, await diff.image.getBufferAsync('image/png'));
616
-
617
- // "percent" is, surprisingly, a number between 0 and 1, not between 0 and
618
- // 100. Convert this to a number of pixels changed, which has been found to
619
- // be a more effective and less flaky metric.
620
- const pixelsChanged =
621
- diff.percent * diff.image.bitmap.width * diff.image.bitmap.height;
622
- return pixelsChanged;
728
+ diffScreenshotPath, await fullSizeDiff.getBufferAsync('image/png'));
729
+
730
+ // Compare with a structural similarity algorithm. This produces a
731
+ // similarity score that we will use to pass or fail the test.
732
+ const ssimResult = ssim(oldScreenshot.bitmap, newScreenshot.bitmap);
733
+ return ssimResult.mssim; // A score between 0 and 1.
623
734
  }
624
735
 
625
736
  /**
@@ -9,7 +9,6 @@ goog.provide('shaka.abr.SimpleAbrManager');
9
9
  goog.require('goog.asserts');
10
10
  goog.require('shaka.abr.EwmaBandwidthEstimator');
11
11
  goog.require('shaka.log');
12
- goog.require('shaka.util.Iterables');
13
12
  goog.require('shaka.util.StreamUtils');
14
13
 
15
14
 
@@ -142,15 +141,21 @@ shaka.abr.SimpleAbrManager = class {
142
141
  // Start by assuming that we will use the first Stream.
143
142
  let chosen = sortedVariants[0] || null;
144
143
 
145
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
146
- for (const {item, next} of enumerate(sortedVariants)) {
144
+ for (let i = 0; i < sortedVariants.length; i++) {
145
+ const item = sortedVariants[i];
147
146
  const playbackRate =
148
147
  !isNaN(this.playbackRate_) ? Math.abs(this.playbackRate_) : 1;
149
148
  const itemBandwidth = playbackRate * item.bandwidth;
150
149
  const minBandwidth =
151
150
  itemBandwidth / this.config_.bandwidthDowngradeTarget;
152
- const nextBandwidth =
153
- playbackRate * (next || {bandwidth: Infinity}).bandwidth;
151
+ let next = {bandwidth: Infinity};
152
+ for (let j = i + 1; j < sortedVariants.length; j++) {
153
+ if (item.bandwidth != sortedVariants[j].bandwidth) {
154
+ next = sortedVariants[j];
155
+ break;
156
+ }
157
+ }
158
+ const nextBandwidth = playbackRate * next.bandwidth;
154
159
  const maxBandwidth = nextBandwidth / this.config_.bandwidthUpgradeTarget;
155
160
  shaka.log.v2('Bandwidth ranges:',
156
161
  (itemBandwidth / 1e6).toFixed(3),
@@ -158,7 +163,8 @@ shaka.abr.SimpleAbrManager = class {
158
163
  (maxBandwidth / 1e6).toFixed(3));
159
164
 
160
165
  if (currentBandwidth >= minBandwidth &&
161
- currentBandwidth <= maxBandwidth) {
166
+ currentBandwidth <= maxBandwidth &&
167
+ chosen.bandwidth != item.bandwidth) {
162
168
  chosen = item;
163
169
  }
164
170
  }
@@ -448,6 +448,7 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
448
448
  this.ssAdManager_.release();
449
449
  this.ssAdManager_ = null;
450
450
  }
451
+ super.release();
451
452
  }
452
453
 
453
454
 
@@ -120,6 +120,9 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
120
120
  this.videoProxy_ = null;
121
121
  this.playerProxy_ = null;
122
122
 
123
+ // FakeEventTarget implements IReleasable
124
+ super.release();
125
+
123
126
  return Promise.all(waitFor);
124
127
  }
125
128
 
@@ -311,10 +314,9 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
311
314
  * @private
312
315
  */
313
316
  mapCompiledToUncompiledPlayerMethodNames_() {
314
- // In compiled mode, UI tries to access player methods
315
- // by their internal renamed names, but the proxy object doesn't know about
316
- // those.
317
- // See https://github.com/google/shaka-player/issues/2130 for details.
317
+ // In compiled mode, UI tries to access player methods by their internal
318
+ // renamed names, but the proxy object doesn't know about those. See
319
+ // https://github.com/shaka-project/shaka-player/issues/2130 for details.
318
320
  const methodsToNames = new Map();
319
321
  this.iterateOverPlayerMethods_((name, method) => {
320
322
  if (methodsToNames.has(method)) {
@@ -238,6 +238,9 @@ shaka.cast.CastReceiver = class extends shaka.util.FakeEventTarget {
238
238
  this.shakaBus_ = null;
239
239
  this.genericBus_ = null;
240
240
 
241
+ // FakeEventTarget implements IReleasable
242
+ super.release();
243
+
241
244
  await Promise.all(waitFor);
242
245
 
243
246
  const manager = cast.receiver.CastReceiverManager.getInstance();
@@ -140,8 +140,8 @@ shaka.cea.Cea608DataChannel = class {
140
140
  const buf = this.curbuf_;
141
141
 
142
142
  // Move entire scroll window to a new base in rollup mode.
143
- if (this.type_ === shaka.cea.Cea608DataChannel.CaptionType.ROLLUP
144
- && row !== buf.getRow()) {
143
+ if (this.type_ === shaka.cea.Cea608DataChannel.CaptionType.ROLLUP &&
144
+ row !== buf.getRow()) {
145
145
  const oldTopRow = 1 + buf.getRow() - buf.getScrollSize();
146
146
  const newTopRow = 1 + row - buf.getScrollSize();
147
147
 
@@ -9,7 +9,6 @@ goog.provide('shaka.cea.Cea708Service');
9
9
  goog.require('shaka.cea.Cea708Window');
10
10
  goog.require('shaka.cea.DtvccPacket');
11
11
  goog.require('shaka.cea.ICaptionDecoder');
12
- goog.require('shaka.util.Error');
13
12
 
14
13
 
15
14
  /**
@@ -301,17 +300,19 @@ shaka.cea.Cea708Service = class {
301
300
  /**
302
301
  * Yields each non-null window specified in the 8-bit bitmap.
303
302
  * @param {number} bitmap 8 bits corresponding to each of the 8 windows.
304
- * @return {!Iterable.<number>}
303
+ * @return {!Array.<number>}
305
304
  * @private
306
305
  */
307
- * getSpecifiedWindowIds_(bitmap) {
306
+ getSpecifiedWindowIds_(bitmap) {
307
+ const ids = [];
308
308
  for (let i = 0; i < 8; i++) {
309
309
  const windowSpecified = (bitmap & 0x01) === 0x01;
310
310
  if (windowSpecified && this.windows_[i]) {
311
- yield i;
311
+ ids.push(i);
312
312
  }
313
313
  bitmap >>= 1;
314
314
  }
315
+ return ids;
315
316
  }
316
317
 
317
318
  /**
@@ -150,11 +150,11 @@ shaka.cea.Mp4CeaParser = class {
150
150
 
151
151
  // If specified, defaultSampleDuration and defaultSampleSize
152
152
  // override the ones specified in the TREX box
153
- defaultSampleDuration = parsedTFHD.defaultSampleDuration
154
- || this.defaultSampleDuration_;
153
+ defaultSampleDuration = parsedTFHD.defaultSampleDuration ||
154
+ this.defaultSampleDuration_;
155
155
 
156
- defaultSampleSize = parsedTFHD.defaultSampleSize
157
- || this.defaultSampleSize_;
156
+ defaultSampleSize = parsedTFHD.defaultSampleSize ||
157
+ this.defaultSampleSize_;
158
158
 
159
159
  const trackId = parsedTFHD.trackId;
160
160
 
@@ -236,7 +236,13 @@ shaka.cea.Mp4CeaParser = class {
236
236
  });
237
237
  }
238
238
  } else {
239
- reader.skip(naluSize - 1);
239
+ try {
240
+ reader.skip(naluSize - 1);
241
+ } catch (e) {
242
+ // It is necessary to ignore this error because it can break the start
243
+ // of playback even if the user does not want to see the subtitles.
244
+ break;
245
+ }
240
246
  }
241
247
  sampleSize -= (naluSize + 4);
242
248
  if (sampleSize == 0) {
@@ -14,9 +14,10 @@ shaka.cea.SeiProcessor = class {
14
14
  /**
15
15
  * Processes supplemental enhancement information data.
16
16
  * @param {!Uint8Array} naluData NALU from which SEI data is to be processed.
17
- * @return {!Iterable.<!Uint8Array>}
17
+ * @return {!Array.<!Uint8Array>}
18
18
  */
19
- * process(naluData) {
19
+ process(naluData) {
20
+ const seiPayloads = [];
20
21
  const naluClone = this.removeEmu(naluData);
21
22
 
22
23
  // The following is an implementation of section 7.3.2.3.1
@@ -41,10 +42,12 @@ shaka.cea.SeiProcessor = class {
41
42
  // Payload type 4 is user_data_registered_itu_t_t35, as per the H.264
42
43
  // spec. This payload type contains caption data.
43
44
  if (payloadType == 0x04) {
44
- yield naluClone.subarray(offset, offset + payloadSize);
45
+ seiPayloads.push(naluClone.subarray(offset, offset + payloadSize));
45
46
  }
46
47
  offset += payloadSize;
47
48
  }
49
+
50
+ return seiPayloads;
48
51
  }
49
52
 
50
53