shaka-player 3.2.1 → 3.3.1

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 (213) 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/AUTHORS +9 -5
  5. package/CHANGELOG.md +358 -0
  6. package/CONTRIBUTORS +7 -2
  7. package/build/conformance.textproto +183 -169
  8. package/build/generateExterns.js +1 -1
  9. package/build/types/core +3 -0
  10. package/build/types/offline +1 -0
  11. package/build/types/polyfill +1 -0
  12. package/build/types/ui +2 -0
  13. package/demo/common/assets.js +19 -1
  14. package/demo/common/message_ids.js +13 -1
  15. package/demo/config.js +31 -1
  16. package/demo/index.html +1 -1
  17. package/demo/locales/en.json +12 -0
  18. package/demo/locales/source.json +48 -0
  19. package/dist/controls.css +26 -2
  20. package/dist/controls.css.map +1 -1
  21. package/dist/demo.compiled.debug.js +20 -17
  22. package/dist/demo.compiled.debug.map +3 -3
  23. package/dist/demo.compiled.js +20 -17
  24. package/dist/demo.compiled.map +3 -3
  25. package/dist/deps.js +19 -12
  26. package/dist/locales.js +39 -37
  27. package/dist/receiver.compiled.debug.js +12 -10
  28. package/dist/receiver.compiled.debug.map +3 -3
  29. package/dist/receiver.compiled.js +12 -10
  30. package/dist/receiver.compiled.map +3 -3
  31. package/dist/shaka-player.compiled.d.ts +231 -18
  32. package/dist/shaka-player.compiled.debug.d.ts +231 -18
  33. package/dist/shaka-player.compiled.debug.externs.js +279 -8
  34. package/dist/shaka-player.compiled.debug.js +512 -449
  35. package/dist/shaka-player.compiled.debug.map +4 -4
  36. package/dist/shaka-player.compiled.externs.js +279 -8
  37. package/dist/shaka-player.compiled.js +854 -821
  38. package/dist/shaka-player.compiled.map +4 -4
  39. package/dist/shaka-player.ui.d.ts +247 -19
  40. package/dist/shaka-player.ui.debug.d.ts +247 -19
  41. package/dist/shaka-player.ui.debug.externs.js +307 -9
  42. package/dist/shaka-player.ui.debug.js +662 -580
  43. package/dist/shaka-player.ui.debug.map +4 -4
  44. package/dist/shaka-player.ui.externs.js +307 -9
  45. package/dist/shaka-player.ui.js +1047 -1000
  46. package/dist/shaka-player.ui.map +4 -4
  47. package/docs/design/bg-fetch-after.gv +29 -0
  48. package/docs/design/bg-fetch-after.gv.png +0 -0
  49. package/docs/design/bg-fetch-before.gv +18 -0
  50. package/docs/design/bg-fetch-before.gv.png +0 -0
  51. package/docs/design/bg-fetch.md +134 -0
  52. package/docs/tutorials/blob-url.md +15 -0
  53. package/docs/tutorials/fairplay.md +1 -1
  54. package/docs/tutorials/index.json +1 -0
  55. package/docs/tutorials/ui-customization.md +66 -0
  56. package/docs/tutorials/ui.md +5 -5
  57. package/externs/cmcd.js +186 -0
  58. package/externs/ima.js +3 -0
  59. package/externs/shaka/ads.js +5 -0
  60. package/externs/shaka/manifest.js +12 -1
  61. package/externs/shaka/manifest_parser.js +10 -1
  62. package/externs/shaka/net.js +20 -4
  63. package/externs/shaka/offline.js +31 -2
  64. package/externs/shaka/player.js +138 -5
  65. package/externs/shaka/text.js +24 -0
  66. package/externs/webcrypto.js +18 -0
  67. package/karma.conf.js +1 -0
  68. package/lib/abr/ewma.js +14 -0
  69. package/lib/abr/ewma_bandwidth_estimator.js +16 -2
  70. package/lib/abr/simple_abr_manager.js +6 -0
  71. package/lib/ads/client_side_ad.js +8 -0
  72. package/lib/ads/client_side_ad_manager.js +54 -90
  73. package/lib/ads/server_side_ad.js +7 -0
  74. package/lib/ads/server_side_ad_manager.js +7 -10
  75. package/lib/cast/cast_proxy.js +3 -2
  76. package/lib/cast/cast_receiver.js +2 -1
  77. package/lib/cast/cast_sender.js +2 -2
  78. package/lib/cast/cast_utils.js +1 -0
  79. package/lib/dash/dash_parser.js +141 -16
  80. package/lib/dash/segment_base.js +25 -1
  81. package/lib/dash/segment_list.js +19 -10
  82. package/lib/dash/segment_template.js +24 -11
  83. package/lib/hls/hls_parser.js +146 -40
  84. package/lib/media/drm_engine.js +7 -0
  85. package/lib/media/gap_jumping_controller.js +4 -2
  86. package/lib/media/media_source_engine.js +1 -2
  87. package/lib/media/quality_observer.js +291 -0
  88. package/lib/media/segment_index.js +8 -1
  89. package/lib/media/segment_reference.js +37 -4
  90. package/lib/media/streaming_engine.js +49 -7
  91. package/lib/net/http_fetch_plugin.js +31 -11
  92. package/lib/net/http_plugin_utils.js +1 -0
  93. package/lib/net/http_xhr_plugin.js +40 -14
  94. package/lib/net/networking_engine.js +83 -19
  95. package/lib/offline/download_info.js +68 -0
  96. package/lib/offline/download_manager.js +13 -5
  97. package/lib/offline/indexeddb/base_storage_cell.js +35 -0
  98. package/lib/offline/indexeddb/storage_mechanism.js +1 -1
  99. package/lib/offline/indexeddb/v5_storage_cell.js +5 -0
  100. package/lib/offline/storage.js +393 -284
  101. package/lib/offline/stored_content_utils.js +2 -0
  102. package/lib/player.js +249 -43
  103. package/lib/polyfill/media_capabilities.js +36 -15
  104. package/lib/polyfill/mediasource.js +6 -0
  105. package/lib/polyfill/orientation.js +1 -1
  106. package/lib/polyfill/patchedmediakeys_apple.js +4 -4
  107. package/lib/polyfill/patchedmediakeys_ms.js +4 -4
  108. package/lib/polyfill/patchedmediakeys_webkit.js +4 -4
  109. package/lib/polyfill/random_uuid.js +52 -0
  110. package/lib/text/cue.js +18 -0
  111. package/lib/text/mp4_ttml_parser.js +3 -0
  112. package/lib/text/text_engine.js +14 -2
  113. package/lib/text/ttml_text_parser.js +114 -60
  114. package/lib/text/ui_text_displayer.js +95 -41
  115. package/lib/util/cmcd_manager.js +672 -0
  116. package/lib/util/error.js +6 -0
  117. package/lib/util/fake_event.js +53 -7
  118. package/lib/util/language_utils.js +12 -0
  119. package/lib/util/mutex.js +52 -0
  120. package/lib/util/periods.js +102 -65
  121. package/lib/util/platform.js +13 -1
  122. package/lib/util/player_configuration.js +18 -0
  123. package/lib/util/stream_utils.js +99 -10
  124. package/lib/util/xml_utils.js +19 -0
  125. package/package.json +2 -2
  126. package/shaka-player.uncompiled.js +3 -0
  127. package/test/cast/cast_proxy_unit.js +12 -6
  128. package/test/cast/cast_utils_unit.js +1 -1
  129. package/test/dash/dash_parser_content_protection_unit.js +2 -0
  130. package/test/dash/dash_parser_live_unit.js +101 -1
  131. package/test/dash/dash_parser_manifest_unit.js +222 -2
  132. package/test/dash/dash_parser_segment_base_unit.js +2 -0
  133. package/test/dash/dash_parser_segment_list_unit.js +2 -1
  134. package/test/dash/dash_parser_segment_template_unit.js +2 -1
  135. package/test/hls/hls_live_unit.js +2 -0
  136. package/test/hls/hls_parser_unit.js +7 -1
  137. package/test/media/closed_caption_parser_unit.js +6 -1
  138. package/test/media/drm_engine_unit.js +47 -3
  139. package/test/media/quality_observer_unit.js +139 -0
  140. package/test/media/segment_reference_unit.js +16 -1
  141. package/test/media/streaming_engine_integration.js +4 -2
  142. package/test/media/streaming_engine_unit.js +147 -0
  143. package/test/net/http_plugin_unit.js +20 -15
  144. package/test/offline/storage_integration.js +108 -4
  145. package/test/player_integration.js +178 -8
  146. package/test/player_src_equals_integration.js +41 -8
  147. package/test/player_unit.js +19 -9
  148. package/test/test/assets/3675/chunk-stream0-00001.m4s +0 -0
  149. package/test/test/assets/3675/chunk-stream0-00002.m4s +0 -0
  150. package/test/test/assets/3675/chunk-stream0-00003.m4s +0 -0
  151. package/test/test/assets/3675/chunk-stream0-00004.m4s +0 -0
  152. package/test/test/assets/3675/chunk-stream0-00005.m4s +0 -0
  153. package/test/test/assets/3675/chunk-stream0-00006.m4s +0 -0
  154. package/test/test/assets/3675/chunk-stream0-00007.m4s +0 -0
  155. package/test/test/assets/3675/dash_0.mpd +30 -0
  156. package/test/test/assets/3675/dash_1.mpd +30 -0
  157. package/test/test/assets/3675/dash_2.mpd +30 -0
  158. package/test/test/assets/3675/dash_3.mpd +30 -0
  159. package/test/test/assets/3675/dash_4.mpd +30 -0
  160. package/test/test/assets/3675/dash_5.mpd +26 -0
  161. package/test/test/assets/3675/init-stream0.m4s +0 -0
  162. package/test/test/assets/chapters.vtt +2 -2
  163. package/test/test/assets/chapters2.vtt +10 -0
  164. package/test/test/util/dash_parser_util.js +4 -0
  165. package/test/test/util/fake_ad.js +7 -0
  166. package/test/test/util/fake_ad_manager.js +1 -1
  167. package/test/test/util/fake_drm_engine.js +9 -2
  168. package/test/test/util/manifest_generator.js +3 -2
  169. package/test/test/util/test_scheme.js +14 -1
  170. package/test/test/util/ttml_utils.js +81 -0
  171. package/test/text/mp4_ttml_parser_unit.js +11 -18
  172. package/test/text/ttml_text_parser_unit.js +552 -227
  173. package/test/text/ui_text_displayer_unit.js +29 -17
  174. package/test/ui/localization_unit.js +15 -14
  175. package/test/ui/text_displayer_layout_unit.js +13 -1
  176. package/test/ui/ui_unit.js +250 -0
  177. package/test/util/cmcd_manager_unit.js +291 -0
  178. package/test/util/stream_utils_unit.js +45 -4
  179. package/third_party/closure-uri/uri.js +21 -0
  180. package/ui/airplay_button.js +1 -0
  181. package/ui/audio_language_selection.js +7 -0
  182. package/ui/cast_button.js +3 -3
  183. package/ui/context_menu.js +109 -0
  184. package/ui/controls.js +45 -13
  185. package/ui/controls.less +1 -0
  186. package/ui/enums.js +4 -0
  187. package/ui/externs/ui.js +28 -1
  188. package/ui/fast_forward_button.js +14 -5
  189. package/ui/fullscreen_button.js +1 -0
  190. package/ui/less/buttons.less +0 -4
  191. package/ui/less/containers.less +77 -7
  192. package/ui/less/overflow_menu.less +0 -10
  193. package/ui/less/tooltip.less +97 -0
  194. package/ui/locales/en.json +1 -0
  195. package/ui/locales/ru.json +6 -6
  196. package/ui/locales/source.json +4 -0
  197. package/ui/localization.js +28 -51
  198. package/ui/loop_button.js +5 -0
  199. package/ui/mute_button.js +2 -1
  200. package/ui/overflow_menu.js +5 -25
  201. package/ui/pip_button.js +7 -3
  202. package/ui/play_button.js +2 -2
  203. package/ui/playback_rate_selection.js +8 -9
  204. package/ui/resolution_selection.js +7 -0
  205. package/ui/rewind_button.js +15 -6
  206. package/ui/seek_bar.js +4 -2
  207. package/ui/settings_menu.js +36 -4
  208. package/ui/small_play_button.js +1 -0
  209. package/ui/statistics_button.js +253 -0
  210. package/ui/text_selection.js +12 -4
  211. package/ui/ui.js +30 -0
  212. package/ui/volume_bar.js +1 -1
  213. 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,39 @@ 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});
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});
477
532
  });
478
533
 
479
534
  it('parses alignment from textAlign attribute of a region', () => {
@@ -493,7 +548,9 @@ describe('TtmlTextParser', () => {
493
548
  '<body region="subtitleArea"><div>' +
494
549
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
495
550
  '</div></body></tt>',
496
- {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});
497
554
  });
498
555
 
499
556
  it('allows non-standard namespace names', () => {
@@ -513,7 +570,9 @@ describe('TtmlTextParser', () => {
513
570
  '<body region="subtitleArea"><div>' +
514
571
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
515
572
  '</div></body></tt>',
516
- {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});
517
576
  });
518
577
 
519
578
  it('parses alignment from <style> block with id on region', () => {
@@ -536,7 +595,9 @@ describe('TtmlTextParser', () => {
536
595
  '<body region="subtitleArea"><div>' +
537
596
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
538
597
  '</div></body></tt>',
539
- {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});
540
601
  });
541
602
 
542
603
  it('parses alignment from <style> block with id on p', () => {
@@ -559,7 +620,9 @@ describe('TtmlTextParser', () => {
559
620
  '<body region="subtitleArea"><div>' +
560
621
  '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
561
622
  '</div></body></tt>',
562
- {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});
563
626
  });
564
627
 
565
628
  it('supports region settings for horizontal text', () => {
@@ -569,13 +632,6 @@ describe('TtmlTextParser', () => {
569
632
  startTime: 62.05,
570
633
  endTime: 3723.2,
571
634
  payload: 'Test',
572
- region: {
573
- id: 'subtitleArea',
574
- viewportAnchorX: 50,
575
- viewportAnchorY: 16,
576
- width: 100,
577
- height: 100,
578
- },
579
635
  },
580
636
  ],
581
637
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -585,7 +641,18 @@ describe('TtmlTextParser', () => {
585
641
  '<body region="subtitleArea"><div>' +
586
642
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
587
643
  '</div></body></tt>',
588
- {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});
589
656
 
590
657
  verifyHelper(
591
658
  [
@@ -593,12 +660,6 @@ describe('TtmlTextParser', () => {
593
660
  startTime: 62.05,
594
661
  endTime: 3723.2,
595
662
  payload: 'Test',
596
- region: {
597
- viewportAnchorX: 50,
598
- viewportAnchorY: 16,
599
- width: 100,
600
- height: 100,
601
- },
602
663
  },
603
664
  ],
604
665
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -609,7 +670,17 @@ describe('TtmlTextParser', () => {
609
670
  '<body region="subtitleArea"><div>' +
610
671
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
611
672
  '</div></body></tt>',
612
- {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});
613
684
 
614
685
  verifyHelper(
615
686
  [
@@ -617,12 +688,6 @@ describe('TtmlTextParser', () => {
617
688
  startTime: 62.05,
618
689
  endTime: 3723.2,
619
690
  payload: 'Test',
620
- region: {
621
- viewportAnchorX: 50,
622
- viewportAnchorY: 16,
623
- width: 100,
624
- height: 100,
625
- },
626
691
  },
627
692
  ],
628
693
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -633,7 +698,17 @@ describe('TtmlTextParser', () => {
633
698
  '<body region="subtitleArea"><div>' +
634
699
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
635
700
  '</div></body></tt>',
636
- {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});
637
712
  });
638
713
 
639
714
  it('supports region settings in pixels (origin)', () => {
@@ -643,19 +718,6 @@ describe('TtmlTextParser', () => {
643
718
  startTime: 62.05,
644
719
  endTime: 3723.2,
645
720
  payload: 'Test',
646
- region: {
647
- id: 'subtitleArea',
648
- viewportAnchorX: 50,
649
- viewportAnchorY: 16,
650
- regionAnchorX: 0,
651
- regionAnchorY: 0,
652
- width: 100,
653
- height: 100,
654
- heightUnits: CueRegion.units.PERCENTAGE,
655
- widthUnits: CueRegion.units.PERCENTAGE,
656
- viewportAnchorUnits: CueRegion.units.PX,
657
- scroll: CueRegion.scrollMode.NONE,
658
- },
659
721
  },
660
722
  ],
661
723
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -665,7 +727,24 @@ describe('TtmlTextParser', () => {
665
727
  '<body region="subtitleArea"><div>' +
666
728
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
667
729
  '</div></body></tt>',
668
- {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});
669
748
  });
670
749
 
671
750
  it('supports region settings in pixels (extent)', () => {
@@ -675,19 +754,6 @@ describe('TtmlTextParser', () => {
675
754
  startTime: 62.05,
676
755
  endTime: 3723.2,
677
756
  payload: 'Test',
678
- region: {
679
- id: 'subtitleArea',
680
- viewportAnchorX: 0,
681
- viewportAnchorY: 0,
682
- regionAnchorX: 0,
683
- regionAnchorY: 0,
684
- width: 50,
685
- height: 16,
686
- heightUnits: CueRegion.units.PX,
687
- widthUnits: CueRegion.units.PX,
688
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
689
- scroll: CueRegion.scrollMode.NONE,
690
- },
691
757
  },
692
758
  ],
693
759
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -697,7 +763,24 @@ describe('TtmlTextParser', () => {
697
763
  '<body region="subtitleArea"><div>' +
698
764
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
699
765
  '</div></body></tt>',
700
- {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});
701
784
  });
702
785
 
703
786
  it('supports region settings in pixels: origin (with global extent)', () => {
@@ -707,19 +790,6 @@ describe('TtmlTextParser', () => {
707
790
  startTime: 62.05,
708
791
  endTime: 3723.2,
709
792
  payload: 'Test',
710
- region: {
711
- id: 'subtitleArea',
712
- viewportAnchorX: 10,
713
- viewportAnchorY: 10,
714
- regionAnchorX: 0,
715
- regionAnchorY: 0,
716
- width: 100,
717
- height: 100,
718
- heightUnits: CueRegion.units.PERCENTAGE,
719
- widthUnits: CueRegion.units.PERCENTAGE,
720
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
721
- scroll: CueRegion.scrollMode.NONE,
722
- },
723
793
  },
724
794
  ],
725
795
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
@@ -729,7 +799,24 @@ describe('TtmlTextParser', () => {
729
799
  '<body region="subtitleArea"><div>' +
730
800
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
731
801
  '</div></body></tt>',
732
- {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});
733
820
  });
734
821
 
735
822
  it('supports region settings in pixels: extent (with global extent)', () => {
@@ -739,19 +826,6 @@ describe('TtmlTextParser', () => {
739
826
  startTime: 62.05,
740
827
  endTime: 3723.2,
741
828
  payload: 'Test',
742
- region: {
743
- id: 'subtitleArea',
744
- viewportAnchorX: 0,
745
- viewportAnchorY: 0,
746
- regionAnchorX: 0,
747
- regionAnchorY: 0,
748
- width: 30,
749
- height: 30,
750
- heightUnits: CueRegion.units.PERCENTAGE,
751
- widthUnits: CueRegion.units.PERCENTAGE,
752
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
753
- scroll: CueRegion.scrollMode.NONE,
754
- },
755
829
  },
756
830
  ],
757
831
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
@@ -762,7 +836,24 @@ describe('TtmlTextParser', () => {
762
836
  '<body region="subtitleArea"><div>' +
763
837
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
764
838
  '</div></body></tt>',
765
- {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});
766
857
  });
767
858
 
768
859
  it('supports region settings in percentage (origin)', () => {
@@ -772,29 +863,34 @@ describe('TtmlTextParser', () => {
772
863
  startTime: 62.05,
773
864
  endTime: 3723.2,
774
865
  payload: 'Test',
775
- region: {
776
- id: 'subtitleArea',
777
- viewportAnchorX: 50,
778
- viewportAnchorY: 16,
779
- regionAnchorX: 0,
780
- regionAnchorY: 0,
781
- width: 100,
782
- height: 100,
783
- heightUnits: CueRegion.units.PERCENTAGE,
784
- widthUnits: CueRegion.units.PERCENTAGE,
785
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
786
- scroll: CueRegion.scrollMode.NONE,
787
- },
788
866
  },
789
867
  ],
790
- '<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">' +
791
870
  '<layout>' +
792
871
  '<region xml:id="subtitleArea" tts:origin="50% 16%"/>' +
793
872
  '</layout>' +
794
873
  '<body region="subtitleArea"><div>' +
795
874
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
796
875
  '</div></body></tt>',
797
- {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});
798
894
  });
799
895
 
800
896
  it('supports region settings in percentage (extent)', () => {
@@ -804,22 +900,10 @@ describe('TtmlTextParser', () => {
804
900
  startTime: 62.05,
805
901
  endTime: 3723.2,
806
902
  payload: 'Test',
807
- region: {
808
- id: 'subtitleArea',
809
- viewportAnchorX: 0,
810
- viewportAnchorY: 0,
811
- regionAnchorX: 0,
812
- regionAnchorY: 0,
813
- width: 50,
814
- height: 16,
815
- heightUnits: CueRegion.units.PERCENTAGE,
816
- widthUnits: CueRegion.units.PERCENTAGE,
817
- viewportAnchorUnits: CueRegion.units.PERCENTAGE,
818
- scroll: CueRegion.scrollMode.NONE,
819
- },
820
903
  },
821
904
  ],
822
- '<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">' +
823
907
  '<layout>' +
824
908
  '<region xml:id="subtitleArea" tts:extent="50% 16%" ' +
825
909
  'tts:writingMode="lrtb" />' +
@@ -827,7 +911,24 @@ describe('TtmlTextParser', () => {
827
911
  '<body region="subtitleArea"><div>' +
828
912
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
829
913
  '</div></body></tt>',
830
- {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});
831
932
  });
832
933
 
833
934
  it('supports region settings for vertical text', () => {
@@ -837,13 +938,6 @@ describe('TtmlTextParser', () => {
837
938
  startTime: 62.05,
838
939
  endTime: 3723.2,
839
940
  payload: 'Test',
840
- region: {
841
- id: 'subtitleArea',
842
- viewportAnchorX: 50,
843
- viewportAnchorY: 16,
844
- width: 100,
845
- height: 100,
846
- },
847
941
  },
848
942
  ],
849
943
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -854,7 +948,18 @@ describe('TtmlTextParser', () => {
854
948
  '<body region="subtitleArea"><div>' +
855
949
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
856
950
  '</div></body></tt>',
857
- {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});
858
963
 
859
964
  verifyHelper(
860
965
  [
@@ -862,12 +967,6 @@ describe('TtmlTextParser', () => {
862
967
  startTime: 62.05,
863
968
  endTime: 3723.2,
864
969
  payload: 'Test',
865
- region: {
866
- viewportAnchorX: 50,
867
- viewportAnchorY: 16,
868
- width: 100,
869
- height: 100,
870
- },
871
970
  },
872
971
  ],
873
972
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -878,7 +977,17 @@ describe('TtmlTextParser', () => {
878
977
  '<body region="subtitleArea"><div>' +
879
978
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
880
979
  '</div></body></tt>',
881
- {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});
882
991
 
883
992
  verifyHelper(
884
993
  [
@@ -886,12 +995,6 @@ describe('TtmlTextParser', () => {
886
995
  startTime: 62.05,
887
996
  endTime: 3723.2,
888
997
  payload: 'Test',
889
- region: {
890
- viewportAnchorX: 50,
891
- viewportAnchorY: 16,
892
- width: 100,
893
- height: 100,
894
- },
895
998
  },
896
999
  ],
897
1000
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -902,7 +1005,17 @@ describe('TtmlTextParser', () => {
902
1005
  '<body region="subtitleArea"><div>' +
903
1006
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
904
1007
  '</div></body></tt>',
905
- {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});
906
1019
  });
907
1020
 
908
1021
  it('supports percentages containing decimals', () => {
@@ -912,13 +1025,6 @@ describe('TtmlTextParser', () => {
912
1025
  startTime: 62.05,
913
1026
  endTime: 3723.2,
914
1027
  payload: 'Test',
915
- region: {
916
- id: 'subtitleArea',
917
- viewportAnchorX: 12.2,
918
- viewportAnchorY: 50.005,
919
- width: 100,
920
- height: 100,
921
- },
922
1028
  },
923
1029
  ],
924
1030
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -929,7 +1035,18 @@ describe('TtmlTextParser', () => {
929
1035
  '<body region="subtitleArea"><div>' +
930
1036
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
931
1037
  '</div></body></tt>',
932
- {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});
933
1050
  });
934
1051
 
935
1052
  it('supports writingMode setting', () => {
@@ -950,7 +1067,9 @@ describe('TtmlTextParser', () => {
950
1067
  '<body region="subtitleArea"><div>' +
951
1068
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
952
1069
  '</div></body></tt>',
953
- {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});
954
1073
 
955
1074
  verifyHelper(
956
1075
  [
@@ -969,7 +1088,9 @@ describe('TtmlTextParser', () => {
969
1088
  '<body region="subtitleArea"><div>' +
970
1089
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
971
1090
  '</div></body></tt>',
972
- {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});
973
1094
 
974
1095
  verifyHelper(
975
1096
  [
@@ -988,7 +1109,9 @@ describe('TtmlTextParser', () => {
988
1109
  '<body region="subtitleArea"><div>' +
989
1110
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
990
1111
  '</div></body></tt>',
991
- {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});
992
1115
 
993
1116
  verifyHelper(
994
1117
  [
@@ -1007,7 +1130,9 @@ describe('TtmlTextParser', () => {
1007
1130
  '<body region="subtitleArea"><div>' +
1008
1131
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1009
1132
  '</div></body></tt>',
1010
- {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});
1011
1136
 
1012
1137
  verifyHelper(
1013
1138
  [
@@ -1026,7 +1151,9 @@ describe('TtmlTextParser', () => {
1026
1151
  '<body region="subtitleArea"><div>' +
1027
1152
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1028
1153
  '</div></body></tt>',
1029
- {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});
1030
1157
  });
1031
1158
 
1032
1159
  it('disregards empty divs and ps', () => {
@@ -1042,7 +1169,8 @@ describe('TtmlTextParser', () => {
1042
1169
  '<div></div>' +
1043
1170
  '</body>' +
1044
1171
  '</tt>',
1045
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1172
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1173
+ {startTime: 62.05, endTime: 3723.2});
1046
1174
 
1047
1175
  verifyHelper(
1048
1176
  [
@@ -1056,7 +1184,8 @@ describe('TtmlTextParser', () => {
1056
1184
  '</div>' +
1057
1185
  '</body>' +
1058
1186
  '</tt>',
1059
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1187
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1188
+ {startTime: 62.05, endTime: 3723.2});
1060
1189
 
1061
1190
  verifyHelper(
1062
1191
  [],
@@ -1068,7 +1197,8 @@ describe('TtmlTextParser', () => {
1068
1197
  '<div></div>' +
1069
1198
  '</body>' +
1070
1199
  '</tt>',
1071
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1200
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1201
+ {});
1072
1202
  });
1073
1203
 
1074
1204
  it('should let empty paragraphs with begin or end attributes through', () => {
@@ -1084,7 +1214,8 @@ describe('TtmlTextParser', () => {
1084
1214
  '</div>' +
1085
1215
  '</body>' +
1086
1216
  '</tt>',
1087
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1217
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1218
+ {startTime: 62.05, endTime: 3723.2});
1088
1219
  });
1089
1220
 
1090
1221
  it('supports smpte:backgroundImage attribute', () => {
@@ -1094,7 +1225,6 @@ describe('TtmlTextParser', () => {
1094
1225
  startTime: 62.05,
1095
1226
  endTime: 3723.2,
1096
1227
  payload: '',
1097
- backgroundImage: 'data:image/png;base64,base64EncodedImage',
1098
1228
  },
1099
1229
  ],
1100
1230
  '<tt ' +
@@ -1107,19 +1237,19 @@ describe('TtmlTextParser', () => {
1107
1237
  '<body><div smpte:backgroundImage="#img_0">' +
1108
1238
  '<p begin="01:02.05" end="01:02:03.200"></p>' +
1109
1239
  '</div></body></tt>',
1110
- {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
+ });
1111
1248
  });
1112
1249
 
1113
1250
  it('supports smpte:backgroundImage attribute in div element', () => {
1114
1251
  verifyHelper(
1115
- [
1116
- {
1117
- startTime: 0,
1118
- endTime: 62.05,
1119
- payload: '',
1120
- backgroundImage: 'data:image/png;base64,base64EncodedImage',
1121
- },
1122
- ],
1252
+ [],
1123
1253
  '<tt ' +
1124
1254
  'xmlns:ttm="http://www.w3.org/ns/ttml#metadata" ' +
1125
1255
  'xmlns:smpte="http://www.smpte-ra.org/schemas/2052-1/2010/smpte-tt">' +
@@ -1130,7 +1260,14 @@ describe('TtmlTextParser', () => {
1130
1260
  '<body><div begin="00:00.00" end="01:02.05" '+
1131
1261
  'smpte:backgroundImage="#img_0"></div>' +
1132
1262
  '</body></tt>',
1133
- {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
+ });
1134
1271
  });
1135
1272
 
1136
1273
  it('supports smpte:backgroundImage attribute alt namespace', () => {
@@ -1154,7 +1291,8 @@ describe('TtmlTextParser', () => {
1154
1291
  '<p begin="01:02.05" end="01:02:03.200" ' +
1155
1292
  'smpte:backgroundImage="#img_0" />' +
1156
1293
  '</div></body></tt>',
1157
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1294
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1295
+ {startTime: 62.05, endTime: 3723.2});
1158
1296
  });
1159
1297
 
1160
1298
  it('inserts line breaks for <br> tags', () => {
@@ -1182,7 +1320,8 @@ describe('TtmlTextParser', () => {
1182
1320
  '<tt><body><div>' +
1183
1321
  '<p begin="01:02.05" end="01:02:03.200">Line1<br/>Line2</p>' +
1184
1322
  '</div></body></tt>',
1185
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1323
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1324
+ {startTime: 62.05, endTime: 3723.2});
1186
1325
 
1187
1326
  verifyHelper(
1188
1327
  [{
@@ -1215,7 +1354,36 @@ describe('TtmlTextParser', () => {
1215
1354
  '<span>Line1<br/>Line2</span>' +
1216
1355
  '</p>' +
1217
1356
  '</div></body></tt>',
1218
- {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});
1219
1387
  });
1220
1388
 
1221
1389
  it('parses cue alignment from textAlign attribute', () => {
@@ -1240,7 +1408,9 @@ describe('TtmlTextParser', () => {
1240
1408
  '<body region="subtitleArea"><div>' +
1241
1409
  '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
1242
1410
  '</div></body></tt>',
1243
- {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});
1244
1414
  });
1245
1415
 
1246
1416
  it('parses text style information', () => {
@@ -1257,6 +1427,8 @@ describe('TtmlTextParser', () => {
1257
1427
  fontStyle: Cue.fontStyle.ITALIC,
1258
1428
  lineHeight: '20px',
1259
1429
  fontSize: '10em',
1430
+ textStrokeColor: 'blue',
1431
+ textStrokeWidth: '3px',
1260
1432
  },
1261
1433
  {
1262
1434
  startTime: 2,
@@ -1268,6 +1440,7 @@ describe('TtmlTextParser', () => {
1268
1440
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1269
1441
  '<styling>' +
1270
1442
  '<style xml:id="s1" tts:color="red" ' +
1443
+ 'tts:textOutline="blue 3px" ' +
1271
1444
  'tts:backgroundColor="blue" ' +
1272
1445
  'tts:fontWeight="bold" ' +
1273
1446
  'tts:fontFamily="Times New Roman" ' +
@@ -1283,7 +1456,55 @@ describe('TtmlTextParser', () => {
1283
1456
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1284
1457
  '<p begin="00:02.00" end="00:04.00" style="s2">Test 2</p>' +
1285
1458
  '</div></body></tt>',
1286
- {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});
1287
1508
  });
1288
1509
 
1289
1510
  // Regression test for #2623
@@ -1319,7 +1540,8 @@ describe('TtmlTextParser', () => {
1319
1540
  '<span style="s1">Test</span>' +
1320
1541
  '</p>' +
1321
1542
  '</div></body></tt>',
1322
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1543
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1544
+ {startTime: 1, endTime: 2});
1323
1545
  });
1324
1546
 
1325
1547
  it('parses wrapping option', () => {
@@ -1342,7 +1564,9 @@ describe('TtmlTextParser', () => {
1342
1564
  '<body region="subtitleArea"><div>' +
1343
1565
  '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
1344
1566
  '</div></body></tt>',
1345
- {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});
1346
1570
  });
1347
1571
 
1348
1572
  it('parses text decoration', () => {
@@ -1368,7 +1592,9 @@ describe('TtmlTextParser', () => {
1368
1592
  '<body region="subtitleArea"><div>' +
1369
1593
  '<p begin="01:02.05" end="01:02:03.200" style="s2">Test</p>' +
1370
1594
  '</div></body></tt>',
1371
- {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});
1372
1598
  });
1373
1599
 
1374
1600
  it('cues should have default cellResolution', () => {
@@ -1391,7 +1617,8 @@ describe('TtmlTextParser', () => {
1391
1617
  '<body><div>' +
1392
1618
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1393
1619
  '</div></body></tt>',
1394
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1620
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1621
+ {startTime: 1, endTime: 2});
1395
1622
  });
1396
1623
 
1397
1624
  it('parses cellResolution', () => {
@@ -1418,7 +1645,8 @@ describe('TtmlTextParser', () => {
1418
1645
  '<body><div>' +
1419
1646
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1420
1647
  '</div></body></tt>',
1421
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1648
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1649
+ {startTime: 1, endTime: 2});
1422
1650
  });
1423
1651
 
1424
1652
  it('parses line padding', () => {
@@ -1446,7 +1674,8 @@ describe('TtmlTextParser', () => {
1446
1674
  '<body><div>' +
1447
1675
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1448
1676
  '</div></body></tt>',
1449
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1677
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1678
+ {startTime: 1, endTime: 2});
1450
1679
  });
1451
1680
 
1452
1681
  it('chooses style on element over style on region', () => {
@@ -1470,7 +1699,9 @@ describe('TtmlTextParser', () => {
1470
1699
  '<body region="subtitleArea"><div>' +
1471
1700
  '<p begin="01:02.05" end="01:02:03.200" style="s2">Test</p>' +
1472
1701
  '</div></body></tt>',
1473
- {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});
1474
1705
  });
1475
1706
 
1476
1707
  it('can parse multiple cues', () => {
@@ -1483,7 +1714,8 @@ describe('TtmlTextParser', () => {
1483
1714
  '<p begin="00:01.00" end="00:02.00">First cue</p>' +
1484
1715
  '<p begin="00:03.00" end="00:04.00">Second cue</p>' +
1485
1716
  '</div></body></tt>',
1486
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1717
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1718
+ {startTime: 1, endTime: 4});
1487
1719
  });
1488
1720
 
1489
1721
  // Regression test for https://github.com/google/shaka-player/issues/2478
@@ -1506,7 +1738,8 @@ describe('TtmlTextParser', () => {
1506
1738
  '<tt><body><div>' +
1507
1739
  '<p begin="01:02.05" end="01:02:03.200"><span>äöü</span></p>' +
1508
1740
  '</div></body></tt>',
1509
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1741
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1742
+ {startTime: 62.05, endTime: 3723.2});
1510
1743
  });
1511
1744
 
1512
1745
  it('supports timing on multiple levels', () => {
@@ -1522,7 +1755,9 @@ describe('TtmlTextParser', () => {
1522
1755
  '<p begin="3s" end="4s">First cue</p>' +
1523
1756
  '<p begin="4s" end="5s">Second cue</p>' +
1524
1757
  '</div></body></tt>',
1525
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1758
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1759
+ {startTime: 1, endTime: Infinity},
1760
+ {startTime: 3, endTime: Infinity});
1526
1761
 
1527
1762
  verifyHelper(
1528
1763
  [{
@@ -1545,7 +1780,9 @@ describe('TtmlTextParser', () => {
1545
1780
  '<span begin="5s" end="6s">Second cue</span>' +
1546
1781
  '</p>' +
1547
1782
  '</div></body></tt>',
1548
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1783
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1784
+ {startTime: 1, endTime: Infinity},
1785
+ {startTime: 3, endTime: Infinity});
1549
1786
  });
1550
1787
 
1551
1788
  it('gets end time from parent directly if missing', () => {
@@ -1559,7 +1796,9 @@ describe('TtmlTextParser', () => {
1559
1796
  '<p begin="3s" end="4s">First cue</p>' +
1560
1797
  '<p begin="4s">Second cue</p>' +
1561
1798
  '</div></body></tt>',
1562
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1799
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1800
+ {startTime: 1, endTime: 30},
1801
+ {startTime: 3, endTime: 30});
1563
1802
  });
1564
1803
 
1565
1804
  it('supports never-ending cues', () => {
@@ -1572,7 +1811,8 @@ describe('TtmlTextParser', () => {
1572
1811
  '<p begin="1s">First cue</p>' +
1573
1812
  '<p begin="2s">Second cue</p>' +
1574
1813
  '</div></body></tt>',
1575
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1814
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1815
+ {startTime: 1, endTime: Infinity});
1576
1816
  });
1577
1817
 
1578
1818
  // Regression test for b/159050711
@@ -1588,8 +1828,8 @@ describe('TtmlTextParser', () => {
1588
1828
  // Styles from regionStyle should apply only to the nested cue.
1589
1829
  backgroundColor: '',
1590
1830
  color: '',
1591
- displayAlign: Cue.displayAlign.AFTER, // displayAlign default value.
1592
- textAlign: Cue.textAlign.START, // textAlign default value.
1831
+ displayAlign: Cue.displayAlign.CENTER,
1832
+ textAlign: Cue.textAlign.CENTER,
1593
1833
 
1594
1834
  nestedCues: [
1595
1835
  {
@@ -1614,7 +1854,7 @@ describe('TtmlTextParser', () => {
1614
1854
  // Styles inherited from backgroundStyle via regionStyle via
1615
1855
  // spanStyle
1616
1856
  displayAlign: Cue.displayAlign.CENTER,
1617
- textAlign: Cue.textAlign.CENTER,
1857
+ textAlign: Cue.textAlign.END,
1618
1858
  },
1619
1859
  ],
1620
1860
  },
@@ -1628,7 +1868,7 @@ describe('TtmlTextParser', () => {
1628
1868
  // spanStyle inherits attributes from regionStyle
1629
1869
  ' <style xml:id="pStyle" tts:fontSize="15px" />' +
1630
1870
  ' <style xml:id="spanStyle" style="regionStyle" ' +
1631
- ' tts:backgroundColor="white" />' +
1871
+ ' tts:backgroundColor="white" tts:textAlign="end" />' +
1632
1872
  // regionStyle inherits attributes from backgroundStyle
1633
1873
  ' <style xml:id="regionStyle" style="backgroundStyle" ' +
1634
1874
  ' tts:backgroundColor="transparent" tts:color="blue" />' +
@@ -1643,32 +1883,117 @@ describe('TtmlTextParser', () => {
1643
1883
  ' <span style="spanStyle">Test with spanStyle</span>' +
1644
1884
  ' </p>' +
1645
1885
  '</div></body></tt>',
1646
- {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});
1647
1982
  });
1648
1983
 
1649
1984
  /**
1650
1985
  * @param {!Array} cues
1651
1986
  * @param {string} text
1652
1987
  * @param {shaka.extern.TextParser.TimeContext} time
1988
+ * @param {!Object} bodyProperties
1989
+ * @param {Object=} divProperties
1653
1990
  */
1654
- function verifyHelper(cues, text, time) {
1991
+ function verifyHelper(cues, text, time, bodyProperties, divProperties) {
1655
1992
  const data =
1656
1993
  shaka.util.BufferUtils.toUint8(shaka.util.StringUtils.toUTF8(text));
1657
1994
  const result = new shaka.text.TtmlTextParser().parseMedia(data, time);
1658
-
1659
- const mapExpected = (cue) => {
1660
- if (cue.region) {
1661
- cue.region = jasmine.objectContaining(cue.region);
1662
- }
1663
-
1664
- if (cue.nestedCues) {
1665
- cue.nestedCues = cue.nestedCues.map(mapExpected);
1666
- }
1667
-
1668
- return jasmine.objectContaining(cue);
1669
- };
1670
- const expected = cues.map(mapExpected);
1671
- expect(result).toEqual(expected);
1995
+ shaka.test.TtmlUtils.verifyHelper(
1996
+ cues, result, bodyProperties, divProperties);
1672
1997
  }
1673
1998
 
1674
1999