shaka-player 3.3.15 → 3.3.17

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 (43) hide show
  1. package/.github/workflows/selenium-lab-tests.yaml +22 -0
  2. package/CHANGELOG.md +27 -0
  3. package/dist/locales.js +31 -31
  4. package/dist/shaka-player.compiled.d.ts +5 -0
  5. package/dist/shaka-player.compiled.debug.d.ts +5 -0
  6. package/dist/shaka-player.compiled.debug.externs.js +4 -0
  7. package/dist/shaka-player.compiled.debug.js +99 -92
  8. package/dist/shaka-player.compiled.debug.map +3 -3
  9. package/dist/shaka-player.compiled.externs.js +4 -0
  10. package/dist/shaka-player.compiled.js +353 -350
  11. package/dist/shaka-player.compiled.map +3 -3
  12. package/dist/shaka-player.ui.d.ts +5 -0
  13. package/dist/shaka-player.ui.debug.d.ts +5 -0
  14. package/dist/shaka-player.ui.debug.externs.js +4 -0
  15. package/dist/shaka-player.ui.debug.js +113 -106
  16. package/dist/shaka-player.ui.debug.map +3 -3
  17. package/dist/shaka-player.ui.externs.js +4 -0
  18. package/dist/shaka-player.ui.js +393 -389
  19. package/dist/shaka-player.ui.map +3 -3
  20. package/externs/shaka/text.js +7 -0
  21. package/lib/dash/segment_template.js +17 -5
  22. package/lib/hls/hls_parser.js +1 -1
  23. package/lib/player.js +7 -1
  24. package/lib/polyfill/media_capabilities.js +1 -0
  25. package/lib/text/cue.js +6 -0
  26. package/lib/text/ui_text_displayer.js +25 -9
  27. package/lib/text/vtt_text_parser.js +256 -91
  28. package/lib/text/web_vtt_generator.js +21 -9
  29. package/lib/util/dom_utils.js +3 -1
  30. package/lib/util/platform.js +8 -0
  31. package/lib/util/stream_utils.js +6 -0
  32. package/lib/util/timer.js +17 -0
  33. package/package.json +1 -1
  34. package/support.html +1 -0
  35. package/test/dash/dash_parser_manifest_unit.js +0 -36
  36. package/test/player_integration.js +27 -0
  37. package/test/player_unit.js +4 -2
  38. package/test/test/util/layout_tests.js +433 -0
  39. package/test/test/util/util.js +0 -120
  40. package/test/{ui → text}/text_displayer_layout_unit.js +59 -235
  41. package/test/text/ui_text_displayer_unit.js +72 -4
  42. package/test/text/vtt_text_parser_unit.js +127 -6
  43. package/test/text/web_vtt_layout_integration.js +528 -0
@@ -338,15 +338,13 @@ describe('UITextDisplayer', () => {
338
338
  it('hides and shows nested cues at appropriate times', () => {
339
339
  const parentCue1 = new shaka.text.Cue(0, 100, '');
340
340
  const cue1 = new shaka.text.Cue(0, 50, 'One');
341
- parentCue1.nestedCues.push(cue1);
342
341
  const cue2 = new shaka.text.Cue(25, 75, 'Two');
343
- parentCue1.nestedCues.push(cue2);
344
342
  const cue3 = new shaka.text.Cue(50, 100, 'Three');
345
- parentCue1.nestedCues.push(cue3);
343
+ parentCue1.nestedCues = [cue1, cue2, cue3];
346
344
 
347
345
  const parentCue2 = new shaka.text.Cue(90, 190, '');
348
346
  const cue4 = new shaka.text.Cue(90, 130, 'Four');
349
- parentCue2.nestedCues.push(cue4);
347
+ parentCue2.nestedCues = [cue4];
350
348
 
351
349
  textDisplayer.setTextVisibility(true);
352
350
  textDisplayer.append([parentCue1, parentCue2]);
@@ -537,4 +535,74 @@ describe('UITextDisplayer', () => {
537
535
  '.shaka-text-region');
538
536
  expect(allRegionElements.length).toBe(1);
539
537
  });
538
+
539
+ it('creates separate regions when dimensions differ but id same', () => {
540
+ const identicalRegionId = 'regionId';
541
+
542
+ const cueRegion1 = new shaka.text.CueRegion();
543
+ const cueRegion2 = new shaka.text.CueRegion();
544
+ cueRegion1.id = identicalRegionId;
545
+ cueRegion2.id = identicalRegionId;
546
+
547
+ cueRegion1.height = 80;
548
+ cueRegion1.heightUnits = shaka.text.CueRegion.units.PERCENTAGE;
549
+ cueRegion1.width = 80;
550
+ cueRegion1.widthUnits = shaka.text.CueRegion.units.PERCENTAGE;
551
+
552
+ cueRegion2.height = 160; // the only difference!
553
+ cueRegion2.heightUnits = shaka.text.CueRegion.units.PERCENTAGE;
554
+ cueRegion2.width = 80;
555
+ cueRegion2.widthUnits = shaka.text.CueRegion.units.PERCENTAGE;
556
+
557
+ cueRegion1.viewportAnchorX = 10;
558
+ cueRegion1.viewportAnchorY = 10;
559
+ cueRegion1.viewportAnchorUnits = shaka.text.CueRegion.units.PERCENTAGE;
560
+
561
+ cueRegion2.viewportAnchorX = 10;
562
+ cueRegion2.viewportAnchorY = 10;
563
+ cueRegion2.viewportAnchorUnits = shaka.text.CueRegion.units.PERCENTAGE;
564
+
565
+ // These all attach to the same region, but only one region element should
566
+ // be created.
567
+ const firstBatchOfCues = [
568
+ new shaka.text.Cue(0, 100, ''),
569
+ new shaka.text.Cue(0, 100, ''),
570
+ new shaka.text.Cue(0, 100, ''),
571
+ ];
572
+ for (const cue of firstBatchOfCues) {
573
+ cue.displayAlign = shaka.text.Cue.displayAlign.CENTER;
574
+ cue.region = cueRegion1;
575
+ }
576
+
577
+ // Another batch for the other region
578
+ const secondBatchOfCues = [
579
+ new shaka.text.Cue(0, 100, ''),
580
+ new shaka.text.Cue(0, 100, ''),
581
+ new shaka.text.Cue(0, 100, ''),
582
+ ];
583
+ for (const cue of secondBatchOfCues) {
584
+ cue.displayAlign = shaka.text.Cue.displayAlign.CENTER;
585
+ cue.region = cueRegion2;
586
+ }
587
+
588
+ textDisplayer.setTextVisibility(true);
589
+ textDisplayer.append(firstBatchOfCues);
590
+ textDisplayer.append(secondBatchOfCues);
591
+ updateCaptions();
592
+
593
+ const textContainer = videoContainer.querySelector('.shaka-text-container');
594
+ const allRegionElements = textContainer.querySelectorAll(
595
+ '.shaka-text-region');
596
+
597
+ // Verify that the nested cues are attached to respective region element.
598
+ expect(allRegionElements.length).toBe(2);
599
+
600
+ const childrenOfOne = Array.from(allRegionElements[0].childNodes).filter(
601
+ (e) => e.nodeType == Node.ELEMENT_NODE);
602
+ expect(childrenOfOne.length).toBe(3);
603
+
604
+ const childrenOfTwo = Array.from(allRegionElements[1].childNodes).filter(
605
+ (e) => e.nodeType == Node.ELEMENT_NODE);
606
+ expect(childrenOfTwo.length).toBe(3);
607
+ });
540
608
  });
@@ -570,6 +570,7 @@ describe('VttTextParser', () => {
570
570
  });
571
571
 
572
572
  it('supports global style blocks', () => {
573
+ const textShadow = '-1px 0 black, 0 1px black, 1px 0 black, 0 -1px black';
573
574
  verifyHelper(
574
575
  [
575
576
  {
@@ -578,6 +579,7 @@ describe('VttTextParser', () => {
578
579
  payload: 'Test',
579
580
  color: 'cyan',
580
581
  fontSize: '10px',
582
+ textShadow: textShadow,
581
583
  },
582
584
  {
583
585
  startTime: 40,
@@ -585,6 +587,7 @@ describe('VttTextParser', () => {
585
587
  payload: 'Test2',
586
588
  color: 'cyan',
587
589
  fontSize: '10px',
590
+ textShadow: textShadow,
588
591
  },
589
592
  ],
590
593
  'WEBVTT\n\n' +
@@ -592,6 +595,7 @@ describe('VttTextParser', () => {
592
595
  '::cue {\n' +
593
596
  'color: cyan;\n'+
594
597
  'font-size: 10px;\n'+
598
+ `text-shadow: ${textShadow};\n`+
595
599
  '}\n\n' +
596
600
  '00:00:20.000 --> 00:00:40.000\n' +
597
601
  'Test\n\n' +
@@ -769,6 +773,17 @@ describe('VttTextParser', () => {
769
773
  {periodStart: 0, segmentStart: 0, segmentEnd: 0});
770
774
  });
771
775
 
776
+ it('support escaped html payload', () => {
777
+ verifyHelper(
778
+ [
779
+ {startTime: 20.1, endTime: 40.505, payload: '"Test & 1"\u{a0}'},
780
+ ],
781
+ 'WEBVTT\n\n' +
782
+ '00:00:20.100 --> 00:00:40.505\n' +
783
+ '"Test & 1" ',
784
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
785
+ });
786
+
772
787
  it('supports specific style blocks', () => {
773
788
  verifyHelper(
774
789
  [
@@ -906,25 +921,32 @@ describe('VttTextParser', () => {
906
921
  {
907
922
  startTime: 80,
908
923
  endTime: 90,
909
- payload: '<b><c.lime>Parse fail 1</b></c>',
924
+ payload: '<b><c.lime>Parse fail 1</b></c.lime>',
910
925
  nestedCues: [],
911
926
  },
912
927
  {
913
928
  startTime: 90,
914
929
  endTime: 100,
915
- payload: '<c.lime><b>Parse fail 2</c></b>',
930
+ payload: '<c.lime><b>Parse fail 2</c.lime></b>',
916
931
  nestedCues: [],
917
932
  },
918
933
  {
919
934
  startTime: 100,
920
935
  endTime: 110,
921
- payload: '<c.lime>forward slash 1/2 in text</c>',
922
- nestedCues: [],
936
+ payload: '',
937
+ nestedCues: [
938
+ {
939
+ startTime: 100,
940
+ endTime: 110,
941
+ payload: 'forward slash 1/2 in text',
942
+ color: '#0F0',
943
+ },
944
+ ],
923
945
  },
924
946
  {
925
947
  startTime: 110,
926
948
  endTime: 120,
927
- payload: '<c.lime>less or more < > in text</c>',
949
+ payload: '<c.lime>less or more < > in text</c.lime>',
928
950
  nestedCues: [],
929
951
  },
930
952
  ],
@@ -950,6 +972,53 @@ describe('VttTextParser', () => {
950
972
  {periodStart: 0, segmentStart: 0, segmentEnd: 0});
951
973
  });
952
974
 
975
+ it('supports voice style blocks', () => {
976
+ verifyHelper(
977
+ [
978
+ {
979
+ startTime: 20,
980
+ endTime: 40,
981
+ payload: '',
982
+ nestedCues: [
983
+ {
984
+ startTime: 20,
985
+ endTime: 40,
986
+ payload: 'Test',
987
+ color: 'cyan',
988
+ },
989
+ ],
990
+ },
991
+ {
992
+ startTime: 40,
993
+ endTime: 50,
994
+ payload: '',
995
+ nestedCues: [
996
+ {
997
+ startTime: 40,
998
+ endTime: 50,
999
+ payload: 'Test',
1000
+ color: 'red',
1001
+ },
1002
+ {
1003
+ startTime: 40,
1004
+ endTime: 50,
1005
+ payload: '2',
1006
+ fontStyle: Cue.fontStyle.ITALIC,
1007
+ },
1008
+ ],
1009
+ },
1010
+ ],
1011
+ 'WEBVTT\n\n' +
1012
+ 'STYLE\n' +
1013
+ '::cue(v[voice="Shaka"]) { color: cyan; }\n' +
1014
+ '::cue(v[voice=ShakaBis]) { color: red; }\n\n' +
1015
+ '00:00:20.000 --> 00:00:40.000\n' +
1016
+ '<v Shaka>Test\n\n' +
1017
+ '00:00:40.000 --> 00:00:50.000\n' +
1018
+ '<v ShakaBis>Test</v><i>2</i>',
1019
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
1020
+ });
1021
+
953
1022
  it('supports default color overriding', () => {
954
1023
  verifyHelper(
955
1024
  [
@@ -970,12 +1039,64 @@ describe('VttTextParser', () => {
970
1039
  ],
971
1040
  'WEBVTT\n\n' +
972
1041
  'STYLE\n' +
973
- '::cue(bg_blue) { font-size: 10px; background-color: #FF0 }\n\n' +
1042
+ '::cue(.bg_blue) { font-size: 10px; background-color: #FF0 }\n\n' +
974
1043
  '00:00:10.000 --> 00:00:20.000\n' +
975
1044
  '<c.red.bg_blue>Example 1</c>\n\n',
976
1045
  {periodStart: 0, segmentStart: 0, segmentEnd: 0});
977
1046
  });
978
1047
 
1048
+ // https://github.com/shaka-project/shaka-player/issues/4479
1049
+ it('keep styles when there are line breaks', () => {
1050
+ verifyHelper(
1051
+ [
1052
+ {
1053
+ startTime: 10, endTime: 20,
1054
+ payload: '',
1055
+ nestedCues: [
1056
+ {
1057
+ startTime: 10,
1058
+ endTime: 20,
1059
+ payload: '1',
1060
+ color: '#F0F',
1061
+ },
1062
+ {
1063
+ startTime: 10,
1064
+ endTime: 20,
1065
+ payload: '',
1066
+ lineBreak: true,
1067
+ },
1068
+ {
1069
+ startTime: 10,
1070
+ endTime: 20,
1071
+ payload: '2',
1072
+ color: '#F0F',
1073
+ fontStyle: Cue.fontStyle.ITALIC,
1074
+ },
1075
+ ],
1076
+ },
1077
+ ],
1078
+ 'WEBVTT\n\n' +
1079
+ '00:00:10.000 --> 00:00:20.000\n' +
1080
+ '<c.magenta>1</c><br/><c.magenta><i>2</i></c>\n\n',
1081
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
1082
+ });
1083
+
1084
+ it('does not fail on REGION blocks', () => {
1085
+ verifyHelper(
1086
+ [
1087
+ {
1088
+ startTime: 10, endTime: 20,
1089
+ payload: 'test',
1090
+ },
1091
+ ],
1092
+ 'WEBVTT\n\n' +
1093
+ 'REGION\n' +
1094
+ 'id:1\n\n' +
1095
+ '00:00:10.000 --> 00:00:20.000\n' +
1096
+ 'test\n\n',
1097
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
1098
+ });
1099
+
979
1100
  /**
980
1101
  * @param {!Array} cues
981
1102
  * @param {string} text