shaka-player 3.2.0 → 3.2.4

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 (162) hide show
  1. package/.github/workflows/build_and_test.yaml +73 -0
  2. package/.github/workflows/release.yaml +53 -0
  3. package/AUTHORS +3 -0
  4. package/CHANGELOG.md +182 -1
  5. package/CONTRIBUTORS +3 -0
  6. package/README.md +4 -4
  7. package/build/checkversion.py +1 -1
  8. package/build/generateExterns.js +1 -1
  9. package/build/misspellings.txt +1 -0
  10. package/build/shakaBuildHelpers.py +6 -5
  11. package/build/subprocessWindowsPatch.py +103 -0
  12. package/build/test.py +6 -0
  13. package/demo/common/assets.js +1 -1
  14. package/demo/index.html +1 -1
  15. package/dist/controls.css +2 -2
  16. package/dist/controls.css.map +1 -1
  17. package/dist/demo.compiled.debug.js +1 -1
  18. package/dist/demo.compiled.js +1 -1
  19. package/dist/deps.js +8 -8
  20. package/dist/locales.js +37 -37
  21. package/dist/receiver.compiled.debug.js +1 -1
  22. package/dist/receiver.compiled.js +1 -1
  23. package/dist/shaka-player.compiled.d.ts +195 -5
  24. package/dist/shaka-player.compiled.debug.d.ts +195 -5
  25. package/dist/shaka-player.compiled.debug.externs.js +226 -14
  26. package/dist/shaka-player.compiled.debug.js +424 -399
  27. package/dist/shaka-player.compiled.debug.map +4 -4
  28. package/dist/shaka-player.compiled.externs.js +226 -14
  29. package/dist/shaka-player.compiled.js +826 -812
  30. package/dist/shaka-player.compiled.map +4 -4
  31. package/dist/shaka-player.ui.d.ts +197 -16
  32. package/dist/shaka-player.ui.debug.d.ts +197 -16
  33. package/dist/shaka-player.ui.debug.externs.js +230 -27
  34. package/dist/shaka-player.ui.debug.js +466 -442
  35. package/dist/shaka-player.ui.debug.map +4 -4
  36. package/dist/shaka-player.ui.externs.js +230 -27
  37. package/dist/shaka-player.ui.js +946 -932
  38. package/dist/shaka-player.ui.map +4 -4
  39. package/docs/tutorials/fairplay.md +1 -1
  40. package/docs/tutorials/faq.md +14 -0
  41. package/docs/tutorials/ui.md +5 -5
  42. package/externs/ima.js +4 -0
  43. package/externs/shaka/ads.js +25 -0
  44. package/externs/shaka/player.js +8 -0
  45. package/externs/shaka/text.js +10 -0
  46. package/karma.conf.js +20 -15
  47. package/lib/ads/ad_manager.js +46 -26
  48. package/lib/ads/client_side_ad_manager.js +82 -88
  49. package/lib/ads/server_side_ad_manager.js +45 -13
  50. package/lib/cast/cast_proxy.js +6 -2
  51. package/lib/cast/cast_receiver.js +5 -1
  52. package/lib/cast/cast_sender.js +2 -2
  53. package/lib/cea/sei_processor.js +24 -17
  54. package/lib/dash/dash_parser.js +131 -24
  55. package/lib/dash/segment_list.js +1 -1
  56. package/lib/dash/segment_template.js +1 -1
  57. package/lib/hls/hls_parser.js +74 -17
  58. package/lib/hls/manifest_text_parser.js +1 -0
  59. package/lib/media/closed_caption_parser.js +3 -1
  60. package/lib/media/content_workarounds.js +12 -0
  61. package/lib/media/drm_engine.js +20 -1
  62. package/lib/media/gap_jumping_controller.js +8 -4
  63. package/lib/media/media_source_engine.js +1 -2
  64. package/lib/media/playhead.js +1 -1
  65. package/lib/media/region_observer.js +39 -33
  66. package/lib/media/region_timeline.js +17 -19
  67. package/lib/media/segment_index.js +2 -1
  68. package/lib/media/segment_reference.js +19 -1
  69. package/lib/media/streaming_engine.js +8 -4
  70. package/lib/net/networking_engine.js +6 -1
  71. package/lib/offline/download_manager.js +1 -2
  72. package/lib/offline/storage.js +8 -9
  73. package/lib/player.js +129 -59
  74. package/lib/polyfill/aria.js +12 -2
  75. package/lib/polyfill/encryption_scheme.js +2 -0
  76. package/lib/polyfill/fullscreen.js +2 -0
  77. package/lib/polyfill/mathround.js +2 -0
  78. package/lib/polyfill/media_capabilities.js +73 -21
  79. package/lib/polyfill/mediasource.js +8 -0
  80. package/lib/polyfill/orientation.js +3 -1
  81. package/lib/polyfill/patchedmediakeys_apple.js +6 -4
  82. package/lib/polyfill/patchedmediakeys_ms.js +6 -4
  83. package/lib/polyfill/patchedmediakeys_nop.js +2 -0
  84. package/lib/polyfill/patchedmediakeys_webkit.js +6 -4
  85. package/lib/polyfill/pip_webkit.js +2 -0
  86. package/lib/polyfill/storage_estimate.js +2 -0
  87. package/lib/polyfill/video_play_promise.js +2 -0
  88. package/lib/polyfill/videoplaybackquality.js +2 -0
  89. package/lib/polyfill/vttcue.js +2 -0
  90. package/lib/text/cue.js +6 -0
  91. package/lib/text/mp4_ttml_parser.js +3 -0
  92. package/lib/text/text_engine.js +14 -2
  93. package/lib/text/ttml_text_parser.js +135 -87
  94. package/lib/text/ui_text_displayer.js +213 -80
  95. package/lib/text/vtt_text_parser.js +4 -2
  96. package/lib/text/web_vtt_generator.js +21 -12
  97. package/lib/util/fake_event.js +53 -7
  98. package/lib/util/fake_event_target.js +21 -1
  99. package/lib/util/mp4_box_parsers.js +1 -1
  100. package/lib/util/periods.js +4 -1
  101. package/lib/util/platform.js +13 -1
  102. package/lib/util/stream_utils.js +105 -13
  103. package/lib/util/xml_utils.js +50 -12
  104. package/package.json +3 -6
  105. package/roadmap.md +24 -22
  106. package/test/cast/cast_proxy_unit.js +12 -6
  107. package/test/cast/cast_receiver_integration.js +1 -1
  108. package/test/cast/cast_utils_unit.js +1 -1
  109. package/test/cea/mp4_cea_parser_unit.js +26 -0
  110. package/test/dash/dash_parser_live_unit.js +43 -0
  111. package/test/dash/dash_parser_manifest_unit.js +222 -3
  112. package/test/hls/hls_parser_unit.js +79 -1
  113. package/test/media/closed_caption_parser_unit.js +20 -0
  114. package/test/media/drm_engine_integration.js +86 -2
  115. package/test/media/drm_engine_unit.js +57 -0
  116. package/test/media/playhead_unit.js +27 -1
  117. package/test/media/region_observer_unit.js +40 -5
  118. package/test/media/region_timeline_unit.js +40 -22
  119. package/test/media/streaming_engine_integration.js +2 -1
  120. package/test/media/streaming_engine_unit.js +145 -0
  121. package/test/player_integration.js +79 -8
  122. package/test/player_src_equals_integration.js +41 -8
  123. package/test/player_unit.js +14 -4
  124. package/test/test/assets/3675/chunk-stream0-00001.m4s +0 -0
  125. package/test/test/assets/3675/chunk-stream0-00002.m4s +0 -0
  126. package/test/test/assets/3675/chunk-stream0-00003.m4s +0 -0
  127. package/test/test/assets/3675/chunk-stream0-00004.m4s +0 -0
  128. package/test/test/assets/3675/chunk-stream0-00005.m4s +0 -0
  129. package/test/test/assets/3675/chunk-stream0-00006.m4s +0 -0
  130. package/test/test/assets/3675/chunk-stream0-00007.m4s +0 -0
  131. package/test/test/assets/3675/dash_0.mpd +30 -0
  132. package/test/test/assets/3675/dash_1.mpd +30 -0
  133. package/test/test/assets/3675/dash_2.mpd +30 -0
  134. package/test/test/assets/3675/dash_3.mpd +30 -0
  135. package/test/test/assets/3675/dash_4.mpd +30 -0
  136. package/test/test/assets/3675/dash_5.mpd +26 -0
  137. package/test/test/assets/3675/init-stream0.m4s +0 -0
  138. package/test/test/assets/chapters.vtt +2 -2
  139. package/test/test/assets/chapters2.vtt +10 -0
  140. package/test/test/assets/empty_caption_video_init.mp4 +0 -0
  141. package/test/test/assets/empty_caption_video_segment.mp4 +0 -0
  142. package/test/test/util/fake_ad_manager.js +11 -1
  143. package/test/test/util/ttml_utils.js +81 -0
  144. package/test/test/util/util.js +10 -7
  145. package/test/text/mp4_ttml_parser_unit.js +11 -18
  146. package/test/text/ttml_text_parser_unit.js +542 -220
  147. package/test/text/ui_text_displayer_unit.js +93 -20
  148. package/test/text/vtt_text_parser_unit.js +17 -1
  149. package/test/text/web_vtt_generator_unit.js +58 -3
  150. package/test/ui/localization_unit.js +15 -14
  151. package/test/ui/text_displayer_layout_unit.js +21 -8
  152. package/test/util/mp4_box_parsers_unit.js +28 -0
  153. package/test/util/stream_utils_unit.js +60 -3
  154. package/ui/cast_button.js +2 -3
  155. package/ui/controls.js +11 -6
  156. package/ui/less/buttons.less +0 -4
  157. package/ui/less/containers.less +6 -7
  158. package/ui/locales/ru.json +6 -6
  159. package/ui/localization.js +40 -87
  160. package/ui/pip_button.js +2 -3
  161. package/ui/seek_bar.js +1 -2
  162. package/ui/text_selection.js +1 -0
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ goog.require('shaka.test.TtmlUtils');
7
8
  goog.require('shaka.test.Util');
8
9
  goog.require('shaka.text.Cue');
9
10
  goog.require('shaka.text.CueRegion');
@@ -21,20 +22,23 @@ describe('TtmlTextParser', () => {
21
22
  it('supports no cues', () => {
22
23
  verifyHelper([],
23
24
  '<tt></tt>',
24
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
25
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
26
+ {});
25
27
  });
26
28
 
27
29
  it('supports empty text string', () => {
28
30
  verifyHelper([],
29
31
  '',
30
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
32
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
33
+ {});
31
34
  });
32
35
 
33
36
  it('supports div with no cues but whitespace', () => {
34
37
  verifyHelper(
35
38
  [],
36
39
  '<tt><body><div> \r\n </div></body></tt>',
37
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
40
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
41
+ {});
38
42
  });
39
43
 
40
44
  it('supports xml:space', () => {
@@ -60,7 +64,8 @@ describe('TtmlTextParser', () => {
60
64
  },
61
65
  ],
62
66
  '<tt xml:space="default">' + ttBody + '</tt>',
63
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
67
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
68
+ {startTime: 62.03, endTime: 62.05});
64
69
  // When xml:space="preserve", take them into account.
65
70
  verifyHelper(
66
71
  [
@@ -85,7 +90,8 @@ describe('TtmlTextParser', () => {
85
90
  },
86
91
  ],
87
92
  '<tt xml:space="preserve">' + ttBody + '</tt>',
88
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
93
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
94
+ {startTime: 62.03, endTime: 62.05});
89
95
  // The default value for xml:space is "default".
90
96
  verifyHelper(
91
97
  [
@@ -100,7 +106,8 @@ describe('TtmlTextParser', () => {
100
106
  },
101
107
  ],
102
108
  '<tt>' + ttBody + '</tt>',
103
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
109
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
110
+ {startTime: 62.03, endTime: 62.05});
104
111
 
105
112
  // Any other value is rejected as an error.
106
113
  errorHelper(shaka.util.Error.Code.INVALID_XML,
@@ -130,7 +137,8 @@ describe('TtmlTextParser', () => {
130
137
  },
131
138
  ],
132
139
  '<tt>' + ttBody + '</tt>',
133
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
140
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
141
+ {startTime: 62.03, endTime: 62.05});
134
142
  });
135
143
 
136
144
  it('rejects invalid ttml', () => {
@@ -199,7 +207,8 @@ describe('TtmlTextParser', () => {
199
207
  '<span>First cue</span><br /><span>Second cue</span>' +
200
208
  '</p>' +
201
209
  '</div></body></tt>',
202
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
210
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
211
+ {startTime: 62.05, endTime: 3723.2});
203
212
  });
204
213
 
205
214
  it('supports anonymous spans as nestedCues of paragraphs', () => {
@@ -234,7 +243,8 @@ describe('TtmlTextParser', () => {
234
243
  'First cue<br />Second cue' +
235
244
  '</p>' +
236
245
  '</div></body></tt>',
237
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
246
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
247
+ {startTime: 62.05, endTime: 3723.2});
238
248
  });
239
249
 
240
250
  it('supports multiple levels of nestedCues', () => {
@@ -292,7 +302,57 @@ describe('TtmlTextParser', () => {
292
302
  '</span>' +
293
303
  '</p>' +
294
304
  '</div></body></tt>',
295
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
305
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
306
+ {startTime: 62.05, endTime: 3723.2});
307
+ });
308
+
309
+ it('inherits timing information of nested cues if unprovided', () => {
310
+ verifyHelper(
311
+ [
312
+ {
313
+ startTime: 62.05,
314
+ endTime: 3723.2,
315
+ nestedCues: [
316
+ {startTime: 62.05, endTime: 3723.2, payload: 'Test'},
317
+ ],
318
+ },
319
+ ],
320
+ '<tt><body>' +
321
+ '<div><p begin="01:02.05" end="01:02:03.200">' +
322
+ '<span>Test</span></p></div>' +
323
+ '</body></tt>',
324
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
325
+ {startTime: 62.05, endTime: 3723.2});
326
+ });
327
+
328
+ it('does not discard cues with image subcues', () => {
329
+ verifyHelper(
330
+ [
331
+ {
332
+ startTime: 62.05,
333
+ endTime: 3723.2,
334
+ nestedCues: [
335
+ {
336
+ startTime: 62.05,
337
+ endTime: 3723.2,
338
+ payload: '',
339
+ backgroundImage: 'data:image/png;base64,base64EncodedImage',
340
+ },
341
+ ],
342
+ },
343
+ ],
344
+ '<tt ' +
345
+ 'xmlns:ttm="http://www.w3.org/ns/ttml#metadata" ' +
346
+ 'xmlns:smpte="http://www.smpte-ra.org/schemas/2052-1/2010/smpte-tt">' +
347
+ '<metadata>' +
348
+ '<smpte:image imageType="PNG" encoding="Base64" xml:id="img_0">' +
349
+ 'base64EncodedImage</smpte:image>' +
350
+ '</metadata><body><div>' +
351
+ '<p><div begin="01:02.05" end="01:02:03.200" ' +
352
+ 'smpte:backgroundImage="#img_0"></div></p>' +
353
+ '</div></body></tt>',
354
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
355
+ {startTime: 62.05, endTime: 3723.2});
296
356
  });
297
357
 
298
358
  it('supports colon formatted time', () => {
@@ -303,7 +363,8 @@ describe('TtmlTextParser', () => {
303
363
  '<tt><body><div>' +
304
364
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
305
365
  '</div></body></tt>',
306
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
366
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
367
+ {startTime: 62.05, endTime: 3723.2});
307
368
  });
308
369
 
309
370
  it('accounts for offset', () => {
@@ -314,7 +375,8 @@ describe('TtmlTextParser', () => {
314
375
  '<tt><body><div>' +
315
376
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
316
377
  '</div></body></tt>',
317
- {periodStart: 7, segmentStart: 0, segmentEnd: 0});
378
+ {periodStart: 7, segmentStart: 0, segmentEnd: 0},
379
+ {startTime: 69.05, endTime: 3730.2});
318
380
  });
319
381
 
320
382
  it('supports nested cues with an offset', () => {
@@ -336,7 +398,8 @@ describe('TtmlTextParser', () => {
336
398
  '<tt><body><div>' +
337
399
  '<p begin="01:02.05" end="01:02:03.200"><span>Nested cue</span></p>' +
338
400
  '</div></body></tt>',
339
- {periodStart: 7, segmentStart: 0, segmentEnd: 0});
401
+ {periodStart: 7, segmentStart: 0, segmentEnd: 0},
402
+ {startTime: 69.05, endTime: 3730.2});
340
403
  });
341
404
 
342
405
  it('supports time in 0.00h 0.00m 0.00s format', () => {
@@ -347,7 +410,8 @@ describe('TtmlTextParser', () => {
347
410
  '<tt><body><div>' +
348
411
  '<p begin="59.45m30ms" end="1.5h2.3s">Test</p>' +
349
412
  '</div></body></tt>',
350
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
413
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
414
+ {startTime: 3567.03, endTime: 5402.3});
351
415
  });
352
416
 
353
417
  it('supports time with frame rate', () => {
@@ -360,7 +424,8 @@ describe('TtmlTextParser', () => {
360
424
  '<body><div>' +
361
425
  '<p begin="00:10:15:15" end="00:11:02:30">Test</p>' +
362
426
  '</div></body></tt>',
363
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
427
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
428
+ {startTime: 615.5, endTime: 663});
364
429
  });
365
430
 
366
431
  it('supports time with frame rate multiplier', () => {
@@ -373,7 +438,8 @@ describe('TtmlTextParser', () => {
373
438
  '<body><div>' +
374
439
  '<p begin="00:10:15:15" end="00:11:02:30">Test</p>' +
375
440
  '</div></body></tt>',
376
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
441
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
442
+ {startTime: 615.5, endTime: 663});
377
443
  });
378
444
 
379
445
  it('supports time with subframes', () => {
@@ -390,7 +456,8 @@ describe('TtmlTextParser', () => {
390
456
  '<body><div>' +
391
457
  '<p begin="00:10:15:15.1" end="00:11:02:29.2">Test</p>' +
392
458
  '</div></body></tt>',
393
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
459
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
460
+ {startTime: Util.closeTo(615.5 + 1 / 60), endTime: 663});
394
461
  });
395
462
 
396
463
  it('supports time in frame format', () => {
@@ -403,7 +470,8 @@ describe('TtmlTextParser', () => {
403
470
  '<body><div>' +
404
471
  '<p begin="75f" end="300.3f">Test</p>' +
405
472
  '</div></body></tt>',
406
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
473
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
474
+ {startTime: 2.5, endTime: Util.closeTo(10.01)});
407
475
  });
408
476
 
409
477
  it('supports time in tick format', () => {
@@ -416,7 +484,8 @@ describe('TtmlTextParser', () => {
416
484
  '<body><div>' +
417
485
  '<p begin="50t" end="60.2t">Test</p>' +
418
486
  '</div></body></tt>',
419
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
487
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
488
+ {startTime: 5, endTime: Util.closeTo(6.02)});
420
489
  });
421
490
 
422
491
  it('supports time with duration', () => {
@@ -427,7 +496,39 @@ describe('TtmlTextParser', () => {
427
496
  '<tt><body><div>' +
428
497
  '<p begin="01:02.05" dur="5s">Test</p>' +
429
498
  '</div></body></tt>',
430
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
499
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
500
+ {startTime: 62.05, endTime: 67.05});
501
+ });
502
+
503
+ it('supports comments in the body', () => {
504
+ verifyHelper(
505
+ [],
506
+ '<tt><body><div>' +
507
+ '<!-- text-based TTML -->' +
508
+ '</div></body></tt>',
509
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
510
+ {});
511
+ });
512
+
513
+ it('does not inherit regions', () => {
514
+ verifyHelper(
515
+ [
516
+ {
517
+ startTime: 62.05,
518
+ endTime: 3723.2,
519
+ payload: 'Test',
520
+ },
521
+ ],
522
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
523
+ '<layout>' +
524
+ '<region xml:id="subtitleArea" />' +
525
+ '</layout>' +
526
+ '<body region="subtitleArea"><div>' +
527
+ '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
528
+ '</div></body></tt>',
529
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
530
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
531
+ {startTime: 62.05, endTime: 3723.2});
431
532
  });
432
533
 
433
534
  it('parses alignment from textAlign attribute of a region', () => {
@@ -447,7 +548,9 @@ describe('TtmlTextParser', () => {
447
548
  '<body region="subtitleArea"><div>' +
448
549
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
449
550
  '</div></body></tt>',
450
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
551
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
552
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
553
+ {startTime: 62.05, endTime: 3723.2});
451
554
  });
452
555
 
453
556
  it('allows non-standard namespace names', () => {
@@ -467,7 +570,9 @@ describe('TtmlTextParser', () => {
467
570
  '<body region="subtitleArea"><div>' +
468
571
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
469
572
  '</div></body></tt>',
470
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
573
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
574
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
575
+ {startTime: 62.05, endTime: 3723.2});
471
576
  });
472
577
 
473
578
  it('parses alignment from <style> block with id on region', () => {
@@ -490,7 +595,9 @@ describe('TtmlTextParser', () => {
490
595
  '<body region="subtitleArea"><div>' +
491
596
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
492
597
  '</div></body></tt>',
493
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
598
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
599
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
600
+ {startTime: 62.05, endTime: 3723.2});
494
601
  });
495
602
 
496
603
  it('parses alignment from <style> block with id on p', () => {
@@ -513,7 +620,9 @@ describe('TtmlTextParser', () => {
513
620
  '<body region="subtitleArea"><div>' +
514
621
  '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
515
622
  '</div></body></tt>',
516
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
623
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
624
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
625
+ {startTime: 62.05, endTime: 3723.2});
517
626
  });
518
627
 
519
628
  it('supports region settings for horizontal text', () => {
@@ -523,13 +632,6 @@ describe('TtmlTextParser', () => {
523
632
  startTime: 62.05,
524
633
  endTime: 3723.2,
525
634
  payload: 'Test',
526
- region: {
527
- id: 'subtitleArea',
528
- viewportAnchorX: 50,
529
- viewportAnchorY: 16,
530
- width: 100,
531
- height: 100,
532
- },
533
635
  },
534
636
  ],
535
637
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -539,7 +641,18 @@ describe('TtmlTextParser', () => {
539
641
  '<body region="subtitleArea"><div>' +
540
642
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
541
643
  '</div></body></tt>',
542
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
644
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
645
+ {
646
+ region: {
647
+ id: 'subtitleArea',
648
+ viewportAnchorX: 50,
649
+ viewportAnchorY: 16,
650
+ width: 100,
651
+ height: 100,
652
+ },
653
+ startTime: 62.05,
654
+ endTime: 3723.2,
655
+ }, {startTime: 62.05, endTime: 3723.2});
543
656
 
544
657
  verifyHelper(
545
658
  [
@@ -547,12 +660,6 @@ describe('TtmlTextParser', () => {
547
660
  startTime: 62.05,
548
661
  endTime: 3723.2,
549
662
  payload: 'Test',
550
- region: {
551
- viewportAnchorX: 50,
552
- viewportAnchorY: 16,
553
- width: 100,
554
- height: 100,
555
- },
556
663
  },
557
664
  ],
558
665
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -563,7 +670,17 @@ describe('TtmlTextParser', () => {
563
670
  '<body region="subtitleArea"><div>' +
564
671
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
565
672
  '</div></body></tt>',
566
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
673
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
674
+ {
675
+ region: {
676
+ viewportAnchorX: 50,
677
+ viewportAnchorY: 16,
678
+ width: 100,
679
+ height: 100,
680
+ },
681
+ startTime: 62.05,
682
+ endTime: 3723.2,
683
+ }, {startTime: 62.05, endTime: 3723.2});
567
684
 
568
685
  verifyHelper(
569
686
  [
@@ -571,12 +688,6 @@ describe('TtmlTextParser', () => {
571
688
  startTime: 62.05,
572
689
  endTime: 3723.2,
573
690
  payload: 'Test',
574
- region: {
575
- viewportAnchorX: 50,
576
- viewportAnchorY: 16,
577
- width: 100,
578
- height: 100,
579
- },
580
691
  },
581
692
  ],
582
693
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -587,7 +698,17 @@ describe('TtmlTextParser', () => {
587
698
  '<body region="subtitleArea"><div>' +
588
699
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
589
700
  '</div></body></tt>',
590
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
701
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
702
+ {
703
+ region: {
704
+ viewportAnchorX: 50,
705
+ viewportAnchorY: 16,
706
+ width: 100,
707
+ height: 100,
708
+ },
709
+ startTime: 62.05,
710
+ endTime: 3723.2,
711
+ }, {startTime: 62.05, endTime: 3723.2});
591
712
  });
592
713
 
593
714
  it('supports region settings in pixels (origin)', () => {
@@ -597,19 +718,6 @@ describe('TtmlTextParser', () => {
597
718
  startTime: 62.05,
598
719
  endTime: 3723.2,
599
720
  payload: 'Test',
600
- region: {
601
- id: 'subtitleArea',
602
- viewportAnchorX: 50,
603
- viewportAnchorY: 16,
604
- regionAnchorX: 0,
605
- regionAnchorY: 0,
606
- width: 100,
607
- height: 100,
608
- heightUnits: CueRegion.units.PERCENTAGE,
609
- widthUnits: CueRegion.units.PERCENTAGE,
610
- viewportAnchorUnits: CueRegion.units.PX,
611
- scroll: CueRegion.scrollMode.NONE,
612
- },
613
721
  },
614
722
  ],
615
723
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -619,7 +727,24 @@ describe('TtmlTextParser', () => {
619
727
  '<body region="subtitleArea"><div>' +
620
728
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
621
729
  '</div></body></tt>',
622
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
730
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
731
+ {
732
+ region: {
733
+ id: 'subtitleArea',
734
+ viewportAnchorX: 50,
735
+ viewportAnchorY: 16,
736
+ regionAnchorX: 0,
737
+ regionAnchorY: 0,
738
+ width: 100,
739
+ height: 100,
740
+ heightUnits: CueRegion.units.PERCENTAGE,
741
+ widthUnits: CueRegion.units.PERCENTAGE,
742
+ viewportAnchorUnits: CueRegion.units.PX,
743
+ scroll: CueRegion.scrollMode.NONE,
744
+ },
745
+ startTime: 62.05,
746
+ endTime: 3723.2,
747
+ }, {startTime: 62.05, endTime: 3723.2});
623
748
  });
624
749
 
625
750
  it('supports region settings in pixels (extent)', () => {
@@ -629,19 +754,6 @@ describe('TtmlTextParser', () => {
629
754
  startTime: 62.05,
630
755
  endTime: 3723.2,
631
756
  payload: 'Test',
632
- region: {
633
- id: 'subtitleArea',
634
- viewportAnchorX: 0,
635
- viewportAnchorY: 0,
636
- regionAnchorX: 0,
637
- regionAnchorY: 0,
638
- width: 50,
639
- height: 16,
640
- heightUnits: CueRegion.units.PX,
641
- widthUnits: CueRegion.units.PX,
642
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
643
- scroll: CueRegion.scrollMode.NONE,
644
- },
645
757
  },
646
758
  ],
647
759
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -651,7 +763,24 @@ describe('TtmlTextParser', () => {
651
763
  '<body region="subtitleArea"><div>' +
652
764
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
653
765
  '</div></body></tt>',
654
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
766
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
767
+ {
768
+ region: {
769
+ id: 'subtitleArea',
770
+ viewportAnchorX: 0,
771
+ viewportAnchorY: 0,
772
+ regionAnchorX: 0,
773
+ regionAnchorY: 0,
774
+ width: 50,
775
+ height: 16,
776
+ heightUnits: CueRegion.units.PX,
777
+ widthUnits: CueRegion.units.PX,
778
+ viewportAnchorUnits: CueRegion.units.PERCENTAGE,
779
+ scroll: CueRegion.scrollMode.NONE,
780
+ },
781
+ startTime: 62.05,
782
+ endTime: 3723.2,
783
+ }, {startTime: 62.05, endTime: 3723.2});
655
784
  });
656
785
 
657
786
  it('supports region settings in pixels: origin (with global extent)', () => {
@@ -661,19 +790,6 @@ describe('TtmlTextParser', () => {
661
790
  startTime: 62.05,
662
791
  endTime: 3723.2,
663
792
  payload: 'Test',
664
- region: {
665
- id: 'subtitleArea',
666
- viewportAnchorX: 10,
667
- viewportAnchorY: 10,
668
- regionAnchorX: 0,
669
- regionAnchorY: 0,
670
- width: 100,
671
- height: 100,
672
- heightUnits: CueRegion.units.PERCENTAGE,
673
- widthUnits: CueRegion.units.PERCENTAGE,
674
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
675
- scroll: CueRegion.scrollMode.NONE,
676
- },
677
793
  },
678
794
  ],
679
795
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
@@ -683,7 +799,24 @@ describe('TtmlTextParser', () => {
683
799
  '<body region="subtitleArea"><div>' +
684
800
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
685
801
  '</div></body></tt>',
686
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
802
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
803
+ {
804
+ region: {
805
+ id: 'subtitleArea',
806
+ viewportAnchorX: 10,
807
+ viewportAnchorY: 10,
808
+ regionAnchorX: 0,
809
+ regionAnchorY: 0,
810
+ width: 100,
811
+ height: 100,
812
+ heightUnits: CueRegion.units.PERCENTAGE,
813
+ widthUnits: CueRegion.units.PERCENTAGE,
814
+ viewportAnchorUnits: CueRegion.units.PERCENTAGE,
815
+ scroll: CueRegion.scrollMode.NONE,
816
+ },
817
+ startTime: 62.05,
818
+ endTime: 3723.2,
819
+ }, {startTime: 62.05, endTime: 3723.2});
687
820
  });
688
821
 
689
822
  it('supports region settings in pixels: extent (with global extent)', () => {
@@ -693,19 +826,6 @@ describe('TtmlTextParser', () => {
693
826
  startTime: 62.05,
694
827
  endTime: 3723.2,
695
828
  payload: 'Test',
696
- region: {
697
- id: 'subtitleArea',
698
- viewportAnchorX: 0,
699
- viewportAnchorY: 0,
700
- regionAnchorX: 0,
701
- regionAnchorY: 0,
702
- width: 30,
703
- height: 30,
704
- heightUnits: CueRegion.units.PERCENTAGE,
705
- widthUnits: CueRegion.units.PERCENTAGE,
706
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
707
- scroll: CueRegion.scrollMode.NONE,
708
- },
709
829
  },
710
830
  ],
711
831
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
@@ -716,7 +836,24 @@ describe('TtmlTextParser', () => {
716
836
  '<body region="subtitleArea"><div>' +
717
837
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
718
838
  '</div></body></tt>',
719
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
839
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
840
+ {
841
+ region: {
842
+ id: 'subtitleArea',
843
+ viewportAnchorX: 0,
844
+ viewportAnchorY: 0,
845
+ regionAnchorX: 0,
846
+ regionAnchorY: 0,
847
+ width: 30,
848
+ height: 30,
849
+ heightUnits: CueRegion.units.PERCENTAGE,
850
+ widthUnits: CueRegion.units.PERCENTAGE,
851
+ viewportAnchorUnits: CueRegion.units.PERCENTAGE,
852
+ scroll: CueRegion.scrollMode.NONE,
853
+ },
854
+ startTime: 62.05,
855
+ endTime: 3723.2,
856
+ }, {startTime: 62.05, endTime: 3723.2});
720
857
  });
721
858
 
722
859
  it('supports region settings in percentage (origin)', () => {
@@ -726,29 +863,34 @@ describe('TtmlTextParser', () => {
726
863
  startTime: 62.05,
727
864
  endTime: 3723.2,
728
865
  payload: 'Test',
729
- region: {
730
- id: 'subtitleArea',
731
- viewportAnchorX: 50,
732
- viewportAnchorY: 16,
733
- regionAnchorX: 0,
734
- regionAnchorY: 0,
735
- width: 100,
736
- height: 100,
737
- heightUnits: CueRegion.units.PERCENTAGE,
738
- widthUnits: CueRegion.units.PERCENTAGE,
739
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
740
- scroll: CueRegion.scrollMode.NONE,
741
- },
742
866
  },
743
867
  ],
744
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
868
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" ' +
869
+ 'tts:extent="1920px 1080px">' +
745
870
  '<layout>' +
746
871
  '<region xml:id="subtitleArea" tts:origin="50% 16%"/>' +
747
872
  '</layout>' +
748
873
  '<body region="subtitleArea"><div>' +
749
874
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
750
875
  '</div></body></tt>',
751
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
876
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
877
+ {
878
+ region: {
879
+ id: 'subtitleArea',
880
+ viewportAnchorX: 50,
881
+ viewportAnchorY: 16,
882
+ regionAnchorX: 0,
883
+ regionAnchorY: 0,
884
+ width: 100,
885
+ height: 100,
886
+ heightUnits: CueRegion.units.PERCENTAGE,
887
+ widthUnits: CueRegion.units.PERCENTAGE,
888
+ viewportAnchorUnits: CueRegion.units.PERCENTAGE,
889
+ scroll: CueRegion.scrollMode.NONE,
890
+ },
891
+ startTime: 62.05,
892
+ endTime: 3723.2,
893
+ }, {startTime: 62.05, endTime: 3723.2});
752
894
  });
753
895
 
754
896
  it('supports region settings in percentage (extent)', () => {
@@ -758,22 +900,10 @@ describe('TtmlTextParser', () => {
758
900
  startTime: 62.05,
759
901
  endTime: 3723.2,
760
902
  payload: 'Test',
761
- region: {
762
- id: 'subtitleArea',
763
- viewportAnchorX: 0,
764
- viewportAnchorY: 0,
765
- regionAnchorX: 0,
766
- regionAnchorY: 0,
767
- width: 50,
768
- height: 16,
769
- heightUnits: CueRegion.units.PERCENTAGE,
770
- widthUnits: CueRegion.units.PERCENTAGE,
771
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
772
- scroll: CueRegion.scrollMode.NONE,
773
- },
774
903
  },
775
904
  ],
776
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
905
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" ' +
906
+ 'tts:extent="1920px 1080px">' +
777
907
  '<layout>' +
778
908
  '<region xml:id="subtitleArea" tts:extent="50% 16%" ' +
779
909
  'tts:writingMode="lrtb" />' +
@@ -781,7 +911,24 @@ describe('TtmlTextParser', () => {
781
911
  '<body region="subtitleArea"><div>' +
782
912
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
783
913
  '</div></body></tt>',
784
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
914
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
915
+ {
916
+ region: {
917
+ id: 'subtitleArea',
918
+ viewportAnchorX: 0,
919
+ viewportAnchorY: 0,
920
+ regionAnchorX: 0,
921
+ regionAnchorY: 0,
922
+ width: 50,
923
+ height: 16,
924
+ heightUnits: CueRegion.units.PERCENTAGE,
925
+ widthUnits: CueRegion.units.PERCENTAGE,
926
+ viewportAnchorUnits: CueRegion.units.PERCENTAGE,
927
+ scroll: CueRegion.scrollMode.NONE,
928
+ },
929
+ startTime: 62.05,
930
+ endTime: 3723.2,
931
+ }, {startTime: 62.05, endTime: 3723.2});
785
932
  });
786
933
 
787
934
  it('supports region settings for vertical text', () => {
@@ -791,13 +938,6 @@ describe('TtmlTextParser', () => {
791
938
  startTime: 62.05,
792
939
  endTime: 3723.2,
793
940
  payload: 'Test',
794
- region: {
795
- id: 'subtitleArea',
796
- viewportAnchorX: 50,
797
- viewportAnchorY: 16,
798
- width: 100,
799
- height: 100,
800
- },
801
941
  },
802
942
  ],
803
943
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -808,7 +948,18 @@ describe('TtmlTextParser', () => {
808
948
  '<body region="subtitleArea"><div>' +
809
949
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
810
950
  '</div></body></tt>',
811
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
951
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
952
+ {
953
+ region: {
954
+ id: 'subtitleArea',
955
+ viewportAnchorX: 50,
956
+ viewportAnchorY: 16,
957
+ width: 100,
958
+ height: 100,
959
+ },
960
+ startTime: 62.05,
961
+ endTime: 3723.2,
962
+ }, {startTime: 62.05, endTime: 3723.2});
812
963
 
813
964
  verifyHelper(
814
965
  [
@@ -816,12 +967,6 @@ describe('TtmlTextParser', () => {
816
967
  startTime: 62.05,
817
968
  endTime: 3723.2,
818
969
  payload: 'Test',
819
- region: {
820
- viewportAnchorX: 50,
821
- viewportAnchorY: 16,
822
- width: 100,
823
- height: 100,
824
- },
825
970
  },
826
971
  ],
827
972
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -832,7 +977,17 @@ describe('TtmlTextParser', () => {
832
977
  '<body region="subtitleArea"><div>' +
833
978
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
834
979
  '</div></body></tt>',
835
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
980
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
981
+ {
982
+ region: {
983
+ viewportAnchorX: 50,
984
+ viewportAnchorY: 16,
985
+ width: 100,
986
+ height: 100,
987
+ },
988
+ startTime: 62.05,
989
+ endTime: 3723.2,
990
+ }, {startTime: 62.05, endTime: 3723.2});
836
991
 
837
992
  verifyHelper(
838
993
  [
@@ -840,12 +995,6 @@ describe('TtmlTextParser', () => {
840
995
  startTime: 62.05,
841
996
  endTime: 3723.2,
842
997
  payload: 'Test',
843
- region: {
844
- viewportAnchorX: 50,
845
- viewportAnchorY: 16,
846
- width: 100,
847
- height: 100,
848
- },
849
998
  },
850
999
  ],
851
1000
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -856,7 +1005,17 @@ describe('TtmlTextParser', () => {
856
1005
  '<body region="subtitleArea"><div>' +
857
1006
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
858
1007
  '</div></body></tt>',
859
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1008
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1009
+ {
1010
+ region: {
1011
+ viewportAnchorX: 50,
1012
+ viewportAnchorY: 16,
1013
+ width: 100,
1014
+ height: 100,
1015
+ },
1016
+ startTime: 62.05,
1017
+ endTime: 3723.2,
1018
+ }, {startTime: 62.05, endTime: 3723.2});
860
1019
  });
861
1020
 
862
1021
  it('supports percentages containing decimals', () => {
@@ -866,13 +1025,6 @@ describe('TtmlTextParser', () => {
866
1025
  startTime: 62.05,
867
1026
  endTime: 3723.2,
868
1027
  payload: 'Test',
869
- region: {
870
- id: 'subtitleArea',
871
- viewportAnchorX: 12.2,
872
- viewportAnchorY: 50.005,
873
- width: 100,
874
- height: 100,
875
- },
876
1028
  },
877
1029
  ],
878
1030
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -883,7 +1035,18 @@ describe('TtmlTextParser', () => {
883
1035
  '<body region="subtitleArea"><div>' +
884
1036
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
885
1037
  '</div></body></tt>',
886
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1038
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1039
+ {
1040
+ region: {
1041
+ id: 'subtitleArea',
1042
+ viewportAnchorX: 12.2,
1043
+ viewportAnchorY: 50.005,
1044
+ width: 100,
1045
+ height: 100,
1046
+ },
1047
+ startTime: 62.05,
1048
+ endTime: 3723.2,
1049
+ }, {startTime: 62.05, endTime: 3723.2});
887
1050
  });
888
1051
 
889
1052
  it('supports writingMode setting', () => {
@@ -904,7 +1067,9 @@ describe('TtmlTextParser', () => {
904
1067
  '<body region="subtitleArea"><div>' +
905
1068
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
906
1069
  '</div></body></tt>',
907
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1070
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1071
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1072
+ {startTime: 62.05, endTime: 3723.2});
908
1073
 
909
1074
  verifyHelper(
910
1075
  [
@@ -923,7 +1088,9 @@ describe('TtmlTextParser', () => {
923
1088
  '<body region="subtitleArea"><div>' +
924
1089
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
925
1090
  '</div></body></tt>',
926
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1091
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1092
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1093
+ {startTime: 62.05, endTime: 3723.2});
927
1094
 
928
1095
  verifyHelper(
929
1096
  [
@@ -942,7 +1109,9 @@ describe('TtmlTextParser', () => {
942
1109
  '<body region="subtitleArea"><div>' +
943
1110
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
944
1111
  '</div></body></tt>',
945
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1112
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1113
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1114
+ {startTime: 62.05, endTime: 3723.2});
946
1115
 
947
1116
  verifyHelper(
948
1117
  [
@@ -961,7 +1130,9 @@ describe('TtmlTextParser', () => {
961
1130
  '<body region="subtitleArea"><div>' +
962
1131
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
963
1132
  '</div></body></tt>',
964
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1133
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1134
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1135
+ {startTime: 62.05, endTime: 3723.2});
965
1136
 
966
1137
  verifyHelper(
967
1138
  [
@@ -980,7 +1151,9 @@ describe('TtmlTextParser', () => {
980
1151
  '<body region="subtitleArea"><div>' +
981
1152
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
982
1153
  '</div></body></tt>',
983
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1154
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1155
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1156
+ {startTime: 62.05, endTime: 3723.2});
984
1157
  });
985
1158
 
986
1159
  it('disregards empty divs and ps', () => {
@@ -996,7 +1169,8 @@ describe('TtmlTextParser', () => {
996
1169
  '<div></div>' +
997
1170
  '</body>' +
998
1171
  '</tt>',
999
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1172
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1173
+ {startTime: 62.05, endTime: 3723.2});
1000
1174
 
1001
1175
  verifyHelper(
1002
1176
  [
@@ -1010,7 +1184,8 @@ describe('TtmlTextParser', () => {
1010
1184
  '</div>' +
1011
1185
  '</body>' +
1012
1186
  '</tt>',
1013
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1187
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1188
+ {startTime: 62.05, endTime: 3723.2});
1014
1189
 
1015
1190
  verifyHelper(
1016
1191
  [],
@@ -1022,7 +1197,8 @@ describe('TtmlTextParser', () => {
1022
1197
  '<div></div>' +
1023
1198
  '</body>' +
1024
1199
  '</tt>',
1025
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1200
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1201
+ {});
1026
1202
  });
1027
1203
 
1028
1204
  it('should let empty paragraphs with begin or end attributes through', () => {
@@ -1038,7 +1214,8 @@ describe('TtmlTextParser', () => {
1038
1214
  '</div>' +
1039
1215
  '</body>' +
1040
1216
  '</tt>',
1041
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1217
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1218
+ {startTime: 62.05, endTime: 3723.2});
1042
1219
  });
1043
1220
 
1044
1221
  it('supports smpte:backgroundImage attribute', () => {
@@ -1048,7 +1225,6 @@ describe('TtmlTextParser', () => {
1048
1225
  startTime: 62.05,
1049
1226
  endTime: 3723.2,
1050
1227
  payload: '',
1051
- backgroundImage: 'data:image/png;base64,base64EncodedImage',
1052
1228
  },
1053
1229
  ],
1054
1230
  '<tt ' +
@@ -1061,19 +1237,19 @@ describe('TtmlTextParser', () => {
1061
1237
  '<body><div smpte:backgroundImage="#img_0">' +
1062
1238
  '<p begin="01:02.05" end="01:02:03.200"></p>' +
1063
1239
  '</div></body></tt>',
1064
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1240
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1241
+ {startTime: 62.05, endTime: 3723.2},
1242
+ {
1243
+ startTime: 62.05,
1244
+ endTime: 3723.2,
1245
+ backgroundImage: 'data:image/png;base64,base64EncodedImage',
1246
+ isContainer: false,
1247
+ });
1065
1248
  });
1066
1249
 
1067
1250
  it('supports smpte:backgroundImage attribute in div element', () => {
1068
1251
  verifyHelper(
1069
- [
1070
- {
1071
- startTime: 0,
1072
- endTime: 62.05,
1073
- payload: '',
1074
- backgroundImage: 'data:image/png;base64,base64EncodedImage',
1075
- },
1076
- ],
1252
+ [],
1077
1253
  '<tt ' +
1078
1254
  'xmlns:ttm="http://www.w3.org/ns/ttml#metadata" ' +
1079
1255
  'xmlns:smpte="http://www.smpte-ra.org/schemas/2052-1/2010/smpte-tt">' +
@@ -1084,7 +1260,14 @@ describe('TtmlTextParser', () => {
1084
1260
  '<body><div begin="00:00.00" end="01:02.05" '+
1085
1261
  'smpte:backgroundImage="#img_0"></div>' +
1086
1262
  '</body></tt>',
1087
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1263
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1264
+ {startTime: 0, endTime: 62.05},
1265
+ {
1266
+ startTime: 0,
1267
+ endTime: 62.05,
1268
+ backgroundImage: 'data:image/png;base64,base64EncodedImage',
1269
+ isContainer: false,
1270
+ });
1088
1271
  });
1089
1272
 
1090
1273
  it('supports smpte:backgroundImage attribute alt namespace', () => {
@@ -1108,7 +1291,8 @@ describe('TtmlTextParser', () => {
1108
1291
  '<p begin="01:02.05" end="01:02:03.200" ' +
1109
1292
  'smpte:backgroundImage="#img_0" />' +
1110
1293
  '</div></body></tt>',
1111
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1294
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1295
+ {startTime: 62.05, endTime: 3723.2});
1112
1296
  });
1113
1297
 
1114
1298
  it('inserts line breaks for <br> tags', () => {
@@ -1136,7 +1320,8 @@ describe('TtmlTextParser', () => {
1136
1320
  '<tt><body><div>' +
1137
1321
  '<p begin="01:02.05" end="01:02:03.200">Line1<br/>Line2</p>' +
1138
1322
  '</div></body></tt>',
1139
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1323
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1324
+ {startTime: 62.05, endTime: 3723.2});
1140
1325
 
1141
1326
  verifyHelper(
1142
1327
  [{
@@ -1169,7 +1354,36 @@ describe('TtmlTextParser', () => {
1169
1354
  '<span>Line1<br/>Line2</span>' +
1170
1355
  '</p>' +
1171
1356
  '</div></body></tt>',
1172
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1357
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1358
+ {startTime: 62.05, endTime: 3723.2});
1359
+ });
1360
+
1361
+ it('allows old-standard namespace', () => {
1362
+ verifyHelper(
1363
+ [
1364
+ {
1365
+ startTime: 1,
1366
+ endTime: 2,
1367
+ payload: 'Test',
1368
+ cellResolution: {
1369
+ columns: 60,
1370
+ rows: 20,
1371
+ },
1372
+ fontSize: '67%',
1373
+ },
1374
+ ],
1375
+ '<tt ' +
1376
+ 'xmlns:ttp="http://www.w3.org/2006/10/ttaf1#parameter" ' +
1377
+ 'xmlns:tts="http://www.w3.org/2006/10/ttaf1#styling" ' +
1378
+ 'ttp:cellResolution="60 20">' +
1379
+ '<styling>' +
1380
+ '<style xml:id="s1" tts:fontSize="67%"/>' +
1381
+ '</styling>' +
1382
+ '<body><div>' +
1383
+ '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1384
+ '</div></body></tt>',
1385
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1386
+ {startTime: 1, endTime: 2});
1173
1387
  });
1174
1388
 
1175
1389
  it('parses cue alignment from textAlign attribute', () => {
@@ -1194,7 +1408,9 @@ describe('TtmlTextParser', () => {
1194
1408
  '<body region="subtitleArea"><div>' +
1195
1409
  '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
1196
1410
  '</div></body></tt>',
1197
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1411
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1412
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1413
+ {startTime: 62.05, endTime: 3723.2});
1198
1414
  });
1199
1415
 
1200
1416
  it('parses text style information', () => {
@@ -1237,7 +1453,9 @@ describe('TtmlTextParser', () => {
1237
1453
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1238
1454
  '<p begin="00:02.00" end="00:04.00" style="s2">Test 2</p>' +
1239
1455
  '</div></body></tt>',
1240
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1456
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1457
+ {startTime: 1, endTime: 4, region: {id: 'subtitleArea'}},
1458
+ {startTime: 1, endTime: 4});
1241
1459
  });
1242
1460
 
1243
1461
  // Regression test for #2623
@@ -1273,7 +1491,8 @@ describe('TtmlTextParser', () => {
1273
1491
  '<span style="s1">Test</span>' +
1274
1492
  '</p>' +
1275
1493
  '</div></body></tt>',
1276
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1494
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1495
+ {startTime: 1, endTime: 2});
1277
1496
  });
1278
1497
 
1279
1498
  it('parses wrapping option', () => {
@@ -1296,7 +1515,9 @@ describe('TtmlTextParser', () => {
1296
1515
  '<body region="subtitleArea"><div>' +
1297
1516
  '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
1298
1517
  '</div></body></tt>',
1299
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1518
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1519
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1520
+ {startTime: 62.05, endTime: 3723.2});
1300
1521
  });
1301
1522
 
1302
1523
  it('parses text decoration', () => {
@@ -1322,7 +1543,9 @@ describe('TtmlTextParser', () => {
1322
1543
  '<body region="subtitleArea"><div>' +
1323
1544
  '<p begin="01:02.05" end="01:02:03.200" style="s2">Test</p>' +
1324
1545
  '</div></body></tt>',
1325
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1546
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1547
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1548
+ {startTime: 62.05, endTime: 3723.2});
1326
1549
  });
1327
1550
 
1328
1551
  it('cues should have default cellResolution', () => {
@@ -1345,7 +1568,8 @@ describe('TtmlTextParser', () => {
1345
1568
  '<body><div>' +
1346
1569
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1347
1570
  '</div></body></tt>',
1348
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1571
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1572
+ {startTime: 1, endTime: 2});
1349
1573
  });
1350
1574
 
1351
1575
  it('parses cellResolution', () => {
@@ -1372,7 +1596,8 @@ describe('TtmlTextParser', () => {
1372
1596
  '<body><div>' +
1373
1597
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1374
1598
  '</div></body></tt>',
1375
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1599
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1600
+ {startTime: 1, endTime: 2});
1376
1601
  });
1377
1602
 
1378
1603
  it('parses line padding', () => {
@@ -1400,7 +1625,8 @@ describe('TtmlTextParser', () => {
1400
1625
  '<body><div>' +
1401
1626
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1402
1627
  '</div></body></tt>',
1403
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1628
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1629
+ {startTime: 1, endTime: 2});
1404
1630
  });
1405
1631
 
1406
1632
  it('chooses style on element over style on region', () => {
@@ -1424,7 +1650,9 @@ describe('TtmlTextParser', () => {
1424
1650
  '<body region="subtitleArea"><div>' +
1425
1651
  '<p begin="01:02.05" end="01:02:03.200" style="s2">Test</p>' +
1426
1652
  '</div></body></tt>',
1427
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1653
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1654
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1655
+ {startTime: 62.05, endTime: 3723.2});
1428
1656
  });
1429
1657
 
1430
1658
  it('can parse multiple cues', () => {
@@ -1437,7 +1665,8 @@ describe('TtmlTextParser', () => {
1437
1665
  '<p begin="00:01.00" end="00:02.00">First cue</p>' +
1438
1666
  '<p begin="00:03.00" end="00:04.00">Second cue</p>' +
1439
1667
  '</div></body></tt>',
1440
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1668
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1669
+ {startTime: 1, endTime: 4});
1441
1670
  });
1442
1671
 
1443
1672
  // Regression test for https://github.com/google/shaka-player/issues/2478
@@ -1460,7 +1689,8 @@ describe('TtmlTextParser', () => {
1460
1689
  '<tt><body><div>' +
1461
1690
  '<p begin="01:02.05" end="01:02:03.200"><span>äöü</span></p>' +
1462
1691
  '</div></body></tt>',
1463
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1692
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1693
+ {startTime: 62.05, endTime: 3723.2});
1464
1694
  });
1465
1695
 
1466
1696
  it('supports timing on multiple levels', () => {
@@ -1476,7 +1706,9 @@ describe('TtmlTextParser', () => {
1476
1706
  '<p begin="3s" end="4s">First cue</p>' +
1477
1707
  '<p begin="4s" end="5s">Second cue</p>' +
1478
1708
  '</div></body></tt>',
1479
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1709
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1710
+ {startTime: 1, endTime: Infinity},
1711
+ {startTime: 3, endTime: Infinity});
1480
1712
 
1481
1713
  verifyHelper(
1482
1714
  [{
@@ -1499,7 +1731,9 @@ describe('TtmlTextParser', () => {
1499
1731
  '<span begin="5s" end="6s">Second cue</span>' +
1500
1732
  '</p>' +
1501
1733
  '</div></body></tt>',
1502
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1734
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1735
+ {startTime: 1, endTime: Infinity},
1736
+ {startTime: 3, endTime: Infinity});
1503
1737
  });
1504
1738
 
1505
1739
  it('gets end time from parent directly if missing', () => {
@@ -1513,7 +1747,9 @@ describe('TtmlTextParser', () => {
1513
1747
  '<p begin="3s" end="4s">First cue</p>' +
1514
1748
  '<p begin="4s">Second cue</p>' +
1515
1749
  '</div></body></tt>',
1516
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1750
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1751
+ {startTime: 1, endTime: 30},
1752
+ {startTime: 3, endTime: 30});
1517
1753
  });
1518
1754
 
1519
1755
  it('supports never-ending cues', () => {
@@ -1526,7 +1762,8 @@ describe('TtmlTextParser', () => {
1526
1762
  '<p begin="1s">First cue</p>' +
1527
1763
  '<p begin="2s">Second cue</p>' +
1528
1764
  '</div></body></tt>',
1529
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1765
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1766
+ {startTime: 1, endTime: Infinity});
1530
1767
  });
1531
1768
 
1532
1769
  // Regression test for b/159050711
@@ -1542,8 +1779,8 @@ describe('TtmlTextParser', () => {
1542
1779
  // Styles from regionStyle should apply only to the nested cue.
1543
1780
  backgroundColor: '',
1544
1781
  color: '',
1545
- displayAlign: Cue.displayAlign.AFTER, // displayAlign default value.
1546
- textAlign: Cue.textAlign.START, // textAlign default value.
1782
+ displayAlign: Cue.displayAlign.CENTER,
1783
+ textAlign: Cue.textAlign.CENTER,
1547
1784
 
1548
1785
  nestedCues: [
1549
1786
  {
@@ -1568,7 +1805,7 @@ describe('TtmlTextParser', () => {
1568
1805
  // Styles inherited from backgroundStyle via regionStyle via
1569
1806
  // spanStyle
1570
1807
  displayAlign: Cue.displayAlign.CENTER,
1571
- textAlign: Cue.textAlign.CENTER,
1808
+ textAlign: Cue.textAlign.END,
1572
1809
  },
1573
1810
  ],
1574
1811
  },
@@ -1582,7 +1819,7 @@ describe('TtmlTextParser', () => {
1582
1819
  // spanStyle inherits attributes from regionStyle
1583
1820
  ' <style xml:id="pStyle" tts:fontSize="15px" />' +
1584
1821
  ' <style xml:id="spanStyle" style="regionStyle" ' +
1585
- ' tts:backgroundColor="white" />' +
1822
+ ' tts:backgroundColor="white" tts:textAlign="end" />' +
1586
1823
  // regionStyle inherits attributes from backgroundStyle
1587
1824
  ' <style xml:id="regionStyle" style="backgroundStyle" ' +
1588
1825
  ' tts:backgroundColor="transparent" tts:color="blue" />' +
@@ -1597,32 +1834,117 @@ describe('TtmlTextParser', () => {
1597
1834
  ' <span style="spanStyle">Test with spanStyle</span>' +
1598
1835
  ' </p>' +
1599
1836
  '</div></body></tt>',
1600
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1837
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1838
+ {startTime: 0, endTime: 60});
1839
+ });
1840
+
1841
+ it('inherits alignment from parent regions', () => {
1842
+ verifyHelper(
1843
+ [
1844
+ {
1845
+ startTime: 0,
1846
+ endTime: 60,
1847
+ payload: '',
1848
+ fontSize: '',
1849
+ textAlign: Cue.textAlign.END,
1850
+ displayAlign: Cue.displayAlign.CENTER,
1851
+ nestedCues: [
1852
+ {
1853
+ startTime: 0,
1854
+ endTime: 60,
1855
+ payload: 'Hello!',
1856
+ textAlign: Cue.textAlign.END,
1857
+ displayAlign: Cue.displayAlign.CENTER,
1858
+ },
1859
+ ],
1860
+ },
1861
+ ],
1862
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1863
+ '<head><layout>' +
1864
+ '<region xml:id="r1" tts:textAlign="end" tts:displayAlign="center" />' +
1865
+ '</layout></head>' +
1866
+ '<body><div><p begin="00:00" end="01:00" region="r1">' +
1867
+ '<span>Hello!</span>' +
1868
+ '</p></div></body></tt>',
1869
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1870
+ {startTime: 0, endTime: 60},
1871
+ );
1872
+ });
1873
+
1874
+ // Regression test for https://github.com/google/shaka-player/issues/3743
1875
+ it('inherits styles from other styles on nestedCues', () => {
1876
+ verifyHelper(
1877
+ [
1878
+ {
1879
+ // p element
1880
+ startTime: 0,
1881
+ endTime: 60,
1882
+ payload: '',
1883
+ fontSize: '',
1884
+ nestedCues: [
1885
+ {
1886
+ startTime: 0,
1887
+ endTime: 60,
1888
+ payload: 'A',
1889
+ fontSize: '16px',
1890
+ },
1891
+ {
1892
+ startTime: 0,
1893
+ endTime: 60,
1894
+ payload: '',
1895
+ fontSize: '',
1896
+ },
1897
+ {
1898
+ startTime: 0,
1899
+ endTime: 60,
1900
+ payload: 'B',
1901
+ fontSize: '16px',
1902
+ },
1903
+ ],
1904
+ },
1905
+ ],
1906
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1907
+ '<head>' +
1908
+ ' <styling>' +
1909
+ ' <style tts:backgroundColor="rgba(0,0,0,100)" ' +
1910
+ ' tts:displayAlign="center" ' +
1911
+ ' tts:extent="80% 10%" ' +
1912
+ ' tts:fontFamily="proportionalSansSerif" ' +
1913
+ ' tts:fontSize="16px" ' +
1914
+ ' tts:origin="10% 85%" ' +
1915
+ ' tts:textAlign="center" ' +
1916
+ ' xml:id="backgroundStyle"/>' +
1917
+ ' <style style="backgroundStyle" ' +
1918
+ ' tts:backgroundColor="transparent" ' +
1919
+ ' tts:color="white" ' +
1920
+ ' xml:id="speakerStyle"/>' +
1921
+ ' </styling>' +
1922
+ ' <layout>' +
1923
+ ' <region style="speakerStyle" tts:zIndex="1" xml:id="speaker"/>' +
1924
+ ' </layout>' +
1925
+ '</head>' +
1926
+ '<body><div>' +
1927
+ ' <p begin="00:00" end="01:00" region="speaker">' +
1928
+ ' A<br/>B' +
1929
+ ' </p>' +
1930
+ '</div></body></tt>',
1931
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1932
+ {startTime: 0, endTime: 60});
1601
1933
  });
1602
1934
 
1603
1935
  /**
1604
1936
  * @param {!Array} cues
1605
1937
  * @param {string} text
1606
1938
  * @param {shaka.extern.TextParser.TimeContext} time
1939
+ * @param {!Object} bodyProperties
1940
+ * @param {Object=} divProperties
1607
1941
  */
1608
- function verifyHelper(cues, text, time) {
1942
+ function verifyHelper(cues, text, time, bodyProperties, divProperties) {
1609
1943
  const data =
1610
1944
  shaka.util.BufferUtils.toUint8(shaka.util.StringUtils.toUTF8(text));
1611
1945
  const result = new shaka.text.TtmlTextParser().parseMedia(data, time);
1612
-
1613
- const mapExpected = (cue) => {
1614
- if (cue.region) {
1615
- cue.region = jasmine.objectContaining(cue.region);
1616
- }
1617
-
1618
- if (cue.nestedCues) {
1619
- cue.nestedCues = cue.nestedCues.map(mapExpected);
1620
- }
1621
-
1622
- return jasmine.objectContaining(cue);
1623
- };
1624
- const expected = cues.map(mapExpected);
1625
- expect(result).toEqual(expected);
1946
+ shaka.test.TtmlUtils.verifyHelper(
1947
+ cues, result, bodyProperties, divProperties);
1626
1948
  }
1627
1949
 
1628
1950