shaka-player 4.4.3 → 4.6.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.
- package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
- package/.github/workflows/release-please.yaml +2 -27
- package/AUTHORS +2 -0
- package/CHANGELOG.md +156 -39
- package/CODE_OF_CONDUCT.md +1 -1
- package/CONTRIBUTORS +2 -0
- package/README.md +54 -42
- package/demo/asset_card.js +18 -21
- package/demo/cast_receiver/index.html +0 -1
- package/demo/close_button.js +0 -3
- package/demo/common/asset.js +33 -22
- package/demo/common/assets.js +249 -60
- package/demo/config.js +219 -253
- package/demo/custom.js +88 -133
- package/demo/front.js +7 -10
- package/demo/index.html +19 -22
- package/demo/input.js +6 -11
- package/demo/input_container.js +8 -9
- package/demo/main.js +62 -126
- package/demo/search.js +29 -34
- package/demo/service_worker.js +0 -3
- package/demo/tooltip.js +3 -5
- package/demo/visualizer.js +3 -5
- package/demo/visualizer_button.js +1 -20
- package/dist/controls.css +1 -1
- package/dist/controls.css.map +1 -1
- package/dist/demo.compiled.debug.js +211 -228
- package/dist/demo.compiled.debug.map +4 -4
- package/dist/demo.compiled.js +211 -228
- package/dist/demo.compiled.map +4 -4
- package/dist/deps.js +42 -37
- package/dist/locales.js +34 -30
- package/dist/receiver.compiled.debug.js +64 -77
- package/dist/receiver.compiled.debug.map +4 -4
- package/dist/receiver.compiled.js +64 -77
- package/dist/receiver.compiled.map +4 -4
- package/dist/shaka-player.compiled.d.ts +343 -151
- package/dist/shaka-player.compiled.debug.d.ts +343 -151
- package/dist/shaka-player.compiled.debug.externs.js +356 -117
- package/dist/shaka-player.compiled.debug.js +952 -811
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +356 -117
- package/dist/shaka-player.compiled.js +1165 -1078
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +359 -153
- package/dist/shaka-player.ui.debug.d.ts +359 -153
- package/dist/shaka-player.ui.debug.externs.js +382 -117
- package/dist/shaka-player.ui.debug.js +1084 -918
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +382 -117
- package/dist/shaka-player.ui.js +1377 -1274
- package/dist/shaka-player.ui.map +4 -4
- package/docs/design/lcevc-integration.md +14 -14
- package/docs/tutorials/ad_monetization.md +54 -0
- package/docs/tutorials/basic-usage.md +2 -1
- package/docs/tutorials/errors.md +2 -1
- package/docs/tutorials/faq.md +27 -55
- package/docs/tutorials/index.json +2 -1
- package/docs/tutorials/lcevc.md +118 -0
- package/docs/tutorials/offline.md +10 -8
- package/docs/tutorials/plugins.md +5 -0
- package/docs/tutorials/ui-customization.md +17 -0
- package/docs/tutorials/ui.md +2 -1
- package/docs/tutorials/upgrade.md +3 -0
- package/externs/css_style_declaration.js +19 -0
- package/externs/lcevc.js +37 -13
- package/externs/managedmediasource.js +24 -0
- package/externs/media_remote.js +68 -0
- package/externs/mediatailor.js +193 -0
- package/externs/pictureinpicture.js +11 -0
- package/externs/shaka/abr_manager.js +6 -2
- package/externs/shaka/ads.js +27 -0
- package/externs/shaka/cea.js +7 -0
- package/externs/shaka/codecs.js +5 -3
- package/externs/shaka/manifest.js +31 -10
- package/externs/shaka/manifest_parser.js +24 -1
- package/externs/shaka/net.js +2 -2
- package/externs/shaka/offline.js +13 -2
- package/externs/shaka/player.js +65 -8
- package/externs/shaka/text.js +3 -1
- package/externs/shaka/transmuxer.js +1 -1
- package/karma.conf.js +7 -3
- package/lib/abr/simple_abr_manager.js +66 -9
- package/lib/ads/ad_manager.js +104 -50
- package/lib/ads/media_tailor_ad.js +297 -0
- package/lib/ads/media_tailor_ad_manager.js +839 -0
- package/lib/cast/cast_receiver.js +1 -1
- package/lib/cea/cea_decoder.js +28 -0
- package/lib/cea/dummy_caption_decoder.js +5 -0
- package/lib/cea/ts_cea_parser.js +15 -2
- package/lib/config/codec_switching_strategy.js +24 -0
- package/lib/dash/content_protection.js +120 -2
- package/lib/dash/dash_parser.js +322 -93
- package/lib/dash/mpd_utils.js +62 -37
- package/lib/dash/segment_base.js +17 -10
- package/lib/dash/segment_list.js +18 -9
- package/lib/dash/segment_template.js +122 -107
- package/lib/dependencies/all.js +8 -7
- package/lib/hls/hls_classes.js +28 -43
- package/lib/hls/hls_parser.js +798 -658
- package/lib/hls/hls_utils.js +64 -5
- package/lib/hls/manifest_text_parser.js +7 -11
- package/lib/lcevc/lcevc_dec.js +220 -0
- package/lib/media/adaptation_set.js +32 -14
- package/lib/media/adaptation_set_criteria.js +86 -16
- package/lib/media/closed_caption_parser.js +13 -0
- package/lib/media/content_workarounds.js +6 -0
- package/lib/media/drm_engine.js +8 -13
- package/lib/media/manifest_parser.js +8 -113
- package/lib/media/media_source_capabilities.js +10 -3
- package/lib/media/media_source_engine.js +286 -44
- package/lib/media/play_rate_controller.js +8 -38
- package/lib/media/presentation_timeline.js +7 -1
- package/lib/media/quality_observer.js +1 -1
- package/lib/media/segment_index.js +6 -6
- package/lib/media/segment_prefetch.js +92 -24
- package/lib/media/segment_reference.js +73 -7
- package/lib/media/segment_utils.js +343 -0
- package/lib/media/stall_detector.js +0 -3
- package/lib/media/streaming_engine.js +73 -38
- package/lib/mss/mss_parser.js +19 -2
- package/lib/net/networking_engine.js +67 -12
- package/lib/net/networking_utils.js +95 -0
- package/lib/offline/indexeddb/v1_storage_cell.js +3 -0
- package/lib/offline/indexeddb/v2_storage_cell.js +3 -0
- package/lib/offline/manifest_converter.js +3 -0
- package/lib/offline/offline_manifest_parser.js +10 -0
- package/lib/offline/storage.js +14 -7
- package/lib/player.js +1098 -1537
- package/lib/polyfill/mediasource.js +22 -1
- package/lib/text/cue.js +15 -0
- package/lib/text/mp4_ttml_parser.js +2 -2
- package/lib/text/srt_text_parser.js +2 -2
- package/lib/text/stub_text_displayer.js +51 -0
- package/lib/text/text_engine.js +3 -2
- package/lib/text/ttml_text_parser.js +45 -5
- package/lib/text/ui_text_displayer.js +8 -0
- package/lib/text/vtt_text_parser.js +40 -22
- package/lib/transmuxer/aac_transmuxer.js +1 -1
- package/lib/transmuxer/ac3_transmuxer.js +1 -1
- package/lib/transmuxer/ec3_transmuxer.js +1 -1
- package/lib/transmuxer/h264.js +5 -4
- package/lib/transmuxer/h265.js +863 -0
- package/lib/transmuxer/mp3_transmuxer.js +1 -1
- package/lib/transmuxer/mpeg_ts_transmuxer.js +4 -3
- package/lib/transmuxer/mss_transmuxer.js +1 -1
- package/lib/transmuxer/ts_transmuxer.js +187 -22
- package/lib/util/buffer_utils.js +26 -4
- package/lib/util/content_steering_manager.js +358 -0
- package/lib/util/error.js +30 -15
- package/lib/util/exp_golomb.js +30 -2
- package/lib/util/fairplay_utils.js +1 -1
- package/lib/util/fake_event.js +8 -1
- package/lib/util/id3_utils.js +50 -1
- package/lib/util/manifest_parser_utils.js +12 -8
- package/lib/util/mp4_generator.js +6 -8
- package/lib/util/mutex.js +59 -0
- package/lib/util/object_utils.js +1 -1
- package/lib/util/periods.js +156 -179
- package/lib/util/platform.js +44 -3
- package/lib/util/player_configuration.js +43 -6
- package/lib/util/state_history.js +6 -2
- package/lib/util/stream_utils.js +206 -283
- package/lib/util/ts_parser.js +335 -98
- package/lib/util/uint8array_utils.js +5 -1
- package/lib/util/xml_utils.js +5 -0
- package/maintained-branches.md +3 -2
- package/package.json +4 -6
- package/roadmap.md +25 -5
- package/shaka-player.uncompiled.js +2 -2
- package/support.html +0 -1
- package/test/abr/simple_abr_manager_unit.js +33 -33
- package/test/ads/ad_manager_unit.js +3 -2
- package/test/cast/cast_receiver_integration.js +50 -4
- package/test/cast/cast_utils_unit.js +2 -0
- package/test/cea/cea_decoder_unit.js +7 -0
- package/test/codec_switching/codec_switching_integration.js +182 -0
- package/test/dash/dash_parser_content_protection_unit.js +2 -0
- package/test/dash/dash_parser_integration.js +74 -0
- package/test/dash/dash_parser_live_unit.js +2 -19
- package/test/dash/dash_parser_manifest_unit.js +536 -2
- package/test/dash/dash_parser_segment_base_unit.js +2 -0
- package/test/dash/dash_parser_segment_list_unit.js +2 -0
- package/test/dash/dash_parser_segment_template_unit.js +2 -0
- package/test/dash/mpd_utils_unit.js +61 -30
- package/test/demo/demo_unit.js +0 -16
- package/test/hls/hls_live_unit.js +14 -3
- package/test/hls/hls_parser_unit.js +385 -33
- package/test/hls/manifest_text_parser_unit.js +32 -99
- package/test/media/adaptation_set_criteria_unit.js +284 -15
- package/test/media/adaptation_set_unit.js +2 -0
- package/test/media/content_workarounds_unit.js +1 -1
- package/test/media/drm_engine_unit.js +3 -3
- package/test/media/media_source_engine_unit.js +166 -2
- package/test/media/play_rate_controller_unit.js +0 -48
- package/test/media/segment_index_unit.js +5 -4
- package/test/media/segment_prefetch_unit.js +1 -1
- package/test/media/streaming_engine_unit.js +17 -17
- package/test/mss/mss_parser_unit.js +2 -0
- package/test/mss/mss_player_integration.js +3 -2
- package/test/net/networking_engine_unit.js +3 -3
- package/test/{media/manifest_parser_unit.js → net/networking_utils_unit.js} +2 -2
- package/test/offline/manifest_convert_unit.js +14 -0
- package/test/offline/offline_integration.js +2 -1
- package/test/offline/storage_integration.js +22 -13
- package/test/player_external.js +4 -2
- package/test/player_integration.js +15 -4
- package/test/player_load_graph_integration.js +47 -151
- package/test/player_src_equals_external.js +1 -0
- package/test/player_src_equals_integration.js +71 -4
- package/test/player_unit.js +182 -158
- package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/dash.mpd +18 -0
- package/test/test/assets/dash-aes-128/license +1 -0
- package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
- package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
- package/test/test/assets/dash-multi-codec/dash.mpd +32 -0
- package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
- package/test/test/assets/hls-ts-h265/0.ts +0 -0
- package/test/test/assets/hls-ts-h265/hevc.m3u8 +6 -0
- package/test/test/assets/hls-ts-h265/index.m3u8 +7 -0
- package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +9 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +24 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +14 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +23 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
- package/test/test/util/dash_parser_util.js +4 -0
- package/test/test/util/fake_ad_manager.js +20 -0
- package/test/test/util/fake_media_source_engine.js +13 -2
- package/test/test/util/fake_networking_engine.js +9 -1
- package/test/test/util/fake_segment_prefetch.js +3 -0
- package/test/test/util/manifest_generator.js +11 -3
- package/test/test/util/manifest_parser_util.js +14 -2
- package/test/test/util/mss_parser_util.js +4 -0
- package/test/test/util/offline_utils.js +2 -0
- package/test/test/util/simple_fakes.js +2 -2
- package/test/test/util/streaming_engine_util.js +10 -4
- package/test/test/util/test_scheme.js +6 -0
- package/test/test/util/ui_utils.js +4 -3
- package/test/text/mp4_ttml_parser_unit.js +4 -4
- package/test/text/srt_text_parser_unit.js +1 -1
- package/test/text/text_displayer_layout_unit.js +1 -1
- package/test/text/text_engine_unit.js +6 -0
- package/test/text/ttml_text_parser_unit.js +85 -2
- package/test/text/vtt_text_parser_unit.js +103 -31
- package/test/transmuxer/transmuxer_engine_integration.js +9 -0
- package/test/transmuxer/transmuxer_integration.js +150 -3
- package/test/ui/ad_ui_unit.js +2 -2
- package/test/ui/ui_customization_unit.js +17 -16
- package/test/ui/ui_integration.js +30 -20
- package/test/ui/ui_unit.js +28 -29
- package/test/util/buffer_utils_unit.js +1 -1
- package/test/util/content_steering_manager_unit.js +427 -0
- package/test/util/id3_utils_unit.js +52 -0
- package/test/util/stream_utils_unit.js +207 -169
- package/test/util/ts_parser_unit.js +3 -3
- package/third_party/closure-uri/uri.js +13 -1
- package/ui/audio_language_selection.js +9 -2
- package/ui/controls.js +125 -0
- package/ui/externs/ui.js +24 -2
- package/ui/language_utils.js +43 -8
- package/ui/less/range_elements.less +33 -0
- package/ui/locales/en.json +1 -0
- package/ui/locales/es-419.json +1 -0
- package/ui/locales/es.json +1 -0
- package/ui/locales/source.json +4 -0
- package/ui/localization.js +10 -0
- package/ui/pip_button.js +22 -120
- package/ui/remote_button.js +203 -0
- package/ui/resolution_selection.js +47 -10
- package/ui/seek_bar.js +296 -3
- package/ui/text_selection.js +2 -1
- package/ui/ui.js +11 -4
- package/demo/common/message_ids.js +0 -309
- package/demo/locales/en.json +0 -288
- package/demo/locales/source.json +0 -1146
- package/externs/mux.js +0 -69
- package/lib/lcevc/lcevc_dil.js +0 -152
- package/lib/routing/node.js +0 -23
- package/lib/routing/payload.js +0 -43
- package/lib/routing/walker.js +0 -587
- package/lib/transmuxer/muxjs_transmuxer.js +0 -242
- package/test/routing/walker_unit.js +0 -504
- package/test/transmuxer/muxjs_transmuxer_integration.js +0 -177
|
@@ -45,7 +45,8 @@ describe('UI', () => {
|
|
|
45
45
|
videoContainer = shaka.util.Dom.createHTMLElement('div');
|
|
46
46
|
videoContainer.appendChild(video);
|
|
47
47
|
document.body.appendChild(videoContainer);
|
|
48
|
-
player = new compiledShaka.Player(
|
|
48
|
+
player = new compiledShaka.Player();
|
|
49
|
+
await player.attach(video);
|
|
49
50
|
|
|
50
51
|
// Create UI
|
|
51
52
|
// Add all of the buttons we have
|
|
@@ -313,8 +314,6 @@ describe('UI', () => {
|
|
|
313
314
|
describe('resolution selection', () => {
|
|
314
315
|
/** @type {!Map.<number, !HTMLElement>} */
|
|
315
316
|
let resolutionsToButtons;
|
|
316
|
-
/** @type {!Array.<number>} */
|
|
317
|
-
let resolutionsFromContent;
|
|
318
317
|
/** @type {!Array.<!HTMLElement>} */
|
|
319
318
|
let resolutionButtons;
|
|
320
319
|
/** @type {!Element} */
|
|
@@ -329,6 +328,8 @@ describe('UI', () => {
|
|
|
329
328
|
let preferredLanguage;
|
|
330
329
|
/** @type {!shaka.extern.Track} */
|
|
331
330
|
let oldResolutionTrack;
|
|
331
|
+
/** @type {number} */
|
|
332
|
+
let newResolutionTrackId;
|
|
332
333
|
|
|
333
334
|
beforeEach(async () => {
|
|
334
335
|
oldResolution = 182;
|
|
@@ -353,6 +354,7 @@ describe('UI', () => {
|
|
|
353
354
|
updateResolutionButtonsAndMap();
|
|
354
355
|
|
|
355
356
|
oldResolutionTrack = findTrackWithHeight(tracks, oldResolution);
|
|
357
|
+
newResolutionTrackId = findTrackWithHeight(tracks, newResolution).id;
|
|
356
358
|
|
|
357
359
|
const selectedResolution =
|
|
358
360
|
getSelectedTrack(player.getVariantTracks()).height;
|
|
@@ -363,9 +365,8 @@ describe('UI', () => {
|
|
|
363
365
|
});
|
|
364
366
|
|
|
365
367
|
it('contains all the relevant resolutions', () => {
|
|
366
|
-
const formattedResolutions =
|
|
367
|
-
|
|
368
|
-
});
|
|
368
|
+
const formattedResolutions =
|
|
369
|
+
tracks.map((t) => formatResolution(t.id, tracks));
|
|
369
370
|
verifyItems(formattedResolutions, resolutionButtons);
|
|
370
371
|
});
|
|
371
372
|
|
|
@@ -374,7 +375,7 @@ describe('UI', () => {
|
|
|
374
375
|
tracks = player.getVariantTracks();
|
|
375
376
|
expect(getSelectedTrack(tracks).height).toBe(oldResolution);
|
|
376
377
|
|
|
377
|
-
const button = resolutionsToButtons.get(
|
|
378
|
+
const button = resolutionsToButtons.get(newResolutionTrackId);
|
|
378
379
|
button.click();
|
|
379
380
|
|
|
380
381
|
// Wait for the change to take effect
|
|
@@ -400,7 +401,7 @@ describe('UI', () => {
|
|
|
400
401
|
|
|
401
402
|
expect(getSelectedTrack(tracks).height).toBe(newResolution);
|
|
402
403
|
|
|
403
|
-
const button = resolutionsToButtons.get(
|
|
404
|
+
const button = resolutionsToButtons.get(newResolutionTrackId);
|
|
404
405
|
const isChosen = button.querySelector('.shaka-chosen-item');
|
|
405
406
|
|
|
406
407
|
expect(isChosen).not.toBe(null);
|
|
@@ -427,7 +428,7 @@ describe('UI', () => {
|
|
|
427
428
|
const p = waiter.waitForEvent(controls, 'resolutionselectionupdated');
|
|
428
429
|
|
|
429
430
|
// Any resolution would works
|
|
430
|
-
const button = resolutionsToButtons.get(
|
|
431
|
+
const button = resolutionsToButtons.get(newResolutionTrackId);
|
|
431
432
|
button.click();
|
|
432
433
|
|
|
433
434
|
await p;
|
|
@@ -467,13 +468,26 @@ describe('UI', () => {
|
|
|
467
468
|
|
|
468
469
|
/**
|
|
469
470
|
* Gets the resolution to the same format it
|
|
470
|
-
* appears in the UI
|
|
471
|
+
* appears in the UI
|
|
471
472
|
*
|
|
472
|
-
* @param {number}
|
|
473
|
+
* @param {number} id
|
|
474
|
+
* @param {!Array.<!shaka.extern.Track>} tracks
|
|
473
475
|
* @return {string}
|
|
474
476
|
*/
|
|
475
|
-
function formatResolution(
|
|
476
|
-
|
|
477
|
+
function formatResolution(id, tracks) {
|
|
478
|
+
const track = tracks.find((t) => t.id == id);
|
|
479
|
+
const trackHeight = track.height || 0;
|
|
480
|
+
const trackWidth = track.width || 0;
|
|
481
|
+
let height = trackHeight;
|
|
482
|
+
const aspectRatio = trackWidth / trackHeight;
|
|
483
|
+
if (aspectRatio > (16 / 9)) {
|
|
484
|
+
height = Math.round(trackWidth * 9 / 16);
|
|
485
|
+
}
|
|
486
|
+
let text = height + 'p';
|
|
487
|
+
if (height == 2160) {
|
|
488
|
+
text = '4K';
|
|
489
|
+
}
|
|
490
|
+
return text;
|
|
477
491
|
}
|
|
478
492
|
|
|
479
493
|
/**
|
|
@@ -500,10 +514,6 @@ describe('UI', () => {
|
|
|
500
514
|
return track.language == preferredLanguage;
|
|
501
515
|
});
|
|
502
516
|
|
|
503
|
-
resolutionsFromContent = tracks.map((track) => {
|
|
504
|
-
return track.height;
|
|
505
|
-
});
|
|
506
|
-
|
|
507
517
|
resolutionButtons = filterButtons(
|
|
508
518
|
/* buttons= */ resolutionsMenu.childNodes,
|
|
509
519
|
/* excludeClasses= */ [
|
|
@@ -513,8 +523,8 @@ describe('UI', () => {
|
|
|
513
523
|
|
|
514
524
|
resolutionsToButtons = mapChoicesToButtons(
|
|
515
525
|
/* buttons= */ resolutionButtons,
|
|
516
|
-
/* choices= */
|
|
517
|
-
/* modifier= */ formatResolution);
|
|
526
|
+
/* choices= */ tracks.map((track) => track.id),
|
|
527
|
+
/* modifier= */ (id) => formatResolution(id, tracks));
|
|
518
528
|
}
|
|
519
529
|
}); // describe('resolution selection')
|
|
520
530
|
|
|
@@ -598,7 +608,7 @@ describe('UI', () => {
|
|
|
598
608
|
|
|
599
609
|
/**
|
|
600
610
|
* @param {!Array.<!HTMLElement>} buttons
|
|
601
|
-
* @param {!Array.<string>} choices
|
|
611
|
+
* @param {!Array.<string>|!Array.<number>} choices
|
|
602
612
|
* @param {function(string):string|function(number):string} modifier
|
|
603
613
|
* @return {!Map.<string, !HTMLElement>|!Map.<number, !HTMLElement>}
|
|
604
614
|
*/
|
package/test/ui/ui_unit.js
CHANGED
|
@@ -36,14 +36,14 @@ describe('UI', () => {
|
|
|
36
36
|
/** @type {!HTMLVideoElement} */
|
|
37
37
|
let video;
|
|
38
38
|
|
|
39
|
-
beforeEach(() => {
|
|
39
|
+
beforeEach(async () => {
|
|
40
40
|
videoContainer =
|
|
41
41
|
/** @type {!HTMLElement} */ (document.createElement('div'));
|
|
42
42
|
document.body.appendChild(videoContainer);
|
|
43
43
|
|
|
44
44
|
video = shaka.test.UiUtils.createVideoElement();
|
|
45
45
|
videoContainer.appendChild(video);
|
|
46
|
-
UiUtils.createUIThroughAPI(videoContainer, video);
|
|
46
|
+
await UiUtils.createUIThroughAPI(videoContainer, video);
|
|
47
47
|
});
|
|
48
48
|
|
|
49
49
|
it('has all the basic elements', () => {
|
|
@@ -193,7 +193,8 @@ describe('UI', () => {
|
|
|
193
193
|
],
|
|
194
194
|
doubleClickForFullscreen: false,
|
|
195
195
|
};
|
|
196
|
-
const ui = UiUtils.createUIThroughAPI(
|
|
196
|
+
const ui = await UiUtils.createUIThroughAPI(
|
|
197
|
+
videoContainer, video, config);
|
|
197
198
|
const controls = ui.getControls();
|
|
198
199
|
|
|
199
200
|
const spy = spyOn(controls, 'toggleFullScreen');
|
|
@@ -216,8 +217,8 @@ describe('UI', () => {
|
|
|
216
217
|
/** @type {!HTMLElement} */
|
|
217
218
|
let controlsContainer;
|
|
218
219
|
|
|
219
|
-
beforeEach(() => {
|
|
220
|
-
const ui = UiUtils.createUIThroughAPI(videoContainer, video);
|
|
220
|
+
beforeEach(async () => {
|
|
221
|
+
const ui = await UiUtils.createUIThroughAPI(videoContainer, video);
|
|
221
222
|
player = ui.getControls().getLocalPlayer();
|
|
222
223
|
const controlsContainers =
|
|
223
224
|
videoContainer.getElementsByClassName('shaka-controls-container');
|
|
@@ -246,13 +247,14 @@ describe('UI', () => {
|
|
|
246
247
|
/** @type {!HTMLElement} */
|
|
247
248
|
let overflowMenu;
|
|
248
249
|
|
|
249
|
-
beforeEach(() => {
|
|
250
|
+
beforeEach(async () => {
|
|
250
251
|
const config = {
|
|
251
252
|
controlPanelElements: [
|
|
252
253
|
'overflow_menu',
|
|
253
254
|
],
|
|
254
255
|
};
|
|
255
|
-
const ui = UiUtils.createUIThroughAPI(
|
|
256
|
+
const ui = await UiUtils.createUIThroughAPI(
|
|
257
|
+
videoContainer, video, config);
|
|
256
258
|
player = ui.getControls().getLocalPlayer();
|
|
257
259
|
|
|
258
260
|
const overflowMenus =
|
|
@@ -323,8 +325,8 @@ describe('UI', () => {
|
|
|
323
325
|
/** @type {!HTMLElement} */
|
|
324
326
|
let controlsButtonPanel;
|
|
325
327
|
|
|
326
|
-
it('has default elements', () => {
|
|
327
|
-
UiUtils.createUIThroughAPI(videoContainer, video);
|
|
328
|
+
it('has default elements', async () => {
|
|
329
|
+
await UiUtils.createUIThroughAPI(videoContainer, video);
|
|
328
330
|
const controlsButtonPanels = videoContainer.getElementsByClassName(
|
|
329
331
|
'shaka-controls-button-panel');
|
|
330
332
|
|
|
@@ -357,7 +359,7 @@ describe('UI', () => {
|
|
|
357
359
|
}
|
|
358
360
|
});
|
|
359
361
|
|
|
360
|
-
it('is accessible', () => {
|
|
362
|
+
it('is accessible', async () => {
|
|
361
363
|
function confirmAriaLabel(className) {
|
|
362
364
|
const elements =
|
|
363
365
|
controlsButtonPanel.getElementsByClassName(className);
|
|
@@ -376,7 +378,7 @@ describe('UI', () => {
|
|
|
376
378
|
],
|
|
377
379
|
};
|
|
378
380
|
|
|
379
|
-
UiUtils.createUIThroughAPI(videoContainer, video, config);
|
|
381
|
+
await UiUtils.createUIThroughAPI(videoContainer, video, config);
|
|
380
382
|
const controlsButtonPanels = videoContainer.getElementsByClassName(
|
|
381
383
|
'shaka-controls-button-panel');
|
|
382
384
|
expect(controlsButtonPanels.length).toBe(1);
|
|
@@ -403,14 +405,15 @@ describe('UI', () => {
|
|
|
403
405
|
/** @type {!Element} */
|
|
404
406
|
let languageMenuButton;
|
|
405
407
|
|
|
406
|
-
beforeEach(() => {
|
|
408
|
+
beforeEach(async () => {
|
|
407
409
|
const config = {
|
|
408
410
|
controlPanelElements: [
|
|
409
411
|
'quality',
|
|
410
412
|
'language',
|
|
411
413
|
],
|
|
412
414
|
};
|
|
413
|
-
const ui = UiUtils.createUIThroughAPI(
|
|
415
|
+
const ui = await UiUtils.createUIThroughAPI(
|
|
416
|
+
videoContainer, video, config);
|
|
414
417
|
player = ui.getControls().getLocalPlayer();
|
|
415
418
|
|
|
416
419
|
const resolutionsMenus =
|
|
@@ -473,7 +476,7 @@ describe('UI', () => {
|
|
|
473
476
|
/** @type {shaka.ui.Controls} */
|
|
474
477
|
let controls;
|
|
475
478
|
|
|
476
|
-
beforeEach(() => {
|
|
479
|
+
beforeEach(async () => {
|
|
477
480
|
const config = {
|
|
478
481
|
controlPanelElements: [
|
|
479
482
|
'overflow_menu',
|
|
@@ -482,7 +485,8 @@ describe('UI', () => {
|
|
|
482
485
|
'quality',
|
|
483
486
|
],
|
|
484
487
|
};
|
|
485
|
-
const ui = UiUtils.createUIThroughAPI(
|
|
488
|
+
const ui = await UiUtils.createUIThroughAPI(
|
|
489
|
+
videoContainer, video, config);
|
|
486
490
|
controls = ui.getControls();
|
|
487
491
|
player = controls.getLocalPlayer();
|
|
488
492
|
|
|
@@ -616,19 +620,10 @@ describe('UI', () => {
|
|
|
616
620
|
player.configure('abr.enabled', false);
|
|
617
621
|
|
|
618
622
|
const tracks = player.getVariantTracks();
|
|
619
|
-
const en2 =
|
|
620
|
-
tracks.find((t) => t.language == 'en' && t.channelsCount == 2);
|
|
621
623
|
const en1 =
|
|
622
624
|
tracks.find((t) => t.language == 'en' && t.channelsCount == 1);
|
|
623
625
|
const es = tracks.find((t) => t.language == 'es');
|
|
624
626
|
|
|
625
|
-
// There are 3 variants with English 2-channel, but one is a duplicate
|
|
626
|
-
// and shouldn't appear in the list.
|
|
627
|
-
goog.asserts.assert(en2, 'Unable to find tracks');
|
|
628
|
-
player.selectVariantTrack(en2, true);
|
|
629
|
-
await updateResolutionMenu();
|
|
630
|
-
expect(getResolutions()).toEqual(['240p', '480p']);
|
|
631
|
-
|
|
632
627
|
// There is 1 variant with English 1-channel.
|
|
633
628
|
goog.asserts.assert(en1, 'Unable to find tracks');
|
|
634
629
|
player.selectVariantTrack(en1, true);
|
|
@@ -646,7 +641,9 @@ describe('UI', () => {
|
|
|
646
641
|
const manifest =
|
|
647
642
|
shaka.test.ManifestGenerator.generate((manifest) => {
|
|
648
643
|
manifest.addVariant(0, (variant) => {
|
|
649
|
-
variant.addAudio(0)
|
|
644
|
+
variant.addAudio(0, (stream) => {
|
|
645
|
+
stream.roles = ['main'];
|
|
646
|
+
});
|
|
650
647
|
variant.bandwidth = 100000;
|
|
651
648
|
});
|
|
652
649
|
manifest.addVariant(1, (variant) => {
|
|
@@ -703,7 +700,7 @@ describe('UI', () => {
|
|
|
703
700
|
/** @type {!HTMLElement} */
|
|
704
701
|
let contextMenu;
|
|
705
702
|
|
|
706
|
-
beforeEach(() => {
|
|
703
|
+
beforeEach(async () => {
|
|
707
704
|
const config = {
|
|
708
705
|
customContextMenu: true,
|
|
709
706
|
contextMenuElements: [
|
|
@@ -712,7 +709,8 @@ describe('UI', () => {
|
|
|
712
709
|
'fakeElement',
|
|
713
710
|
],
|
|
714
711
|
};
|
|
715
|
-
const ui = UiUtils.createUIThroughAPI(
|
|
712
|
+
const ui = await UiUtils.createUIThroughAPI(
|
|
713
|
+
videoContainer, video, config);
|
|
716
714
|
|
|
717
715
|
controlsContainer = ui.getControls().getControlsContainer();
|
|
718
716
|
|
|
@@ -752,7 +750,7 @@ describe('UI', () => {
|
|
|
752
750
|
/** @type {!HTMLElement} */
|
|
753
751
|
let statisticsContainer;
|
|
754
752
|
|
|
755
|
-
beforeEach(() => {
|
|
753
|
+
beforeEach(async () => {
|
|
756
754
|
const config = {
|
|
757
755
|
customContextMenu: true,
|
|
758
756
|
contextMenuElements: [
|
|
@@ -760,7 +758,8 @@ describe('UI', () => {
|
|
|
760
758
|
],
|
|
761
759
|
statisticsList: Object.keys(new shaka.util.Stats().getBlob()),
|
|
762
760
|
};
|
|
763
|
-
const ui = UiUtils.createUIThroughAPI(
|
|
761
|
+
const ui = await UiUtils.createUIThroughAPI(
|
|
762
|
+
videoContainer, video, config);
|
|
764
763
|
player = ui.getControls().getLocalPlayer();
|
|
765
764
|
|
|
766
765
|
const statisticsButtons =
|