shaka-player 3.2.2 → 3.3.2

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 (188) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +1 -1
  3. package/.github/ISSUE_TEMPLATE/question.md +1 -1
  4. package/.github/workflows/build_and_test.yaml +73 -0
  5. package/.github/workflows/release.yaml +53 -0
  6. package/AUTHORS +6 -5
  7. package/CHANGELOG.md +314 -1
  8. package/CONTRIBUTORS +4 -2
  9. package/build/checkversion.py +1 -1
  10. package/build/conformance.textproto +183 -169
  11. package/build/test.py +6 -0
  12. package/build/types/core +3 -0
  13. package/build/types/offline +1 -0
  14. package/build/types/polyfill +1 -0
  15. package/build/types/ui +2 -0
  16. package/demo/common/assets.js +18 -0
  17. package/demo/common/message_ids.js +13 -1
  18. package/demo/config.js +31 -1
  19. package/demo/index.html +1 -1
  20. package/demo/locales/en.json +12 -0
  21. package/demo/locales/source.json +48 -0
  22. package/dist/controls.css +26 -2
  23. package/dist/controls.css.map +1 -1
  24. package/dist/demo.compiled.debug.js +19 -16
  25. package/dist/demo.compiled.debug.map +3 -3
  26. package/dist/demo.compiled.js +19 -16
  27. package/dist/demo.compiled.map +3 -3
  28. package/dist/deps.js +21 -14
  29. package/dist/locales.js +31 -29
  30. package/dist/receiver.compiled.debug.js +11 -9
  31. package/dist/receiver.compiled.debug.map +3 -3
  32. package/dist/receiver.compiled.js +11 -9
  33. package/dist/receiver.compiled.map +3 -3
  34. package/dist/shaka-player.compiled.d.ts +232 -18
  35. package/dist/shaka-player.compiled.debug.d.ts +232 -18
  36. package/dist/shaka-player.compiled.debug.externs.js +293 -17
  37. package/dist/shaka-player.compiled.debug.js +481 -422
  38. package/dist/shaka-player.compiled.debug.map +4 -4
  39. package/dist/shaka-player.compiled.externs.js +293 -17
  40. package/dist/shaka-player.compiled.js +846 -817
  41. package/dist/shaka-player.compiled.map +4 -4
  42. package/dist/shaka-player.ui.d.ts +250 -30
  43. package/dist/shaka-player.ui.debug.d.ts +250 -30
  44. package/dist/shaka-player.ui.debug.externs.js +322 -28
  45. package/dist/shaka-player.ui.debug.js +630 -553
  46. package/dist/shaka-player.ui.debug.map +4 -4
  47. package/dist/shaka-player.ui.externs.js +322 -28
  48. package/dist/shaka-player.ui.js +1048 -1006
  49. package/dist/shaka-player.ui.map +4 -4
  50. package/docs/design/bg-fetch-after.gv +29 -0
  51. package/docs/design/bg-fetch-after.gv.png +0 -0
  52. package/docs/design/bg-fetch-before.gv +18 -0
  53. package/docs/design/bg-fetch-before.gv.png +0 -0
  54. package/docs/design/bg-fetch.md +134 -0
  55. package/docs/tutorials/blob-url.md +15 -0
  56. package/docs/tutorials/index.json +1 -0
  57. package/docs/tutorials/ui-customization.md +66 -0
  58. package/docs/tutorials/ui.md +5 -5
  59. package/externs/cmcd.js +186 -0
  60. package/externs/ima.js +3 -0
  61. package/externs/shaka/ads.js +5 -0
  62. package/externs/shaka/manifest.js +12 -1
  63. package/externs/shaka/manifest_parser.js +10 -1
  64. package/externs/shaka/net.js +20 -4
  65. package/externs/shaka/offline.js +31 -2
  66. package/externs/shaka/player.js +138 -5
  67. package/externs/shaka/text.js +24 -0
  68. package/externs/webcrypto.js +18 -0
  69. package/karma.conf.js +19 -15
  70. package/lib/abr/ewma.js +14 -0
  71. package/lib/abr/ewma_bandwidth_estimator.js +16 -2
  72. package/lib/abr/simple_abr_manager.js +6 -0
  73. package/lib/ads/ad_manager.js +1 -0
  74. package/lib/ads/client_side_ad.js +8 -0
  75. package/lib/ads/client_side_ad_manager.js +8 -4
  76. package/lib/ads/server_side_ad.js +7 -0
  77. package/lib/cast/cast_proxy.js +3 -0
  78. package/lib/cast/cast_receiver.js +3 -0
  79. package/lib/cast/cast_utils.js +1 -0
  80. package/lib/dash/dash_parser.js +79 -33
  81. package/lib/dash/segment_base.js +25 -1
  82. package/lib/dash/segment_list.js +18 -9
  83. package/lib/dash/segment_template.js +23 -10
  84. package/lib/hls/hls_parser.js +116 -23
  85. package/lib/hls/manifest_text_parser.js +1 -0
  86. package/lib/media/quality_observer.js +274 -0
  87. package/lib/media/region_observer.js +39 -33
  88. package/lib/media/region_timeline.js +17 -19
  89. package/lib/media/segment_index.js +8 -1
  90. package/lib/media/segment_reference.js +37 -4
  91. package/lib/media/streaming_engine.js +47 -6
  92. package/lib/net/http_fetch_plugin.js +31 -11
  93. package/lib/net/http_plugin_utils.js +1 -0
  94. package/lib/net/http_xhr_plugin.js +40 -14
  95. package/lib/net/networking_engine.js +85 -18
  96. package/lib/offline/download_info.js +68 -0
  97. package/lib/offline/download_manager.js +13 -5
  98. package/lib/offline/indexeddb/base_storage_cell.js +35 -0
  99. package/lib/offline/indexeddb/storage_mechanism.js +1 -1
  100. package/lib/offline/indexeddb/v5_storage_cell.js +5 -0
  101. package/lib/offline/storage.js +401 -293
  102. package/lib/offline/stored_content_utils.js +2 -0
  103. package/lib/player.js +254 -27
  104. package/lib/polyfill/media_capabilities.js +30 -15
  105. package/lib/polyfill/random_uuid.js +52 -0
  106. package/lib/text/cue.js +18 -0
  107. package/lib/text/ttml_text_parser.js +109 -60
  108. package/lib/text/ui_text_displayer.js +19 -13
  109. package/lib/util/cmcd_manager.js +672 -0
  110. package/lib/util/error.js +6 -0
  111. package/lib/util/fake_event_target.js +21 -1
  112. package/lib/util/language_utils.js +12 -0
  113. package/lib/util/mutex.js +52 -0
  114. package/lib/util/periods.js +98 -64
  115. package/lib/util/player_configuration.js +18 -0
  116. package/lib/util/stream_utils.js +86 -10
  117. package/lib/util/xml_utils.js +19 -0
  118. package/package.json +3 -6
  119. package/shaka-player.uncompiled.js +3 -0
  120. package/test/dash/dash_parser_content_protection_unit.js +2 -0
  121. package/test/dash/dash_parser_live_unit.js +144 -1
  122. package/test/dash/dash_parser_manifest_unit.js +37 -2
  123. package/test/dash/dash_parser_segment_base_unit.js +2 -0
  124. package/test/dash/dash_parser_segment_list_unit.js +2 -1
  125. package/test/dash/dash_parser_segment_template_unit.js +2 -1
  126. package/test/hls/hls_live_unit.js +2 -0
  127. package/test/hls/hls_parser_unit.js +76 -0
  128. package/test/media/drm_engine_unit.js +3 -3
  129. package/test/media/quality_observer_unit.js +142 -0
  130. package/test/media/region_observer_unit.js +40 -5
  131. package/test/media/region_timeline_unit.js +40 -22
  132. package/test/media/segment_reference_unit.js +16 -1
  133. package/test/media/streaming_engine_integration.js +4 -2
  134. package/test/media/streaming_engine_unit.js +147 -0
  135. package/test/net/http_plugin_unit.js +20 -15
  136. package/test/offline/storage_integration.js +108 -4
  137. package/test/player_integration.js +140 -8
  138. package/test/player_src_equals_integration.js +41 -8
  139. package/test/player_unit.js +19 -9
  140. package/test/test/assets/chapters.vtt +2 -2
  141. package/test/test/assets/chapters2.vtt +10 -0
  142. package/test/test/util/dash_parser_util.js +4 -0
  143. package/test/test/util/fake_ad.js +7 -0
  144. package/test/test/util/fake_drm_engine.js +9 -2
  145. package/test/test/util/manifest_generator.js +3 -2
  146. package/test/test/util/test_scheme.js +14 -1
  147. package/test/test/util/ttml_utils.js +81 -0
  148. package/test/test/util/util.js +10 -7
  149. package/test/text/mp4_ttml_parser_unit.js +11 -18
  150. package/test/text/ttml_text_parser_unit.js +544 -228
  151. package/test/ui/text_displayer_layout_unit.js +8 -7
  152. package/test/ui/ui_unit.js +250 -0
  153. package/test/util/cmcd_manager_unit.js +291 -0
  154. package/test/util/stream_utils_unit.js +36 -30
  155. package/third_party/closure-uri/uri.js +21 -0
  156. package/ui/airplay_button.js +1 -0
  157. package/ui/audio_language_selection.js +7 -0
  158. package/ui/cast_button.js +1 -0
  159. package/ui/context_menu.js +109 -0
  160. package/ui/controls.js +44 -7
  161. package/ui/controls.less +1 -0
  162. package/ui/enums.js +4 -0
  163. package/ui/externs/ui.js +28 -1
  164. package/ui/fast_forward_button.js +14 -5
  165. package/ui/fullscreen_button.js +1 -0
  166. package/ui/less/buttons.less +0 -4
  167. package/ui/less/containers.less +74 -0
  168. package/ui/less/overflow_menu.less +0 -10
  169. package/ui/less/tooltip.less +97 -0
  170. package/ui/locales/en.json +1 -0
  171. package/ui/locales/source.json +4 -0
  172. package/ui/localization.js +12 -36
  173. package/ui/loop_button.js +5 -0
  174. package/ui/mute_button.js +2 -1
  175. package/ui/overflow_menu.js +5 -25
  176. package/ui/pip_button.js +5 -0
  177. package/ui/play_button.js +2 -2
  178. package/ui/playback_rate_selection.js +8 -9
  179. package/ui/resolution_selection.js +7 -0
  180. package/ui/rewind_button.js +15 -6
  181. package/ui/seek_bar.js +4 -2
  182. package/ui/settings_menu.js +36 -4
  183. package/ui/small_play_button.js +1 -0
  184. package/ui/statistics_button.js +253 -0
  185. package/ui/text_selection.js +12 -4
  186. package/ui/ui.js +30 -0
  187. package/ui/volume_bar.js +1 -1
  188. package/externs/media_capabilities.js +0 -16
@@ -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,8 @@ 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});
296
307
  });
297
308
 
298
309
  it('inherits timing information of nested cues if unprovided', () => {
@@ -307,9 +318,11 @@ describe('TtmlTextParser', () => {
307
318
  },
308
319
  ],
309
320
  '<tt><body>' +
310
- '<div><div begin="01:02.05" end="01:02:03.200">Test</div></div>' +
321
+ '<div><p begin="01:02.05" end="01:02:03.200">' +
322
+ '<span>Test</span></p></div>' +
311
323
  '</body></tt>',
312
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
324
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
325
+ {startTime: 62.05, endTime: 3723.2});
313
326
  });
314
327
 
315
328
  it('does not discard cues with image subcues', () => {
@@ -334,11 +347,12 @@ describe('TtmlTextParser', () => {
334
347
  '<metadata>' +
335
348
  '<smpte:image imageType="PNG" encoding="Base64" xml:id="img_0">' +
336
349
  'base64EncodedImage</smpte:image>' +
337
- '</metadata><body>' +
338
- '<div><div begin="01:02.05" end="01:02:03.200" ' +
339
- 'smpte:backgroundImage="#img_0"></div></div>' +
340
- '</body></tt>',
341
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
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});
342
356
  });
343
357
 
344
358
  it('supports colon formatted time', () => {
@@ -349,7 +363,8 @@ describe('TtmlTextParser', () => {
349
363
  '<tt><body><div>' +
350
364
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
351
365
  '</div></body></tt>',
352
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
366
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
367
+ {startTime: 62.05, endTime: 3723.2});
353
368
  });
354
369
 
355
370
  it('accounts for offset', () => {
@@ -360,7 +375,8 @@ describe('TtmlTextParser', () => {
360
375
  '<tt><body><div>' +
361
376
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
362
377
  '</div></body></tt>',
363
- {periodStart: 7, segmentStart: 0, segmentEnd: 0});
378
+ {periodStart: 7, segmentStart: 0, segmentEnd: 0},
379
+ {startTime: 69.05, endTime: 3730.2});
364
380
  });
365
381
 
366
382
  it('supports nested cues with an offset', () => {
@@ -382,7 +398,8 @@ describe('TtmlTextParser', () => {
382
398
  '<tt><body><div>' +
383
399
  '<p begin="01:02.05" end="01:02:03.200"><span>Nested cue</span></p>' +
384
400
  '</div></body></tt>',
385
- {periodStart: 7, segmentStart: 0, segmentEnd: 0});
401
+ {periodStart: 7, segmentStart: 0, segmentEnd: 0},
402
+ {startTime: 69.05, endTime: 3730.2});
386
403
  });
387
404
 
388
405
  it('supports time in 0.00h 0.00m 0.00s format', () => {
@@ -393,7 +410,8 @@ describe('TtmlTextParser', () => {
393
410
  '<tt><body><div>' +
394
411
  '<p begin="59.45m30ms" end="1.5h2.3s">Test</p>' +
395
412
  '</div></body></tt>',
396
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
413
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
414
+ {startTime: 3567.03, endTime: 5402.3});
397
415
  });
398
416
 
399
417
  it('supports time with frame rate', () => {
@@ -406,7 +424,8 @@ describe('TtmlTextParser', () => {
406
424
  '<body><div>' +
407
425
  '<p begin="00:10:15:15" end="00:11:02:30">Test</p>' +
408
426
  '</div></body></tt>',
409
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
427
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
428
+ {startTime: 615.5, endTime: 663});
410
429
  });
411
430
 
412
431
  it('supports time with frame rate multiplier', () => {
@@ -419,7 +438,8 @@ describe('TtmlTextParser', () => {
419
438
  '<body><div>' +
420
439
  '<p begin="00:10:15:15" end="00:11:02:30">Test</p>' +
421
440
  '</div></body></tt>',
422
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
441
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
442
+ {startTime: 615.5, endTime: 663});
423
443
  });
424
444
 
425
445
  it('supports time with subframes', () => {
@@ -436,7 +456,8 @@ describe('TtmlTextParser', () => {
436
456
  '<body><div>' +
437
457
  '<p begin="00:10:15:15.1" end="00:11:02:29.2">Test</p>' +
438
458
  '</div></body></tt>',
439
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
459
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
460
+ {startTime: Util.closeTo(615.5 + 1 / 60), endTime: 663});
440
461
  });
441
462
 
442
463
  it('supports time in frame format', () => {
@@ -449,7 +470,8 @@ describe('TtmlTextParser', () => {
449
470
  '<body><div>' +
450
471
  '<p begin="75f" end="300.3f">Test</p>' +
451
472
  '</div></body></tt>',
452
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
473
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
474
+ {startTime: 2.5, endTime: Util.closeTo(10.01)});
453
475
  });
454
476
 
455
477
  it('supports time in tick format', () => {
@@ -462,7 +484,8 @@ describe('TtmlTextParser', () => {
462
484
  '<body><div>' +
463
485
  '<p begin="50t" end="60.2t">Test</p>' +
464
486
  '</div></body></tt>',
465
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
487
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
488
+ {startTime: 5, endTime: Util.closeTo(6.02)});
466
489
  });
467
490
 
468
491
  it('supports time with duration', () => {
@@ -473,7 +496,8 @@ describe('TtmlTextParser', () => {
473
496
  '<tt><body><div>' +
474
497
  '<p begin="01:02.05" dur="5s">Test</p>' +
475
498
  '</div></body></tt>',
476
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
499
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
500
+ {startTime: 62.05, endTime: 67.05});
477
501
  });
478
502
 
479
503
  it('supports comments in the body', () => {
@@ -482,7 +506,29 @@ describe('TtmlTextParser', () => {
482
506
  '<tt><body><div>' +
483
507
  '<!-- text-based TTML -->' +
484
508
  '</div></body></tt>',
485
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
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});
486
532
  });
487
533
 
488
534
  it('parses alignment from textAlign attribute of a region', () => {
@@ -502,7 +548,9 @@ describe('TtmlTextParser', () => {
502
548
  '<body region="subtitleArea"><div>' +
503
549
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
504
550
  '</div></body></tt>',
505
- {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});
506
554
  });
507
555
 
508
556
  it('allows non-standard namespace names', () => {
@@ -522,7 +570,9 @@ describe('TtmlTextParser', () => {
522
570
  '<body region="subtitleArea"><div>' +
523
571
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
524
572
  '</div></body></tt>',
525
- {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});
526
576
  });
527
577
 
528
578
  it('parses alignment from <style> block with id on region', () => {
@@ -545,7 +595,9 @@ describe('TtmlTextParser', () => {
545
595
  '<body region="subtitleArea"><div>' +
546
596
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
547
597
  '</div></body></tt>',
548
- {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});
549
601
  });
550
602
 
551
603
  it('parses alignment from <style> block with id on p', () => {
@@ -568,7 +620,9 @@ describe('TtmlTextParser', () => {
568
620
  '<body region="subtitleArea"><div>' +
569
621
  '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
570
622
  '</div></body></tt>',
571
- {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});
572
626
  });
573
627
 
574
628
  it('supports region settings for horizontal text', () => {
@@ -578,13 +632,6 @@ describe('TtmlTextParser', () => {
578
632
  startTime: 62.05,
579
633
  endTime: 3723.2,
580
634
  payload: 'Test',
581
- region: {
582
- id: 'subtitleArea',
583
- viewportAnchorX: 50,
584
- viewportAnchorY: 16,
585
- width: 100,
586
- height: 100,
587
- },
588
635
  },
589
636
  ],
590
637
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -594,7 +641,18 @@ describe('TtmlTextParser', () => {
594
641
  '<body region="subtitleArea"><div>' +
595
642
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
596
643
  '</div></body></tt>',
597
- {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});
598
656
 
599
657
  verifyHelper(
600
658
  [
@@ -602,12 +660,6 @@ describe('TtmlTextParser', () => {
602
660
  startTime: 62.05,
603
661
  endTime: 3723.2,
604
662
  payload: 'Test',
605
- region: {
606
- viewportAnchorX: 50,
607
- viewportAnchorY: 16,
608
- width: 100,
609
- height: 100,
610
- },
611
663
  },
612
664
  ],
613
665
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -618,7 +670,17 @@ describe('TtmlTextParser', () => {
618
670
  '<body region="subtitleArea"><div>' +
619
671
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
620
672
  '</div></body></tt>',
621
- {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});
622
684
 
623
685
  verifyHelper(
624
686
  [
@@ -626,12 +688,6 @@ describe('TtmlTextParser', () => {
626
688
  startTime: 62.05,
627
689
  endTime: 3723.2,
628
690
  payload: 'Test',
629
- region: {
630
- viewportAnchorX: 50,
631
- viewportAnchorY: 16,
632
- width: 100,
633
- height: 100,
634
- },
635
691
  },
636
692
  ],
637
693
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -642,7 +698,17 @@ describe('TtmlTextParser', () => {
642
698
  '<body region="subtitleArea"><div>' +
643
699
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
644
700
  '</div></body></tt>',
645
- {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});
646
712
  });
647
713
 
648
714
  it('supports region settings in pixels (origin)', () => {
@@ -652,19 +718,6 @@ describe('TtmlTextParser', () => {
652
718
  startTime: 62.05,
653
719
  endTime: 3723.2,
654
720
  payload: 'Test',
655
- region: {
656
- id: 'subtitleArea',
657
- viewportAnchorX: 50,
658
- viewportAnchorY: 16,
659
- regionAnchorX: 0,
660
- regionAnchorY: 0,
661
- width: 100,
662
- height: 100,
663
- heightUnits: CueRegion.units.PERCENTAGE,
664
- widthUnits: CueRegion.units.PERCENTAGE,
665
- viewportAnchorUnits: CueRegion.units.PX,
666
- scroll: CueRegion.scrollMode.NONE,
667
- },
668
721
  },
669
722
  ],
670
723
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -674,7 +727,24 @@ describe('TtmlTextParser', () => {
674
727
  '<body region="subtitleArea"><div>' +
675
728
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
676
729
  '</div></body></tt>',
677
- {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});
678
748
  });
679
749
 
680
750
  it('supports region settings in pixels (extent)', () => {
@@ -684,19 +754,6 @@ describe('TtmlTextParser', () => {
684
754
  startTime: 62.05,
685
755
  endTime: 3723.2,
686
756
  payload: 'Test',
687
- region: {
688
- id: 'subtitleArea',
689
- viewportAnchorX: 0,
690
- viewportAnchorY: 0,
691
- regionAnchorX: 0,
692
- regionAnchorY: 0,
693
- width: 50,
694
- height: 16,
695
- heightUnits: CueRegion.units.PX,
696
- widthUnits: CueRegion.units.PX,
697
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
698
- scroll: CueRegion.scrollMode.NONE,
699
- },
700
757
  },
701
758
  ],
702
759
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -706,7 +763,24 @@ describe('TtmlTextParser', () => {
706
763
  '<body region="subtitleArea"><div>' +
707
764
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
708
765
  '</div></body></tt>',
709
- {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});
710
784
  });
711
785
 
712
786
  it('supports region settings in pixels: origin (with global extent)', () => {
@@ -716,19 +790,6 @@ describe('TtmlTextParser', () => {
716
790
  startTime: 62.05,
717
791
  endTime: 3723.2,
718
792
  payload: 'Test',
719
- region: {
720
- id: 'subtitleArea',
721
- viewportAnchorX: 10,
722
- viewportAnchorY: 10,
723
- regionAnchorX: 0,
724
- regionAnchorY: 0,
725
- width: 100,
726
- height: 100,
727
- heightUnits: CueRegion.units.PERCENTAGE,
728
- widthUnits: CueRegion.units.PERCENTAGE,
729
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
730
- scroll: CueRegion.scrollMode.NONE,
731
- },
732
793
  },
733
794
  ],
734
795
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
@@ -738,7 +799,24 @@ describe('TtmlTextParser', () => {
738
799
  '<body region="subtitleArea"><div>' +
739
800
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
740
801
  '</div></body></tt>',
741
- {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});
742
820
  });
743
821
 
744
822
  it('supports region settings in pixels: extent (with global extent)', () => {
@@ -748,19 +826,6 @@ describe('TtmlTextParser', () => {
748
826
  startTime: 62.05,
749
827
  endTime: 3723.2,
750
828
  payload: 'Test',
751
- region: {
752
- id: 'subtitleArea',
753
- viewportAnchorX: 0,
754
- viewportAnchorY: 0,
755
- regionAnchorX: 0,
756
- regionAnchorY: 0,
757
- width: 30,
758
- height: 30,
759
- heightUnits: CueRegion.units.PERCENTAGE,
760
- widthUnits: CueRegion.units.PERCENTAGE,
761
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
762
- scroll: CueRegion.scrollMode.NONE,
763
- },
764
829
  },
765
830
  ],
766
831
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
@@ -771,7 +836,24 @@ describe('TtmlTextParser', () => {
771
836
  '<body region="subtitleArea"><div>' +
772
837
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
773
838
  '</div></body></tt>',
774
- {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});
775
857
  });
776
858
 
777
859
  it('supports region settings in percentage (origin)', () => {
@@ -781,29 +863,34 @@ describe('TtmlTextParser', () => {
781
863
  startTime: 62.05,
782
864
  endTime: 3723.2,
783
865
  payload: 'Test',
784
- region: {
785
- id: 'subtitleArea',
786
- viewportAnchorX: 50,
787
- viewportAnchorY: 16,
788
- regionAnchorX: 0,
789
- regionAnchorY: 0,
790
- width: 100,
791
- height: 100,
792
- heightUnits: CueRegion.units.PERCENTAGE,
793
- widthUnits: CueRegion.units.PERCENTAGE,
794
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
795
- scroll: CueRegion.scrollMode.NONE,
796
- },
797
866
  },
798
867
  ],
799
- '<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">' +
800
870
  '<layout>' +
801
871
  '<region xml:id="subtitleArea" tts:origin="50% 16%"/>' +
802
872
  '</layout>' +
803
873
  '<body region="subtitleArea"><div>' +
804
874
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
805
875
  '</div></body></tt>',
806
- {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});
807
894
  });
808
895
 
809
896
  it('supports region settings in percentage (extent)', () => {
@@ -813,22 +900,10 @@ describe('TtmlTextParser', () => {
813
900
  startTime: 62.05,
814
901
  endTime: 3723.2,
815
902
  payload: 'Test',
816
- region: {
817
- id: 'subtitleArea',
818
- viewportAnchorX: 0,
819
- viewportAnchorY: 0,
820
- regionAnchorX: 0,
821
- regionAnchorY: 0,
822
- width: 50,
823
- height: 16,
824
- heightUnits: CueRegion.units.PERCENTAGE,
825
- widthUnits: CueRegion.units.PERCENTAGE,
826
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
827
- scroll: CueRegion.scrollMode.NONE,
828
- },
829
903
  },
830
904
  ],
831
- '<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">' +
832
907
  '<layout>' +
833
908
  '<region xml:id="subtitleArea" tts:extent="50% 16%" ' +
834
909
  'tts:writingMode="lrtb" />' +
@@ -836,7 +911,24 @@ describe('TtmlTextParser', () => {
836
911
  '<body region="subtitleArea"><div>' +
837
912
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
838
913
  '</div></body></tt>',
839
- {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});
840
932
  });
841
933
 
842
934
  it('supports region settings for vertical text', () => {
@@ -846,13 +938,6 @@ describe('TtmlTextParser', () => {
846
938
  startTime: 62.05,
847
939
  endTime: 3723.2,
848
940
  payload: 'Test',
849
- region: {
850
- id: 'subtitleArea',
851
- viewportAnchorX: 50,
852
- viewportAnchorY: 16,
853
- width: 100,
854
- height: 100,
855
- },
856
941
  },
857
942
  ],
858
943
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -863,7 +948,18 @@ describe('TtmlTextParser', () => {
863
948
  '<body region="subtitleArea"><div>' +
864
949
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
865
950
  '</div></body></tt>',
866
- {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});
867
963
 
868
964
  verifyHelper(
869
965
  [
@@ -871,12 +967,6 @@ describe('TtmlTextParser', () => {
871
967
  startTime: 62.05,
872
968
  endTime: 3723.2,
873
969
  payload: 'Test',
874
- region: {
875
- viewportAnchorX: 50,
876
- viewportAnchorY: 16,
877
- width: 100,
878
- height: 100,
879
- },
880
970
  },
881
971
  ],
882
972
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -887,7 +977,17 @@ describe('TtmlTextParser', () => {
887
977
  '<body region="subtitleArea"><div>' +
888
978
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
889
979
  '</div></body></tt>',
890
- {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});
891
991
 
892
992
  verifyHelper(
893
993
  [
@@ -895,12 +995,6 @@ describe('TtmlTextParser', () => {
895
995
  startTime: 62.05,
896
996
  endTime: 3723.2,
897
997
  payload: 'Test',
898
- region: {
899
- viewportAnchorX: 50,
900
- viewportAnchorY: 16,
901
- width: 100,
902
- height: 100,
903
- },
904
998
  },
905
999
  ],
906
1000
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -911,7 +1005,17 @@ describe('TtmlTextParser', () => {
911
1005
  '<body region="subtitleArea"><div>' +
912
1006
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
913
1007
  '</div></body></tt>',
914
- {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});
915
1019
  });
916
1020
 
917
1021
  it('supports percentages containing decimals', () => {
@@ -921,13 +1025,6 @@ describe('TtmlTextParser', () => {
921
1025
  startTime: 62.05,
922
1026
  endTime: 3723.2,
923
1027
  payload: 'Test',
924
- region: {
925
- id: 'subtitleArea',
926
- viewportAnchorX: 12.2,
927
- viewportAnchorY: 50.005,
928
- width: 100,
929
- height: 100,
930
- },
931
1028
  },
932
1029
  ],
933
1030
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -938,7 +1035,18 @@ describe('TtmlTextParser', () => {
938
1035
  '<body region="subtitleArea"><div>' +
939
1036
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
940
1037
  '</div></body></tt>',
941
- {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});
942
1050
  });
943
1051
 
944
1052
  it('supports writingMode setting', () => {
@@ -959,7 +1067,9 @@ describe('TtmlTextParser', () => {
959
1067
  '<body region="subtitleArea"><div>' +
960
1068
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
961
1069
  '</div></body></tt>',
962
- {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});
963
1073
 
964
1074
  verifyHelper(
965
1075
  [
@@ -978,7 +1088,9 @@ describe('TtmlTextParser', () => {
978
1088
  '<body region="subtitleArea"><div>' +
979
1089
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
980
1090
  '</div></body></tt>',
981
- {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});
982
1094
 
983
1095
  verifyHelper(
984
1096
  [
@@ -997,7 +1109,9 @@ describe('TtmlTextParser', () => {
997
1109
  '<body region="subtitleArea"><div>' +
998
1110
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
999
1111
  '</div></body></tt>',
1000
- {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});
1001
1115
 
1002
1116
  verifyHelper(
1003
1117
  [
@@ -1016,7 +1130,9 @@ describe('TtmlTextParser', () => {
1016
1130
  '<body region="subtitleArea"><div>' +
1017
1131
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1018
1132
  '</div></body></tt>',
1019
- {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});
1020
1136
 
1021
1137
  verifyHelper(
1022
1138
  [
@@ -1035,7 +1151,9 @@ describe('TtmlTextParser', () => {
1035
1151
  '<body region="subtitleArea"><div>' +
1036
1152
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1037
1153
  '</div></body></tt>',
1038
- {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});
1039
1157
  });
1040
1158
 
1041
1159
  it('disregards empty divs and ps', () => {
@@ -1051,7 +1169,8 @@ describe('TtmlTextParser', () => {
1051
1169
  '<div></div>' +
1052
1170
  '</body>' +
1053
1171
  '</tt>',
1054
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1172
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1173
+ {startTime: 62.05, endTime: 3723.2});
1055
1174
 
1056
1175
  verifyHelper(
1057
1176
  [
@@ -1065,7 +1184,8 @@ describe('TtmlTextParser', () => {
1065
1184
  '</div>' +
1066
1185
  '</body>' +
1067
1186
  '</tt>',
1068
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1187
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1188
+ {startTime: 62.05, endTime: 3723.2});
1069
1189
 
1070
1190
  verifyHelper(
1071
1191
  [],
@@ -1077,7 +1197,8 @@ describe('TtmlTextParser', () => {
1077
1197
  '<div></div>' +
1078
1198
  '</body>' +
1079
1199
  '</tt>',
1080
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1200
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1201
+ {});
1081
1202
  });
1082
1203
 
1083
1204
  it('should let empty paragraphs with begin or end attributes through', () => {
@@ -1093,7 +1214,8 @@ describe('TtmlTextParser', () => {
1093
1214
  '</div>' +
1094
1215
  '</body>' +
1095
1216
  '</tt>',
1096
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1217
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1218
+ {startTime: 62.05, endTime: 3723.2});
1097
1219
  });
1098
1220
 
1099
1221
  it('supports smpte:backgroundImage attribute', () => {
@@ -1103,7 +1225,6 @@ describe('TtmlTextParser', () => {
1103
1225
  startTime: 62.05,
1104
1226
  endTime: 3723.2,
1105
1227
  payload: '',
1106
- backgroundImage: 'data:image/png;base64,base64EncodedImage',
1107
1228
  },
1108
1229
  ],
1109
1230
  '<tt ' +
@@ -1116,19 +1237,19 @@ describe('TtmlTextParser', () => {
1116
1237
  '<body><div smpte:backgroundImage="#img_0">' +
1117
1238
  '<p begin="01:02.05" end="01:02:03.200"></p>' +
1118
1239
  '</div></body></tt>',
1119
- {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
+ });
1120
1248
  });
1121
1249
 
1122
1250
  it('supports smpte:backgroundImage attribute in div element', () => {
1123
1251
  verifyHelper(
1124
- [
1125
- {
1126
- startTime: 0,
1127
- endTime: 62.05,
1128
- payload: '',
1129
- backgroundImage: 'data:image/png;base64,base64EncodedImage',
1130
- },
1131
- ],
1252
+ [],
1132
1253
  '<tt ' +
1133
1254
  'xmlns:ttm="http://www.w3.org/ns/ttml#metadata" ' +
1134
1255
  'xmlns:smpte="http://www.smpte-ra.org/schemas/2052-1/2010/smpte-tt">' +
@@ -1139,7 +1260,14 @@ describe('TtmlTextParser', () => {
1139
1260
  '<body><div begin="00:00.00" end="01:02.05" '+
1140
1261
  'smpte:backgroundImage="#img_0"></div>' +
1141
1262
  '</body></tt>',
1142
- {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
+ });
1143
1271
  });
1144
1272
 
1145
1273
  it('supports smpte:backgroundImage attribute alt namespace', () => {
@@ -1163,7 +1291,8 @@ describe('TtmlTextParser', () => {
1163
1291
  '<p begin="01:02.05" end="01:02:03.200" ' +
1164
1292
  'smpte:backgroundImage="#img_0" />' +
1165
1293
  '</div></body></tt>',
1166
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1294
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1295
+ {startTime: 62.05, endTime: 3723.2});
1167
1296
  });
1168
1297
 
1169
1298
  it('inserts line breaks for <br> tags', () => {
@@ -1191,7 +1320,8 @@ describe('TtmlTextParser', () => {
1191
1320
  '<tt><body><div>' +
1192
1321
  '<p begin="01:02.05" end="01:02:03.200">Line1<br/>Line2</p>' +
1193
1322
  '</div></body></tt>',
1194
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1323
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1324
+ {startTime: 62.05, endTime: 3723.2});
1195
1325
 
1196
1326
  verifyHelper(
1197
1327
  [{
@@ -1224,7 +1354,36 @@ describe('TtmlTextParser', () => {
1224
1354
  '<span>Line1<br/>Line2</span>' +
1225
1355
  '</p>' +
1226
1356
  '</div></body></tt>',
1227
- {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});
1228
1387
  });
1229
1388
 
1230
1389
  it('parses cue alignment from textAlign attribute', () => {
@@ -1249,7 +1408,9 @@ describe('TtmlTextParser', () => {
1249
1408
  '<body region="subtitleArea"><div>' +
1250
1409
  '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
1251
1410
  '</div></body></tt>',
1252
- {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});
1253
1414
  });
1254
1415
 
1255
1416
  it('parses text style information', () => {
@@ -1266,6 +1427,8 @@ describe('TtmlTextParser', () => {
1266
1427
  fontStyle: Cue.fontStyle.ITALIC,
1267
1428
  lineHeight: '20px',
1268
1429
  fontSize: '10em',
1430
+ textStrokeColor: 'blue',
1431
+ textStrokeWidth: '3px',
1269
1432
  },
1270
1433
  {
1271
1434
  startTime: 2,
@@ -1277,6 +1440,7 @@ describe('TtmlTextParser', () => {
1277
1440
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1278
1441
  '<styling>' +
1279
1442
  '<style xml:id="s1" tts:color="red" ' +
1443
+ 'tts:textOutline="blue 3px" ' +
1280
1444
  'tts:backgroundColor="blue" ' +
1281
1445
  'tts:fontWeight="bold" ' +
1282
1446
  'tts:fontFamily="Times New Roman" ' +
@@ -1292,7 +1456,55 @@ describe('TtmlTextParser', () => {
1292
1456
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1293
1457
  '<p begin="00:02.00" end="00:04.00" style="s2">Test 2</p>' +
1294
1458
  '</div></body></tt>',
1295
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1459
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1460
+ {startTime: 1, endTime: 4, region: {id: 'subtitleArea'}},
1461
+ {startTime: 1, endTime: 4});
1462
+ });
1463
+
1464
+ it('uses text color if tts:textOutline does not specify color', () => {
1465
+ verifyHelper(
1466
+ [
1467
+ {
1468
+ startTime: 1,
1469
+ endTime: 2,
1470
+ payload: 'Test',
1471
+ color: 'red',
1472
+ textStrokeColor: 'red',
1473
+ textStrokeWidth: '3px',
1474
+ },
1475
+ ],
1476
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1477
+ '<styling>' +
1478
+ '<style xml:id="s1" tts:color="red" ' +
1479
+ 'tts:textOutline="3px" />' +
1480
+ '</styling>' +
1481
+ '<body region="subtitleArea"><div>' +
1482
+ '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1483
+ '</div></body></tt>',
1484
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1485
+ {startTime: 1, endTime: 2});
1486
+ });
1487
+
1488
+ it('does not add an outline if tts:textOutline only contains color', () => {
1489
+ verifyHelper(
1490
+ [
1491
+ {
1492
+ startTime: 1,
1493
+ endTime: 2,
1494
+ payload: 'Test',
1495
+ color: 'red',
1496
+ },
1497
+ ],
1498
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1499
+ '<styling>' +
1500
+ '<style xml:id="s1" tts:color="red" ' +
1501
+ 'tts:textOutline="blue" />' +
1502
+ '</styling>' +
1503
+ '<body region="subtitleArea"><div>' +
1504
+ '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1505
+ '</div></body></tt>',
1506
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1507
+ {startTime: 1, endTime: 2});
1296
1508
  });
1297
1509
 
1298
1510
  // Regression test for #2623
@@ -1328,7 +1540,8 @@ describe('TtmlTextParser', () => {
1328
1540
  '<span style="s1">Test</span>' +
1329
1541
  '</p>' +
1330
1542
  '</div></body></tt>',
1331
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1543
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1544
+ {startTime: 1, endTime: 2});
1332
1545
  });
1333
1546
 
1334
1547
  it('parses wrapping option', () => {
@@ -1351,7 +1564,9 @@ describe('TtmlTextParser', () => {
1351
1564
  '<body region="subtitleArea"><div>' +
1352
1565
  '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
1353
1566
  '</div></body></tt>',
1354
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1567
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1568
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1569
+ {startTime: 62.05, endTime: 3723.2});
1355
1570
  });
1356
1571
 
1357
1572
  it('parses text decoration', () => {
@@ -1377,7 +1592,9 @@ describe('TtmlTextParser', () => {
1377
1592
  '<body region="subtitleArea"><div>' +
1378
1593
  '<p begin="01:02.05" end="01:02:03.200" style="s2">Test</p>' +
1379
1594
  '</div></body></tt>',
1380
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1595
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1596
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1597
+ {startTime: 62.05, endTime: 3723.2});
1381
1598
  });
1382
1599
 
1383
1600
  it('cues should have default cellResolution', () => {
@@ -1400,7 +1617,8 @@ describe('TtmlTextParser', () => {
1400
1617
  '<body><div>' +
1401
1618
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1402
1619
  '</div></body></tt>',
1403
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1620
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1621
+ {startTime: 1, endTime: 2});
1404
1622
  });
1405
1623
 
1406
1624
  it('parses cellResolution', () => {
@@ -1427,7 +1645,8 @@ describe('TtmlTextParser', () => {
1427
1645
  '<body><div>' +
1428
1646
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1429
1647
  '</div></body></tt>',
1430
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1648
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1649
+ {startTime: 1, endTime: 2});
1431
1650
  });
1432
1651
 
1433
1652
  it('parses line padding', () => {
@@ -1455,7 +1674,8 @@ describe('TtmlTextParser', () => {
1455
1674
  '<body><div>' +
1456
1675
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1457
1676
  '</div></body></tt>',
1458
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1677
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1678
+ {startTime: 1, endTime: 2});
1459
1679
  });
1460
1680
 
1461
1681
  it('chooses style on element over style on region', () => {
@@ -1479,7 +1699,9 @@ describe('TtmlTextParser', () => {
1479
1699
  '<body region="subtitleArea"><div>' +
1480
1700
  '<p begin="01:02.05" end="01:02:03.200" style="s2">Test</p>' +
1481
1701
  '</div></body></tt>',
1482
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1702
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1703
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1704
+ {startTime: 62.05, endTime: 3723.2});
1483
1705
  });
1484
1706
 
1485
1707
  it('can parse multiple cues', () => {
@@ -1492,7 +1714,8 @@ describe('TtmlTextParser', () => {
1492
1714
  '<p begin="00:01.00" end="00:02.00">First cue</p>' +
1493
1715
  '<p begin="00:03.00" end="00:04.00">Second cue</p>' +
1494
1716
  '</div></body></tt>',
1495
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1717
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1718
+ {startTime: 1, endTime: 4});
1496
1719
  });
1497
1720
 
1498
1721
  // Regression test for https://github.com/google/shaka-player/issues/2478
@@ -1515,7 +1738,8 @@ describe('TtmlTextParser', () => {
1515
1738
  '<tt><body><div>' +
1516
1739
  '<p begin="01:02.05" end="01:02:03.200"><span>äöü</span></p>' +
1517
1740
  '</div></body></tt>',
1518
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1741
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1742
+ {startTime: 62.05, endTime: 3723.2});
1519
1743
  });
1520
1744
 
1521
1745
  it('supports timing on multiple levels', () => {
@@ -1531,7 +1755,9 @@ describe('TtmlTextParser', () => {
1531
1755
  '<p begin="3s" end="4s">First cue</p>' +
1532
1756
  '<p begin="4s" end="5s">Second cue</p>' +
1533
1757
  '</div></body></tt>',
1534
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1758
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1759
+ {startTime: 1, endTime: Infinity},
1760
+ {startTime: 3, endTime: Infinity});
1535
1761
 
1536
1762
  verifyHelper(
1537
1763
  [{
@@ -1554,7 +1780,9 @@ describe('TtmlTextParser', () => {
1554
1780
  '<span begin="5s" end="6s">Second cue</span>' +
1555
1781
  '</p>' +
1556
1782
  '</div></body></tt>',
1557
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1783
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1784
+ {startTime: 1, endTime: Infinity},
1785
+ {startTime: 3, endTime: Infinity});
1558
1786
  });
1559
1787
 
1560
1788
  it('gets end time from parent directly if missing', () => {
@@ -1568,7 +1796,9 @@ describe('TtmlTextParser', () => {
1568
1796
  '<p begin="3s" end="4s">First cue</p>' +
1569
1797
  '<p begin="4s">Second cue</p>' +
1570
1798
  '</div></body></tt>',
1571
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1799
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1800
+ {startTime: 1, endTime: 30},
1801
+ {startTime: 3, endTime: 30});
1572
1802
  });
1573
1803
 
1574
1804
  it('supports never-ending cues', () => {
@@ -1581,7 +1811,8 @@ describe('TtmlTextParser', () => {
1581
1811
  '<p begin="1s">First cue</p>' +
1582
1812
  '<p begin="2s">Second cue</p>' +
1583
1813
  '</div></body></tt>',
1584
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1814
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1815
+ {startTime: 1, endTime: Infinity});
1585
1816
  });
1586
1817
 
1587
1818
  // Regression test for b/159050711
@@ -1597,8 +1828,8 @@ describe('TtmlTextParser', () => {
1597
1828
  // Styles from regionStyle should apply only to the nested cue.
1598
1829
  backgroundColor: '',
1599
1830
  color: '',
1600
- displayAlign: Cue.displayAlign.AFTER, // displayAlign default value.
1601
- textAlign: Cue.textAlign.START, // textAlign default value.
1831
+ displayAlign: Cue.displayAlign.CENTER,
1832
+ textAlign: Cue.textAlign.CENTER,
1602
1833
 
1603
1834
  nestedCues: [
1604
1835
  {
@@ -1623,7 +1854,7 @@ describe('TtmlTextParser', () => {
1623
1854
  // Styles inherited from backgroundStyle via regionStyle via
1624
1855
  // spanStyle
1625
1856
  displayAlign: Cue.displayAlign.CENTER,
1626
- textAlign: Cue.textAlign.CENTER,
1857
+ textAlign: Cue.textAlign.END,
1627
1858
  },
1628
1859
  ],
1629
1860
  },
@@ -1637,7 +1868,7 @@ describe('TtmlTextParser', () => {
1637
1868
  // spanStyle inherits attributes from regionStyle
1638
1869
  ' <style xml:id="pStyle" tts:fontSize="15px" />' +
1639
1870
  ' <style xml:id="spanStyle" style="regionStyle" ' +
1640
- ' tts:backgroundColor="white" />' +
1871
+ ' tts:backgroundColor="white" tts:textAlign="end" />' +
1641
1872
  // regionStyle inherits attributes from backgroundStyle
1642
1873
  ' <style xml:id="regionStyle" style="backgroundStyle" ' +
1643
1874
  ' tts:backgroundColor="transparent" tts:color="blue" />' +
@@ -1652,32 +1883,117 @@ describe('TtmlTextParser', () => {
1652
1883
  ' <span style="spanStyle">Test with spanStyle</span>' +
1653
1884
  ' </p>' +
1654
1885
  '</div></body></tt>',
1655
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1886
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1887
+ {startTime: 0, endTime: 60});
1888
+ });
1889
+
1890
+ it('inherits alignment from parent regions', () => {
1891
+ verifyHelper(
1892
+ [
1893
+ {
1894
+ startTime: 0,
1895
+ endTime: 60,
1896
+ payload: '',
1897
+ fontSize: '',
1898
+ textAlign: Cue.textAlign.END,
1899
+ displayAlign: Cue.displayAlign.CENTER,
1900
+ nestedCues: [
1901
+ {
1902
+ startTime: 0,
1903
+ endTime: 60,
1904
+ payload: 'Hello!',
1905
+ textAlign: Cue.textAlign.END,
1906
+ displayAlign: Cue.displayAlign.CENTER,
1907
+ },
1908
+ ],
1909
+ },
1910
+ ],
1911
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1912
+ '<head><layout>' +
1913
+ '<region xml:id="r1" tts:textAlign="end" tts:displayAlign="center" />' +
1914
+ '</layout></head>' +
1915
+ '<body><div><p begin="00:00" end="01:00" region="r1">' +
1916
+ '<span>Hello!</span>' +
1917
+ '</p></div></body></tt>',
1918
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1919
+ {startTime: 0, endTime: 60},
1920
+ );
1921
+ });
1922
+
1923
+ // Regression test for https://github.com/google/shaka-player/issues/3743
1924
+ it('inherits styles from other styles on nestedCues', () => {
1925
+ verifyHelper(
1926
+ [
1927
+ {
1928
+ // p element
1929
+ startTime: 0,
1930
+ endTime: 60,
1931
+ payload: '',
1932
+ fontSize: '',
1933
+ nestedCues: [
1934
+ {
1935
+ startTime: 0,
1936
+ endTime: 60,
1937
+ payload: 'A',
1938
+ fontSize: '16px',
1939
+ },
1940
+ {
1941
+ startTime: 0,
1942
+ endTime: 60,
1943
+ payload: '',
1944
+ fontSize: '',
1945
+ },
1946
+ {
1947
+ startTime: 0,
1948
+ endTime: 60,
1949
+ payload: 'B',
1950
+ fontSize: '16px',
1951
+ },
1952
+ ],
1953
+ },
1954
+ ],
1955
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1956
+ '<head>' +
1957
+ ' <styling>' +
1958
+ ' <style tts:backgroundColor="rgba(0,0,0,100)" ' +
1959
+ ' tts:displayAlign="center" ' +
1960
+ ' tts:extent="80% 10%" ' +
1961
+ ' tts:fontFamily="proportionalSansSerif" ' +
1962
+ ' tts:fontSize="16px" ' +
1963
+ ' tts:origin="10% 85%" ' +
1964
+ ' tts:textAlign="center" ' +
1965
+ ' xml:id="backgroundStyle"/>' +
1966
+ ' <style style="backgroundStyle" ' +
1967
+ ' tts:backgroundColor="transparent" ' +
1968
+ ' tts:color="white" ' +
1969
+ ' xml:id="speakerStyle"/>' +
1970
+ ' </styling>' +
1971
+ ' <layout>' +
1972
+ ' <region style="speakerStyle" tts:zIndex="1" xml:id="speaker"/>' +
1973
+ ' </layout>' +
1974
+ '</head>' +
1975
+ '<body><div>' +
1976
+ ' <p begin="00:00" end="01:00" region="speaker">' +
1977
+ ' A<br/>B' +
1978
+ ' </p>' +
1979
+ '</div></body></tt>',
1980
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1981
+ {startTime: 0, endTime: 60});
1656
1982
  });
1657
1983
 
1658
1984
  /**
1659
1985
  * @param {!Array} cues
1660
1986
  * @param {string} text
1661
1987
  * @param {shaka.extern.TextParser.TimeContext} time
1988
+ * @param {!Object} bodyProperties
1989
+ * @param {Object=} divProperties
1662
1990
  */
1663
- function verifyHelper(cues, text, time) {
1991
+ function verifyHelper(cues, text, time, bodyProperties, divProperties) {
1664
1992
  const data =
1665
1993
  shaka.util.BufferUtils.toUint8(shaka.util.StringUtils.toUTF8(text));
1666
1994
  const result = new shaka.text.TtmlTextParser().parseMedia(data, time);
1667
-
1668
- const mapExpected = (cue) => {
1669
- if (cue.region) {
1670
- cue.region = jasmine.objectContaining(cue.region);
1671
- }
1672
-
1673
- if (cue.nestedCues) {
1674
- cue.nestedCues = cue.nestedCues.map(mapExpected);
1675
- }
1676
-
1677
- return jasmine.objectContaining(cue);
1678
- };
1679
- const expected = cues.map(mapExpected);
1680
- expect(result).toEqual(expected);
1995
+ shaka.test.TtmlUtils.verifyHelper(
1996
+ cues, result, bodyProperties, divProperties);
1681
1997
  }
1682
1998
 
1683
1999