shaka-player 3.2.2 → 3.2.5

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 (331) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/workflows/build-and-test.yaml +130 -0
  4. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  5. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  6. package/.github/workflows/demo-version-index.yaml +29 -0
  7. package/.github/workflows/nightly-demo.yaml +42 -0
  8. package/.github/workflows/release-please.yaml +145 -0
  9. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  10. package/.github/workflows/selenium-lab-tests.yaml +93 -0
  11. package/AUTHORS +2 -0
  12. package/CHANGELOG.md +1598 -1525
  13. package/CONTRIBUTING.md +2 -2
  14. package/CONTRIBUTORS +2 -0
  15. package/README.md +7 -7
  16. package/app-engine/README.md +9 -0
  17. package/app-engine/demo-version-index/README.md +14 -0
  18. package/app-engine/demo-version-index/app.yaml +2 -0
  19. package/app-engine/demo-version-index/main.py +162 -0
  20. package/app-engine/demo-version-index/requirements.txt +6 -0
  21. package/app-engine/demo-version-index/templates/index.html +114 -0
  22. package/app-engine/shaka-player-demo/README.md +18 -0
  23. package/app-engine/shaka-player-demo/app.yaml +61 -0
  24. package/app-engine/shaka-player-demo/main.py +95 -0
  25. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  26. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  27. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  28. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  29. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  30. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  31. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  32. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  33. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  34. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  35. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  36. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  37. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  38. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  39. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  40. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  41. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  42. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  43. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  44. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  45. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  46. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  47. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  48. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  49. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  50. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  51. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  52. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  53. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  54. package/app-engine/shaka-player-demo/posters.py +110 -0
  55. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  56. package/app-engine/shaka-player-demo/time.txt +1 -0
  57. package/build/README.md +1 -1
  58. package/build/checkversion.py +1 -1
  59. package/build/conformance.textproto +13 -0
  60. package/build/docker/Dockerfile +20 -0
  61. package/build/docker/docker-compose.yml +10 -0
  62. package/build/gendeps.py +18 -15
  63. package/build/shaka-lab.yaml +163 -0
  64. package/build/shakaBuildHelpers.py +4 -29
  65. package/build/test.py +93 -28
  66. package/build/wrapper.template.js +2 -2
  67. package/demo/TengwarTelcontar.woff2 +0 -0
  68. package/demo/asset_card.js +1 -2
  69. package/demo/cast_receiver/index.html +1 -1
  70. package/demo/cast_receiver/receiver_app.css +14 -14
  71. package/demo/common/assets.js +2 -0
  72. package/demo/config.js +0 -1
  73. package/demo/custom.js +0 -1
  74. package/demo/customWarning.txt +2 -2
  75. package/demo/demo.less +29 -18
  76. package/demo/demo_uncompiled.js +1 -13
  77. package/demo/index.html +1 -1
  78. package/demo/main.js +3 -3
  79. package/dist/controls.css +2 -2
  80. package/dist/controls.css.map +1 -1
  81. package/dist/demo.compiled.debug.js +191 -194
  82. package/dist/demo.compiled.debug.map +4 -4
  83. package/dist/demo.compiled.js +191 -194
  84. package/dist/demo.compiled.map +4 -4
  85. package/dist/demo.css +1 -1
  86. package/dist/demo.css.map +1 -1
  87. package/dist/deps.js +225 -219
  88. package/dist/locales.js +31 -31
  89. package/dist/receiver.compiled.debug.js +43 -45
  90. package/dist/receiver.compiled.debug.map +4 -4
  91. package/dist/receiver.compiled.js +43 -45
  92. package/dist/receiver.compiled.map +4 -4
  93. package/dist/shaka-player.compiled.d.ts +247 -227
  94. package/dist/shaka-player.compiled.debug.d.ts +247 -227
  95. package/dist/shaka-player.compiled.debug.externs.js +43 -16
  96. package/dist/shaka-player.compiled.debug.js +384 -388
  97. package/dist/shaka-player.compiled.debug.map +4 -4
  98. package/dist/shaka-player.compiled.externs.js +43 -16
  99. package/dist/shaka-player.compiled.js +818 -817
  100. package/dist/shaka-player.compiled.map +4 -4
  101. package/dist/shaka-player.ui.d.ts +291 -280
  102. package/dist/shaka-player.ui.debug.d.ts +291 -280
  103. package/dist/shaka-player.ui.debug.externs.js +45 -27
  104. package/dist/shaka-player.ui.debug.js +389 -394
  105. package/dist/shaka-player.ui.debug.map +4 -4
  106. package/dist/shaka-player.ui.externs.js +45 -27
  107. package/dist/shaka-player.ui.js +964 -965
  108. package/dist/shaka-player.ui.map +4 -4
  109. package/docs/design/REDESIGN.md +33 -33
  110. package/docs/design/codec_preferences.md +1 -1
  111. package/docs/design/dash-audio-channels.md +3 -3
  112. package/docs/design/dash-manifests.md +1 -1
  113. package/docs/design/gap-jumping.md +3 -3
  114. package/docs/design/preload.md +2 -2
  115. package/docs/tutorials/faq.md +8 -8
  116. package/docs/tutorials/index.json +1 -0
  117. package/docs/tutorials/plugins.md +3 -3
  118. package/docs/tutorials/selenium-grid-config.md +122 -0
  119. package/docs/tutorials/welcome.md +10 -2
  120. package/externs/shaka/player.js +8 -0
  121. package/externs/shaka/text.js +10 -0
  122. package/karma.conf.js +156 -45
  123. package/lib/abr/simple_abr_manager.js +12 -6
  124. package/lib/ads/ad_manager.js +1 -0
  125. package/lib/cast/cast_proxy.js +6 -4
  126. package/lib/cast/cast_receiver.js +3 -0
  127. package/lib/cea/cea608_data_channel.js +2 -2
  128. package/lib/cea/cea708_service.js +5 -4
  129. package/lib/cea/mp4_cea_parser.js +11 -5
  130. package/lib/cea/sei_processor.js +6 -3
  131. package/lib/dash/dash_parser.js +43 -31
  132. package/lib/dash/mpd_utils.js +4 -5
  133. package/lib/dash/segment_list.js +1 -2
  134. package/lib/dash/segment_template.js +3 -3
  135. package/lib/hls/hls_parser.js +41 -9
  136. package/lib/hls/manifest_text_parser.js +4 -3
  137. package/lib/media/adaptation_set.js +1 -2
  138. package/lib/media/content_workarounds.js +2 -2
  139. package/lib/media/drm_engine.js +3 -2
  140. package/lib/media/media_source_engine.js +3 -2
  141. package/lib/media/mp4_segment_index_parser.js +1 -4
  142. package/lib/media/playhead.js +2 -2
  143. package/lib/media/presentation_timeline.js +18 -8
  144. package/lib/media/region_observer.js +39 -33
  145. package/lib/media/region_timeline.js +17 -19
  146. package/lib/media/segment_index.js +2 -1
  147. package/lib/media/segment_reference.js +19 -1
  148. package/lib/media/streaming_engine.js +12 -9
  149. package/lib/media/time_ranges_utils.js +1 -3
  150. package/lib/media/video_wrapper.js +1 -1
  151. package/lib/net/networking_engine.js +5 -1
  152. package/lib/offline/storage.js +12 -13
  153. package/lib/player.js +77 -36
  154. package/lib/polyfill/all.js +2 -3
  155. package/lib/polyfill/encryption_scheme.js +1 -1
  156. package/lib/polyfill/media_capabilities.js +32 -17
  157. package/lib/polyfill/mediasource.js +1 -1
  158. package/lib/text/cue.js +7 -1
  159. package/lib/text/simple_text_displayer.js +2 -1
  160. package/lib/text/ttml_text_parser.js +92 -63
  161. package/lib/text/ui_text_displayer.js +18 -12
  162. package/lib/util/buffer_utils.js +1 -3
  163. package/lib/util/ebml_parser.js +3 -3
  164. package/lib/util/error.js +1 -1
  165. package/lib/util/fake_event_target.js +21 -1
  166. package/lib/util/iterables.js +0 -46
  167. package/lib/util/mp4_box_parsers.js +1 -4
  168. package/lib/util/mp4_parser.js +5 -7
  169. package/lib/util/periods.js +8 -9
  170. package/lib/util/platform.js +3 -3
  171. package/lib/util/pssh.js +1 -4
  172. package/lib/util/stream_utils.js +88 -11
  173. package/lib/util/string_utils.js +3 -5
  174. package/lib/util/uint8array_utils.js +3 -5
  175. package/lib/util/xml_utils.js +34 -7
  176. package/package.json +62 -40
  177. package/roadmap.md +17 -17
  178. package/test/abr/simple_abr_manager_unit.js +3 -8
  179. package/test/ads/ad_manager_unit.js +0 -6
  180. package/test/cast/cast_proxy_unit.js +0 -8
  181. package/test/cast/cast_receiver_integration.js +1 -18
  182. package/test/cast/cast_receiver_unit.js +1 -9
  183. package/test/cast/cast_sender_unit.js +0 -6
  184. package/test/cast/cast_utils_unit.js +0 -13
  185. package/test/cea/cea608_memory_unit.js +0 -5
  186. package/test/cea/cea708_service_unit.js +0 -7
  187. package/test/cea/cea708_window_unit.js +0 -5
  188. package/test/cea/cea_decoder_unit.js +0 -6
  189. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  190. package/test/cea/dtvcc_packet_unit.js +0 -5
  191. package/test/cea/mp4_cea_parser_unit.js +0 -4
  192. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  193. package/test/dash/dash_parser_live_unit.js +45 -15
  194. package/test/dash/dash_parser_manifest_unit.js +37 -18
  195. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  196. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  197. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  198. package/test/dash/mpd_utils_unit.js +3 -11
  199. package/test/demo/demo_unit.js +0 -5
  200. package/test/deprecate/enforcer_unit.js +0 -4
  201. package/test/deprecate/version_unit.js +0 -2
  202. package/test/hls/hls_live_unit.js +2 -14
  203. package/test/hls/hls_parser_unit.js +76 -15
  204. package/test/hls/manifest_text_parser_unit.js +0 -10
  205. package/test/media/adaptation_set_criteria_unit.js +3 -7
  206. package/test/media/adaptation_set_unit.js +0 -2
  207. package/test/media/buffering_observer_unit.js +1 -4
  208. package/test/media/closed_caption_parser_unit.js +0 -3
  209. package/test/media/drm_engine_integration.js +2 -15
  210. package/test/media/drm_engine_unit.js +7 -27
  211. package/test/media/manifest_parser_unit.js +0 -4
  212. package/test/media/media_source_engine_integration.js +0 -7
  213. package/test/media/media_source_engine_unit.js +1 -14
  214. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  215. package/test/media/play_rate_controller_unit.js +0 -4
  216. package/test/media/playhead_unit.js +8 -16
  217. package/test/media/presentation_timeline_unit.js +4 -7
  218. package/test/media/region_observer_unit.js +40 -10
  219. package/test/media/region_timeline_unit.js +40 -25
  220. package/test/media/segment_index_unit.js +0 -6
  221. package/test/media/segment_reference_unit.js +0 -3
  222. package/test/media/stall_detector_unit.js +0 -5
  223. package/test/media/streaming_engine_integration.js +11 -37
  224. package/test/media/streaming_engine_unit.js +155 -34
  225. package/test/media/time_ranges_utils_unit.js +0 -2
  226. package/test/media/transmuxer_integration.js +0 -6
  227. package/test/media/webm_segment_index_parser_unit.js +0 -4
  228. package/test/net/data_uri_plugin_unit.js +0 -7
  229. package/test/net/http_plugin_unit.js +0 -9
  230. package/test/net/networking_engine_unit.js +0 -11
  231. package/test/offline/download_progress_estimator_unit.js +0 -2
  232. package/test/offline/indexeddb_storage_unit.js +0 -6
  233. package/test/offline/manifest_convert_unit.js +0 -8
  234. package/test/offline/offline_integration.js +1 -10
  235. package/test/offline/offline_manifest_parser_unit.js +0 -6
  236. package/test/offline/offline_scheme_unit.js +0 -8
  237. package/test/offline/offline_uri_unit.js +0 -2
  238. package/test/offline/storage_compatibility_unit.js +1 -14
  239. package/test/offline/storage_integration.js +1 -25
  240. package/test/player_external.js +2 -10
  241. package/test/player_integration.js +62 -36
  242. package/test/player_load_graph_integration.js +1 -6
  243. package/test/player_src_equals_external.js +3 -9
  244. package/test/player_src_equals_integration.js +41 -15
  245. package/test/player_unit.js +71 -46
  246. package/test/routing/walker_unit.js +0 -8
  247. package/test/test/assets/chapters.vtt +2 -2
  248. package/test/test/assets/chapters2.vtt +10 -0
  249. package/test/test/assets/large_file.mpd +1 -1
  250. package/test/test/boot.js +75 -22
  251. package/test/test/externs/jasmine.js +2 -2
  252. package/test/test/externs/karma.js +4 -0
  253. package/test/test/namespace.js +10 -0
  254. package/test/test/util/canned_idb.js +0 -8
  255. package/test/test/util/cea_utils.js +0 -6
  256. package/test/test/util/dash_parser_util.js +0 -13
  257. package/test/test/util/fake_ad.js +0 -3
  258. package/test/test/util/fake_ad_manager.js +0 -9
  259. package/test/test/util/fake_demo_main.js +0 -5
  260. package/test/test/util/fake_drm_engine.js +0 -6
  261. package/test/test/util/fake_media_source_engine.js +0 -7
  262. package/test/test/util/fake_networking_engine.js +0 -5
  263. package/test/test/util/fake_text_displayer.js +0 -5
  264. package/test/test/util/indexeddb_utils.js +1 -10
  265. package/test/test/util/jasmine_fetch.js +0 -1
  266. package/test/test/util/loader.js +0 -18
  267. package/test/test/util/manifest_generator.js +9 -14
  268. package/test/test/util/manifest_parser_util.js +0 -6
  269. package/test/test/util/offline_utils.js +0 -5
  270. package/test/test/util/simple_fakes.js +9 -26
  271. package/test/test/util/stream_generator.js +0 -14
  272. package/test/test/util/streaming_engine_util.js +0 -15
  273. package/test/test/util/test_scheme.js +1 -19
  274. package/test/test/util/ttml_utils.js +79 -0
  275. package/test/test/util/ui_utils.js +0 -9
  276. package/test/test/util/util.js +15 -26
  277. package/test/test/util/waiter.js +84 -43
  278. package/test/text/cue_integration.js +0 -4
  279. package/test/text/lrc_text_parser_unit.js +0 -4
  280. package/test/text/mp4_ttml_parser_unit.js +10 -23
  281. package/test/text/mp4_vtt_parser_unit.js +1 -7
  282. package/test/text/sbv_text_parser_unit.js +0 -4
  283. package/test/text/simple_text_displayer_unit.js +1 -8
  284. package/test/text/srt_text_parser_unit.js +0 -4
  285. package/test/text/ssa_text_parser_unit.js +0 -5
  286. package/test/text/text_engine_unit.js +2 -7
  287. package/test/text/text_track_integration.js +0 -2
  288. package/test/text/ttml_text_parser_unit.js +495 -237
  289. package/test/text/ui_text_displayer_unit.js +44 -41
  290. package/test/text/vtt_text_parser_unit.js +0 -9
  291. package/test/text/web_vtt_generator_unit.js +0 -3
  292. package/test/ui/ad_ui_unit.js +0 -11
  293. package/test/ui/localization_unit.js +0 -3
  294. package/test/ui/text_displayer_layout_unit.js +9 -19
  295. package/test/ui/ui_customization_unit.js +0 -6
  296. package/test/ui/ui_integration.js +0 -16
  297. package/test/ui/ui_unit.js +1 -17
  298. package/test/util/abortable_operation_unit.js +4 -9
  299. package/test/util/array_utils_unit.js +0 -2
  300. package/test/util/buffer_utils_unit.js +0 -2
  301. package/test/util/data_view_reader_unit.js +0 -4
  302. package/test/util/ebml_parser_unit.js +0 -4
  303. package/test/util/event_manager_unit.js +0 -3
  304. package/test/util/fake_event_target_unit.js +0 -5
  305. package/test/util/functional_unit.js +1 -1
  306. package/test/util/iterables_unit.js +0 -64
  307. package/test/util/language_utils_unit.js +0 -3
  308. package/test/util/manifest_parser_utils_unit.js +0 -2
  309. package/test/util/mp4_box_parsers_unit.js +0 -5
  310. package/test/util/mp4_parser_unit.js +0 -4
  311. package/test/util/multi_map_unit.js +0 -3
  312. package/test/util/object_utils_unit.js +0 -2
  313. package/test/util/periods_unit.js +14 -7
  314. package/test/util/pssh_unit.js +0 -5
  315. package/test/util/state_history_unit.js +0 -2
  316. package/test/util/stream_utils_unit.js +39 -38
  317. package/test/util/string_utils_unit.js +0 -6
  318. package/test/util/text_parser_unit.js +0 -2
  319. package/test/util/xml_utils_unit.js +0 -4
  320. package/ui/controls.js +3 -0
  321. package/ui/less/ad_controls.less +4 -4
  322. package/ui/less/buttons.less +5 -9
  323. package/ui/less/containers.less +5 -7
  324. package/ui/less/overflow_menu.less +4 -4
  325. package/ui/less/range_elements.less +5 -0
  326. package/ui/locales/sjn-translations.yaml +257 -0
  327. package/ui/locales/sjn.json +42 -0
  328. package/ui/localization.js +12 -36
  329. package/ui/text_selection.js +1 -0
  330. package/externs/media_capabilities.js +0 -16
  331. package/externs/svgelement.js +0 -18
@@ -4,14 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- goog.require('shaka.test.Util');
8
- goog.require('shaka.text.Cue');
9
- goog.require('shaka.text.CueRegion');
10
- goog.require('shaka.text.TtmlTextParser');
11
- goog.require('shaka.util.BufferUtils');
12
- goog.require('shaka.util.Error');
13
- goog.require('shaka.util.StringUtils');
14
-
15
7
  describe('TtmlTextParser', () => {
16
8
  const Cue = shaka.text.Cue;
17
9
  const CueRegion = shaka.text.CueRegion;
@@ -21,20 +13,23 @@ describe('TtmlTextParser', () => {
21
13
  it('supports no cues', () => {
22
14
  verifyHelper([],
23
15
  '<tt></tt>',
24
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
16
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
17
+ {});
25
18
  });
26
19
 
27
20
  it('supports empty text string', () => {
28
21
  verifyHelper([],
29
22
  '',
30
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
23
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
24
+ {});
31
25
  });
32
26
 
33
27
  it('supports div with no cues but whitespace', () => {
34
28
  verifyHelper(
35
29
  [],
36
30
  '<tt><body><div> \r\n </div></body></tt>',
37
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
31
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
32
+ {});
38
33
  });
39
34
 
40
35
  it('supports xml:space', () => {
@@ -60,7 +55,8 @@ describe('TtmlTextParser', () => {
60
55
  },
61
56
  ],
62
57
  '<tt xml:space="default">' + ttBody + '</tt>',
63
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
58
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
59
+ {startTime: 62.03, endTime: 62.05});
64
60
  // When xml:space="preserve", take them into account.
65
61
  verifyHelper(
66
62
  [
@@ -85,7 +81,8 @@ describe('TtmlTextParser', () => {
85
81
  },
86
82
  ],
87
83
  '<tt xml:space="preserve">' + ttBody + '</tt>',
88
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
84
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
85
+ {startTime: 62.03, endTime: 62.05});
89
86
  // The default value for xml:space is "default".
90
87
  verifyHelper(
91
88
  [
@@ -100,7 +97,8 @@ describe('TtmlTextParser', () => {
100
97
  },
101
98
  ],
102
99
  '<tt>' + ttBody + '</tt>',
103
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
100
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
101
+ {startTime: 62.03, endTime: 62.05});
104
102
 
105
103
  // Any other value is rejected as an error.
106
104
  errorHelper(shaka.util.Error.Code.INVALID_XML,
@@ -130,7 +128,8 @@ describe('TtmlTextParser', () => {
130
128
  },
131
129
  ],
132
130
  '<tt>' + ttBody + '</tt>',
133
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
131
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
132
+ {startTime: 62.03, endTime: 62.05});
134
133
  });
135
134
 
136
135
  it('rejects invalid ttml', () => {
@@ -199,7 +198,8 @@ describe('TtmlTextParser', () => {
199
198
  '<span>First cue</span><br /><span>Second cue</span>' +
200
199
  '</p>' +
201
200
  '</div></body></tt>',
202
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
201
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
202
+ {startTime: 62.05, endTime: 3723.2});
203
203
  });
204
204
 
205
205
  it('supports anonymous spans as nestedCues of paragraphs', () => {
@@ -234,7 +234,8 @@ describe('TtmlTextParser', () => {
234
234
  'First cue<br />Second cue' +
235
235
  '</p>' +
236
236
  '</div></body></tt>',
237
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
237
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
238
+ {startTime: 62.05, endTime: 3723.2});
238
239
  });
239
240
 
240
241
  it('supports multiple levels of nestedCues', () => {
@@ -292,7 +293,8 @@ describe('TtmlTextParser', () => {
292
293
  '</span>' +
293
294
  '</p>' +
294
295
  '</div></body></tt>',
295
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
296
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
297
+ {startTime: 62.05, endTime: 3723.2});
296
298
  });
297
299
 
298
300
  it('inherits timing information of nested cues if unprovided', () => {
@@ -307,9 +309,11 @@ describe('TtmlTextParser', () => {
307
309
  },
308
310
  ],
309
311
  '<tt><body>' +
310
- '<div><div begin="01:02.05" end="01:02:03.200">Test</div></div>' +
312
+ '<div><p begin="01:02.05" end="01:02:03.200">' +
313
+ '<span>Test</span></p></div>' +
311
314
  '</body></tt>',
312
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
315
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
316
+ {startTime: 62.05, endTime: 3723.2});
313
317
  });
314
318
 
315
319
  it('does not discard cues with image subcues', () => {
@@ -334,11 +338,12 @@ describe('TtmlTextParser', () => {
334
338
  '<metadata>' +
335
339
  '<smpte:image imageType="PNG" encoding="Base64" xml:id="img_0">' +
336
340
  '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});
341
+ '</metadata><body><div>' +
342
+ '<p><div begin="01:02.05" end="01:02:03.200" ' +
343
+ 'smpte:backgroundImage="#img_0"></div></p>' +
344
+ '</div></body></tt>',
345
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
346
+ {startTime: 62.05, endTime: 3723.2});
342
347
  });
343
348
 
344
349
  it('supports colon formatted time', () => {
@@ -349,7 +354,8 @@ describe('TtmlTextParser', () => {
349
354
  '<tt><body><div>' +
350
355
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
351
356
  '</div></body></tt>',
352
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
357
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
358
+ {startTime: 62.05, endTime: 3723.2});
353
359
  });
354
360
 
355
361
  it('accounts for offset', () => {
@@ -360,7 +366,8 @@ describe('TtmlTextParser', () => {
360
366
  '<tt><body><div>' +
361
367
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
362
368
  '</div></body></tt>',
363
- {periodStart: 7, segmentStart: 0, segmentEnd: 0});
369
+ {periodStart: 7, segmentStart: 0, segmentEnd: 0},
370
+ {startTime: 69.05, endTime: 3730.2});
364
371
  });
365
372
 
366
373
  it('supports nested cues with an offset', () => {
@@ -382,7 +389,8 @@ describe('TtmlTextParser', () => {
382
389
  '<tt><body><div>' +
383
390
  '<p begin="01:02.05" end="01:02:03.200"><span>Nested cue</span></p>' +
384
391
  '</div></body></tt>',
385
- {periodStart: 7, segmentStart: 0, segmentEnd: 0});
392
+ {periodStart: 7, segmentStart: 0, segmentEnd: 0},
393
+ {startTime: 69.05, endTime: 3730.2});
386
394
  });
387
395
 
388
396
  it('supports time in 0.00h 0.00m 0.00s format', () => {
@@ -393,7 +401,8 @@ describe('TtmlTextParser', () => {
393
401
  '<tt><body><div>' +
394
402
  '<p begin="59.45m30ms" end="1.5h2.3s">Test</p>' +
395
403
  '</div></body></tt>',
396
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
404
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
405
+ {startTime: 3567.03, endTime: 5402.3});
397
406
  });
398
407
 
399
408
  it('supports time with frame rate', () => {
@@ -406,7 +415,8 @@ describe('TtmlTextParser', () => {
406
415
  '<body><div>' +
407
416
  '<p begin="00:10:15:15" end="00:11:02:30">Test</p>' +
408
417
  '</div></body></tt>',
409
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
418
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
419
+ {startTime: 615.5, endTime: 663});
410
420
  });
411
421
 
412
422
  it('supports time with frame rate multiplier', () => {
@@ -419,7 +429,8 @@ describe('TtmlTextParser', () => {
419
429
  '<body><div>' +
420
430
  '<p begin="00:10:15:15" end="00:11:02:30">Test</p>' +
421
431
  '</div></body></tt>',
422
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
432
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
433
+ {startTime: 615.5, endTime: 663});
423
434
  });
424
435
 
425
436
  it('supports time with subframes', () => {
@@ -436,7 +447,8 @@ describe('TtmlTextParser', () => {
436
447
  '<body><div>' +
437
448
  '<p begin="00:10:15:15.1" end="00:11:02:29.2">Test</p>' +
438
449
  '</div></body></tt>',
439
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
450
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
451
+ {startTime: Util.closeTo(615.5 + 1 / 60), endTime: 663});
440
452
  });
441
453
 
442
454
  it('supports time in frame format', () => {
@@ -449,7 +461,8 @@ describe('TtmlTextParser', () => {
449
461
  '<body><div>' +
450
462
  '<p begin="75f" end="300.3f">Test</p>' +
451
463
  '</div></body></tt>',
452
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
464
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
465
+ {startTime: 2.5, endTime: Util.closeTo(10.01)});
453
466
  });
454
467
 
455
468
  it('supports time in tick format', () => {
@@ -462,7 +475,8 @@ describe('TtmlTextParser', () => {
462
475
  '<body><div>' +
463
476
  '<p begin="50t" end="60.2t">Test</p>' +
464
477
  '</div></body></tt>',
465
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
478
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
479
+ {startTime: 5, endTime: Util.closeTo(6.02)});
466
480
  });
467
481
 
468
482
  it('supports time with duration', () => {
@@ -473,7 +487,8 @@ describe('TtmlTextParser', () => {
473
487
  '<tt><body><div>' +
474
488
  '<p begin="01:02.05" dur="5s">Test</p>' +
475
489
  '</div></body></tt>',
476
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
490
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
491
+ {startTime: 62.05, endTime: 67.05});
477
492
  });
478
493
 
479
494
  it('supports comments in the body', () => {
@@ -482,7 +497,29 @@ describe('TtmlTextParser', () => {
482
497
  '<tt><body><div>' +
483
498
  '<!-- text-based TTML -->' +
484
499
  '</div></body></tt>',
485
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
500
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
501
+ {});
502
+ });
503
+
504
+ it('does not inherit regions', () => {
505
+ verifyHelper(
506
+ [
507
+ {
508
+ startTime: 62.05,
509
+ endTime: 3723.2,
510
+ payload: 'Test',
511
+ },
512
+ ],
513
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
514
+ '<layout>' +
515
+ '<region xml:id="subtitleArea" />' +
516
+ '</layout>' +
517
+ '<body region="subtitleArea"><div>' +
518
+ '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
519
+ '</div></body></tt>',
520
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
521
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
522
+ {startTime: 62.05, endTime: 3723.2});
486
523
  });
487
524
 
488
525
  it('parses alignment from textAlign attribute of a region', () => {
@@ -502,7 +539,9 @@ describe('TtmlTextParser', () => {
502
539
  '<body region="subtitleArea"><div>' +
503
540
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
504
541
  '</div></body></tt>',
505
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
542
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
543
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
544
+ {startTime: 62.05, endTime: 3723.2});
506
545
  });
507
546
 
508
547
  it('allows non-standard namespace names', () => {
@@ -522,7 +561,9 @@ describe('TtmlTextParser', () => {
522
561
  '<body region="subtitleArea"><div>' +
523
562
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
524
563
  '</div></body></tt>',
525
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
564
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
565
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
566
+ {startTime: 62.05, endTime: 3723.2});
526
567
  });
527
568
 
528
569
  it('parses alignment from <style> block with id on region', () => {
@@ -545,7 +586,9 @@ describe('TtmlTextParser', () => {
545
586
  '<body region="subtitleArea"><div>' +
546
587
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
547
588
  '</div></body></tt>',
548
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
589
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
590
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
591
+ {startTime: 62.05, endTime: 3723.2});
549
592
  });
550
593
 
551
594
  it('parses alignment from <style> block with id on p', () => {
@@ -568,7 +611,9 @@ describe('TtmlTextParser', () => {
568
611
  '<body region="subtitleArea"><div>' +
569
612
  '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
570
613
  '</div></body></tt>',
571
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
614
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
615
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
616
+ {startTime: 62.05, endTime: 3723.2});
572
617
  });
573
618
 
574
619
  it('supports region settings for horizontal text', () => {
@@ -578,13 +623,6 @@ describe('TtmlTextParser', () => {
578
623
  startTime: 62.05,
579
624
  endTime: 3723.2,
580
625
  payload: 'Test',
581
- region: {
582
- id: 'subtitleArea',
583
- viewportAnchorX: 50,
584
- viewportAnchorY: 16,
585
- width: 100,
586
- height: 100,
587
- },
588
626
  },
589
627
  ],
590
628
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -594,7 +632,18 @@ describe('TtmlTextParser', () => {
594
632
  '<body region="subtitleArea"><div>' +
595
633
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
596
634
  '</div></body></tt>',
597
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
635
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
636
+ {
637
+ region: {
638
+ id: 'subtitleArea',
639
+ viewportAnchorX: 50,
640
+ viewportAnchorY: 16,
641
+ width: 100,
642
+ height: 100,
643
+ },
644
+ startTime: 62.05,
645
+ endTime: 3723.2,
646
+ }, {startTime: 62.05, endTime: 3723.2});
598
647
 
599
648
  verifyHelper(
600
649
  [
@@ -602,12 +651,6 @@ describe('TtmlTextParser', () => {
602
651
  startTime: 62.05,
603
652
  endTime: 3723.2,
604
653
  payload: 'Test',
605
- region: {
606
- viewportAnchorX: 50,
607
- viewportAnchorY: 16,
608
- width: 100,
609
- height: 100,
610
- },
611
654
  },
612
655
  ],
613
656
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -618,7 +661,17 @@ describe('TtmlTextParser', () => {
618
661
  '<body region="subtitleArea"><div>' +
619
662
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
620
663
  '</div></body></tt>',
621
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
664
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
665
+ {
666
+ region: {
667
+ viewportAnchorX: 50,
668
+ viewportAnchorY: 16,
669
+ width: 100,
670
+ height: 100,
671
+ },
672
+ startTime: 62.05,
673
+ endTime: 3723.2,
674
+ }, {startTime: 62.05, endTime: 3723.2});
622
675
 
623
676
  verifyHelper(
624
677
  [
@@ -626,12 +679,6 @@ describe('TtmlTextParser', () => {
626
679
  startTime: 62.05,
627
680
  endTime: 3723.2,
628
681
  payload: 'Test',
629
- region: {
630
- viewportAnchorX: 50,
631
- viewportAnchorY: 16,
632
- width: 100,
633
- height: 100,
634
- },
635
682
  },
636
683
  ],
637
684
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -642,7 +689,17 @@ describe('TtmlTextParser', () => {
642
689
  '<body region="subtitleArea"><div>' +
643
690
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
644
691
  '</div></body></tt>',
645
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
692
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
693
+ {
694
+ region: {
695
+ viewportAnchorX: 50,
696
+ viewportAnchorY: 16,
697
+ width: 100,
698
+ height: 100,
699
+ },
700
+ startTime: 62.05,
701
+ endTime: 3723.2,
702
+ }, {startTime: 62.05, endTime: 3723.2});
646
703
  });
647
704
 
648
705
  it('supports region settings in pixels (origin)', () => {
@@ -652,19 +709,6 @@ describe('TtmlTextParser', () => {
652
709
  startTime: 62.05,
653
710
  endTime: 3723.2,
654
711
  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
712
  },
669
713
  ],
670
714
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -674,7 +718,24 @@ describe('TtmlTextParser', () => {
674
718
  '<body region="subtitleArea"><div>' +
675
719
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
676
720
  '</div></body></tt>',
677
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
721
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
722
+ {
723
+ region: {
724
+ id: 'subtitleArea',
725
+ viewportAnchorX: 50,
726
+ viewportAnchorY: 16,
727
+ regionAnchorX: 0,
728
+ regionAnchorY: 0,
729
+ width: 100,
730
+ height: 100,
731
+ heightUnits: CueRegion.units.PERCENTAGE,
732
+ widthUnits: CueRegion.units.PERCENTAGE,
733
+ viewportAnchorUnits: CueRegion.units.PX,
734
+ scroll: CueRegion.scrollMode.NONE,
735
+ },
736
+ startTime: 62.05,
737
+ endTime: 3723.2,
738
+ }, {startTime: 62.05, endTime: 3723.2});
678
739
  });
679
740
 
680
741
  it('supports region settings in pixels (extent)', () => {
@@ -684,19 +745,6 @@ describe('TtmlTextParser', () => {
684
745
  startTime: 62.05,
685
746
  endTime: 3723.2,
686
747
  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
748
  },
701
749
  ],
702
750
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -706,7 +754,24 @@ describe('TtmlTextParser', () => {
706
754
  '<body region="subtitleArea"><div>' +
707
755
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
708
756
  '</div></body></tt>',
709
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
757
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
758
+ {
759
+ region: {
760
+ id: 'subtitleArea',
761
+ viewportAnchorX: 0,
762
+ viewportAnchorY: 0,
763
+ regionAnchorX: 0,
764
+ regionAnchorY: 0,
765
+ width: 50,
766
+ height: 16,
767
+ heightUnits: CueRegion.units.PX,
768
+ widthUnits: CueRegion.units.PX,
769
+ viewportAnchorUnits: CueRegion.units.PERCENTAGE,
770
+ scroll: CueRegion.scrollMode.NONE,
771
+ },
772
+ startTime: 62.05,
773
+ endTime: 3723.2,
774
+ }, {startTime: 62.05, endTime: 3723.2});
710
775
  });
711
776
 
712
777
  it('supports region settings in pixels: origin (with global extent)', () => {
@@ -716,19 +781,6 @@ describe('TtmlTextParser', () => {
716
781
  startTime: 62.05,
717
782
  endTime: 3723.2,
718
783
  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
784
  },
733
785
  ],
734
786
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
@@ -738,7 +790,24 @@ describe('TtmlTextParser', () => {
738
790
  '<body region="subtitleArea"><div>' +
739
791
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
740
792
  '</div></body></tt>',
741
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
793
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
794
+ {
795
+ region: {
796
+ id: 'subtitleArea',
797
+ viewportAnchorX: 10,
798
+ viewportAnchorY: 10,
799
+ regionAnchorX: 0,
800
+ regionAnchorY: 0,
801
+ width: 100,
802
+ height: 100,
803
+ heightUnits: CueRegion.units.PERCENTAGE,
804
+ widthUnits: CueRegion.units.PERCENTAGE,
805
+ viewportAnchorUnits: CueRegion.units.PERCENTAGE,
806
+ scroll: CueRegion.scrollMode.NONE,
807
+ },
808
+ startTime: 62.05,
809
+ endTime: 3723.2,
810
+ }, {startTime: 62.05, endTime: 3723.2});
742
811
  });
743
812
 
744
813
  it('supports region settings in pixels: extent (with global extent)', () => {
@@ -748,19 +817,6 @@ describe('TtmlTextParser', () => {
748
817
  startTime: 62.05,
749
818
  endTime: 3723.2,
750
819
  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
820
  },
765
821
  ],
766
822
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
@@ -771,7 +827,24 @@ describe('TtmlTextParser', () => {
771
827
  '<body region="subtitleArea"><div>' +
772
828
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
773
829
  '</div></body></tt>',
774
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
830
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
831
+ {
832
+ region: {
833
+ id: 'subtitleArea',
834
+ viewportAnchorX: 0,
835
+ viewportAnchorY: 0,
836
+ regionAnchorX: 0,
837
+ regionAnchorY: 0,
838
+ width: 30,
839
+ height: 30,
840
+ heightUnits: CueRegion.units.PERCENTAGE,
841
+ widthUnits: CueRegion.units.PERCENTAGE,
842
+ viewportAnchorUnits: CueRegion.units.PERCENTAGE,
843
+ scroll: CueRegion.scrollMode.NONE,
844
+ },
845
+ startTime: 62.05,
846
+ endTime: 3723.2,
847
+ }, {startTime: 62.05, endTime: 3723.2});
775
848
  });
776
849
 
777
850
  it('supports region settings in percentage (origin)', () => {
@@ -781,29 +854,34 @@ describe('TtmlTextParser', () => {
781
854
  startTime: 62.05,
782
855
  endTime: 3723.2,
783
856
  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
857
  },
798
858
  ],
799
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
859
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" ' +
860
+ 'tts:extent="1920px 1080px">' +
800
861
  '<layout>' +
801
862
  '<region xml:id="subtitleArea" tts:origin="50% 16%"/>' +
802
863
  '</layout>' +
803
864
  '<body region="subtitleArea"><div>' +
804
865
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
805
866
  '</div></body></tt>',
806
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
867
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
868
+ {
869
+ region: {
870
+ id: 'subtitleArea',
871
+ viewportAnchorX: 50,
872
+ viewportAnchorY: 16,
873
+ regionAnchorX: 0,
874
+ regionAnchorY: 0,
875
+ width: 100,
876
+ height: 100,
877
+ heightUnits: CueRegion.units.PERCENTAGE,
878
+ widthUnits: CueRegion.units.PERCENTAGE,
879
+ viewportAnchorUnits: CueRegion.units.PERCENTAGE,
880
+ scroll: CueRegion.scrollMode.NONE,
881
+ },
882
+ startTime: 62.05,
883
+ endTime: 3723.2,
884
+ }, {startTime: 62.05, endTime: 3723.2});
807
885
  });
808
886
 
809
887
  it('supports region settings in percentage (extent)', () => {
@@ -813,22 +891,10 @@ describe('TtmlTextParser', () => {
813
891
  startTime: 62.05,
814
892
  endTime: 3723.2,
815
893
  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
894
  },
830
895
  ],
831
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
896
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" ' +
897
+ 'tts:extent="1920px 1080px">' +
832
898
  '<layout>' +
833
899
  '<region xml:id="subtitleArea" tts:extent="50% 16%" ' +
834
900
  'tts:writingMode="lrtb" />' +
@@ -836,7 +902,24 @@ describe('TtmlTextParser', () => {
836
902
  '<body region="subtitleArea"><div>' +
837
903
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
838
904
  '</div></body></tt>',
839
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
905
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
906
+ {
907
+ region: {
908
+ id: 'subtitleArea',
909
+ viewportAnchorX: 0,
910
+ viewportAnchorY: 0,
911
+ regionAnchorX: 0,
912
+ regionAnchorY: 0,
913
+ width: 50,
914
+ height: 16,
915
+ heightUnits: CueRegion.units.PERCENTAGE,
916
+ widthUnits: CueRegion.units.PERCENTAGE,
917
+ viewportAnchorUnits: CueRegion.units.PERCENTAGE,
918
+ scroll: CueRegion.scrollMode.NONE,
919
+ },
920
+ startTime: 62.05,
921
+ endTime: 3723.2,
922
+ }, {startTime: 62.05, endTime: 3723.2});
840
923
  });
841
924
 
842
925
  it('supports region settings for vertical text', () => {
@@ -846,13 +929,6 @@ describe('TtmlTextParser', () => {
846
929
  startTime: 62.05,
847
930
  endTime: 3723.2,
848
931
  payload: 'Test',
849
- region: {
850
- id: 'subtitleArea',
851
- viewportAnchorX: 50,
852
- viewportAnchorY: 16,
853
- width: 100,
854
- height: 100,
855
- },
856
932
  },
857
933
  ],
858
934
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -863,7 +939,18 @@ describe('TtmlTextParser', () => {
863
939
  '<body region="subtitleArea"><div>' +
864
940
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
865
941
  '</div></body></tt>',
866
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
942
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
943
+ {
944
+ region: {
945
+ id: 'subtitleArea',
946
+ viewportAnchorX: 50,
947
+ viewportAnchorY: 16,
948
+ width: 100,
949
+ height: 100,
950
+ },
951
+ startTime: 62.05,
952
+ endTime: 3723.2,
953
+ }, {startTime: 62.05, endTime: 3723.2});
867
954
 
868
955
  verifyHelper(
869
956
  [
@@ -871,12 +958,6 @@ describe('TtmlTextParser', () => {
871
958
  startTime: 62.05,
872
959
  endTime: 3723.2,
873
960
  payload: 'Test',
874
- region: {
875
- viewportAnchorX: 50,
876
- viewportAnchorY: 16,
877
- width: 100,
878
- height: 100,
879
- },
880
961
  },
881
962
  ],
882
963
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -887,7 +968,17 @@ describe('TtmlTextParser', () => {
887
968
  '<body region="subtitleArea"><div>' +
888
969
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
889
970
  '</div></body></tt>',
890
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
971
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
972
+ {
973
+ region: {
974
+ viewportAnchorX: 50,
975
+ viewportAnchorY: 16,
976
+ width: 100,
977
+ height: 100,
978
+ },
979
+ startTime: 62.05,
980
+ endTime: 3723.2,
981
+ }, {startTime: 62.05, endTime: 3723.2});
891
982
 
892
983
  verifyHelper(
893
984
  [
@@ -895,12 +986,6 @@ describe('TtmlTextParser', () => {
895
986
  startTime: 62.05,
896
987
  endTime: 3723.2,
897
988
  payload: 'Test',
898
- region: {
899
- viewportAnchorX: 50,
900
- viewportAnchorY: 16,
901
- width: 100,
902
- height: 100,
903
- },
904
989
  },
905
990
  ],
906
991
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -911,7 +996,17 @@ describe('TtmlTextParser', () => {
911
996
  '<body region="subtitleArea"><div>' +
912
997
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
913
998
  '</div></body></tt>',
914
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
999
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1000
+ {
1001
+ region: {
1002
+ viewportAnchorX: 50,
1003
+ viewportAnchorY: 16,
1004
+ width: 100,
1005
+ height: 100,
1006
+ },
1007
+ startTime: 62.05,
1008
+ endTime: 3723.2,
1009
+ }, {startTime: 62.05, endTime: 3723.2});
915
1010
  });
916
1011
 
917
1012
  it('supports percentages containing decimals', () => {
@@ -921,13 +1016,6 @@ describe('TtmlTextParser', () => {
921
1016
  startTime: 62.05,
922
1017
  endTime: 3723.2,
923
1018
  payload: 'Test',
924
- region: {
925
- id: 'subtitleArea',
926
- viewportAnchorX: 12.2,
927
- viewportAnchorY: 50.005,
928
- width: 100,
929
- height: 100,
930
- },
931
1019
  },
932
1020
  ],
933
1021
  '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
@@ -938,7 +1026,18 @@ describe('TtmlTextParser', () => {
938
1026
  '<body region="subtitleArea"><div>' +
939
1027
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
940
1028
  '</div></body></tt>',
941
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1029
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1030
+ {
1031
+ region: {
1032
+ id: 'subtitleArea',
1033
+ viewportAnchorX: 12.2,
1034
+ viewportAnchorY: 50.005,
1035
+ width: 100,
1036
+ height: 100,
1037
+ },
1038
+ startTime: 62.05,
1039
+ endTime: 3723.2,
1040
+ }, {startTime: 62.05, endTime: 3723.2});
942
1041
  });
943
1042
 
944
1043
  it('supports writingMode setting', () => {
@@ -959,7 +1058,9 @@ describe('TtmlTextParser', () => {
959
1058
  '<body region="subtitleArea"><div>' +
960
1059
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
961
1060
  '</div></body></tt>',
962
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1061
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1062
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1063
+ {startTime: 62.05, endTime: 3723.2});
963
1064
 
964
1065
  verifyHelper(
965
1066
  [
@@ -978,7 +1079,9 @@ describe('TtmlTextParser', () => {
978
1079
  '<body region="subtitleArea"><div>' +
979
1080
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
980
1081
  '</div></body></tt>',
981
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1082
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1083
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1084
+ {startTime: 62.05, endTime: 3723.2});
982
1085
 
983
1086
  verifyHelper(
984
1087
  [
@@ -997,7 +1100,9 @@ describe('TtmlTextParser', () => {
997
1100
  '<body region="subtitleArea"><div>' +
998
1101
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
999
1102
  '</div></body></tt>',
1000
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1103
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1104
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1105
+ {startTime: 62.05, endTime: 3723.2});
1001
1106
 
1002
1107
  verifyHelper(
1003
1108
  [
@@ -1016,7 +1121,9 @@ describe('TtmlTextParser', () => {
1016
1121
  '<body region="subtitleArea"><div>' +
1017
1122
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1018
1123
  '</div></body></tt>',
1019
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1124
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1125
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1126
+ {startTime: 62.05, endTime: 3723.2});
1020
1127
 
1021
1128
  verifyHelper(
1022
1129
  [
@@ -1035,7 +1142,9 @@ describe('TtmlTextParser', () => {
1035
1142
  '<body region="subtitleArea"><div>' +
1036
1143
  '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1037
1144
  '</div></body></tt>',
1038
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1145
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1146
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1147
+ {startTime: 62.05, endTime: 3723.2});
1039
1148
  });
1040
1149
 
1041
1150
  it('disregards empty divs and ps', () => {
@@ -1051,7 +1160,8 @@ describe('TtmlTextParser', () => {
1051
1160
  '<div></div>' +
1052
1161
  '</body>' +
1053
1162
  '</tt>',
1054
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1163
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1164
+ {startTime: 62.05, endTime: 3723.2});
1055
1165
 
1056
1166
  verifyHelper(
1057
1167
  [
@@ -1065,7 +1175,8 @@ describe('TtmlTextParser', () => {
1065
1175
  '</div>' +
1066
1176
  '</body>' +
1067
1177
  '</tt>',
1068
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1178
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1179
+ {startTime: 62.05, endTime: 3723.2});
1069
1180
 
1070
1181
  verifyHelper(
1071
1182
  [],
@@ -1077,7 +1188,8 @@ describe('TtmlTextParser', () => {
1077
1188
  '<div></div>' +
1078
1189
  '</body>' +
1079
1190
  '</tt>',
1080
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1191
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1192
+ {});
1081
1193
  });
1082
1194
 
1083
1195
  it('should let empty paragraphs with begin or end attributes through', () => {
@@ -1093,7 +1205,8 @@ describe('TtmlTextParser', () => {
1093
1205
  '</div>' +
1094
1206
  '</body>' +
1095
1207
  '</tt>',
1096
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1208
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1209
+ {startTime: 62.05, endTime: 3723.2});
1097
1210
  });
1098
1211
 
1099
1212
  it('supports smpte:backgroundImage attribute', () => {
@@ -1103,7 +1216,6 @@ describe('TtmlTextParser', () => {
1103
1216
  startTime: 62.05,
1104
1217
  endTime: 3723.2,
1105
1218
  payload: '',
1106
- backgroundImage: 'data:image/png;base64,base64EncodedImage',
1107
1219
  },
1108
1220
  ],
1109
1221
  '<tt ' +
@@ -1116,19 +1228,19 @@ describe('TtmlTextParser', () => {
1116
1228
  '<body><div smpte:backgroundImage="#img_0">' +
1117
1229
  '<p begin="01:02.05" end="01:02:03.200"></p>' +
1118
1230
  '</div></body></tt>',
1119
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1231
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1232
+ {startTime: 62.05, endTime: 3723.2},
1233
+ {
1234
+ startTime: 62.05,
1235
+ endTime: 3723.2,
1236
+ backgroundImage: 'data:image/png;base64,base64EncodedImage',
1237
+ isContainer: false,
1238
+ });
1120
1239
  });
1121
1240
 
1122
1241
  it('supports smpte:backgroundImage attribute in div element', () => {
1123
1242
  verifyHelper(
1124
- [
1125
- {
1126
- startTime: 0,
1127
- endTime: 62.05,
1128
- payload: '',
1129
- backgroundImage: 'data:image/png;base64,base64EncodedImage',
1130
- },
1131
- ],
1243
+ [],
1132
1244
  '<tt ' +
1133
1245
  'xmlns:ttm="http://www.w3.org/ns/ttml#metadata" ' +
1134
1246
  'xmlns:smpte="http://www.smpte-ra.org/schemas/2052-1/2010/smpte-tt">' +
@@ -1139,7 +1251,14 @@ describe('TtmlTextParser', () => {
1139
1251
  '<body><div begin="00:00.00" end="01:02.05" '+
1140
1252
  'smpte:backgroundImage="#img_0"></div>' +
1141
1253
  '</body></tt>',
1142
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1254
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1255
+ {startTime: 0, endTime: 62.05},
1256
+ {
1257
+ startTime: 0,
1258
+ endTime: 62.05,
1259
+ backgroundImage: 'data:image/png;base64,base64EncodedImage',
1260
+ isContainer: false,
1261
+ });
1143
1262
  });
1144
1263
 
1145
1264
  it('supports smpte:backgroundImage attribute alt namespace', () => {
@@ -1163,7 +1282,8 @@ describe('TtmlTextParser', () => {
1163
1282
  '<p begin="01:02.05" end="01:02:03.200" ' +
1164
1283
  'smpte:backgroundImage="#img_0" />' +
1165
1284
  '</div></body></tt>',
1166
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1285
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1286
+ {startTime: 62.05, endTime: 3723.2});
1167
1287
  });
1168
1288
 
1169
1289
  it('inserts line breaks for <br> tags', () => {
@@ -1191,7 +1311,8 @@ describe('TtmlTextParser', () => {
1191
1311
  '<tt><body><div>' +
1192
1312
  '<p begin="01:02.05" end="01:02:03.200">Line1<br/>Line2</p>' +
1193
1313
  '</div></body></tt>',
1194
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1314
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1315
+ {startTime: 62.05, endTime: 3723.2});
1195
1316
 
1196
1317
  verifyHelper(
1197
1318
  [{
@@ -1224,7 +1345,36 @@ describe('TtmlTextParser', () => {
1224
1345
  '<span>Line1<br/>Line2</span>' +
1225
1346
  '</p>' +
1226
1347
  '</div></body></tt>',
1227
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1348
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1349
+ {startTime: 62.05, endTime: 3723.2});
1350
+ });
1351
+
1352
+ it('allows old-standard namespace', () => {
1353
+ verifyHelper(
1354
+ [
1355
+ {
1356
+ startTime: 1,
1357
+ endTime: 2,
1358
+ payload: 'Test',
1359
+ cellResolution: {
1360
+ columns: 60,
1361
+ rows: 20,
1362
+ },
1363
+ fontSize: '67%',
1364
+ },
1365
+ ],
1366
+ '<tt ' +
1367
+ 'xmlns:ttp="http://www.w3.org/2006/10/ttaf1#parameter" ' +
1368
+ 'xmlns:tts="http://www.w3.org/2006/10/ttaf1#styling" ' +
1369
+ 'ttp:cellResolution="60 20">' +
1370
+ '<styling>' +
1371
+ '<style xml:id="s1" tts:fontSize="67%"/>' +
1372
+ '</styling>' +
1373
+ '<body><div>' +
1374
+ '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1375
+ '</div></body></tt>',
1376
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1377
+ {startTime: 1, endTime: 2});
1228
1378
  });
1229
1379
 
1230
1380
  it('parses cue alignment from textAlign attribute', () => {
@@ -1249,7 +1399,9 @@ describe('TtmlTextParser', () => {
1249
1399
  '<body region="subtitleArea"><div>' +
1250
1400
  '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
1251
1401
  '</div></body></tt>',
1252
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1402
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1403
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1404
+ {startTime: 62.05, endTime: 3723.2});
1253
1405
  });
1254
1406
 
1255
1407
  it('parses text style information', () => {
@@ -1292,7 +1444,9 @@ describe('TtmlTextParser', () => {
1292
1444
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1293
1445
  '<p begin="00:02.00" end="00:04.00" style="s2">Test 2</p>' +
1294
1446
  '</div></body></tt>',
1295
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1447
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1448
+ {startTime: 1, endTime: 4, region: {id: 'subtitleArea'}},
1449
+ {startTime: 1, endTime: 4});
1296
1450
  });
1297
1451
 
1298
1452
  // Regression test for #2623
@@ -1328,7 +1482,8 @@ describe('TtmlTextParser', () => {
1328
1482
  '<span style="s1">Test</span>' +
1329
1483
  '</p>' +
1330
1484
  '</div></body></tt>',
1331
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1485
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1486
+ {startTime: 1, endTime: 2});
1332
1487
  });
1333
1488
 
1334
1489
  it('parses wrapping option', () => {
@@ -1351,7 +1506,9 @@ describe('TtmlTextParser', () => {
1351
1506
  '<body region="subtitleArea"><div>' +
1352
1507
  '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
1353
1508
  '</div></body></tt>',
1354
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1509
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1510
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1511
+ {startTime: 62.05, endTime: 3723.2});
1355
1512
  });
1356
1513
 
1357
1514
  it('parses text decoration', () => {
@@ -1377,7 +1534,9 @@ describe('TtmlTextParser', () => {
1377
1534
  '<body region="subtitleArea"><div>' +
1378
1535
  '<p begin="01:02.05" end="01:02:03.200" style="s2">Test</p>' +
1379
1536
  '</div></body></tt>',
1380
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1537
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1538
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1539
+ {startTime: 62.05, endTime: 3723.2});
1381
1540
  });
1382
1541
 
1383
1542
  it('cues should have default cellResolution', () => {
@@ -1400,7 +1559,8 @@ describe('TtmlTextParser', () => {
1400
1559
  '<body><div>' +
1401
1560
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1402
1561
  '</div></body></tt>',
1403
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1562
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1563
+ {startTime: 1, endTime: 2});
1404
1564
  });
1405
1565
 
1406
1566
  it('parses cellResolution', () => {
@@ -1427,7 +1587,8 @@ describe('TtmlTextParser', () => {
1427
1587
  '<body><div>' +
1428
1588
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1429
1589
  '</div></body></tt>',
1430
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1590
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1591
+ {startTime: 1, endTime: 2});
1431
1592
  });
1432
1593
 
1433
1594
  it('parses line padding', () => {
@@ -1455,7 +1616,8 @@ describe('TtmlTextParser', () => {
1455
1616
  '<body><div>' +
1456
1617
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1457
1618
  '</div></body></tt>',
1458
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1619
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1620
+ {startTime: 1, endTime: 2});
1459
1621
  });
1460
1622
 
1461
1623
  it('chooses style on element over style on region', () => {
@@ -1479,7 +1641,9 @@ describe('TtmlTextParser', () => {
1479
1641
  '<body region="subtitleArea"><div>' +
1480
1642
  '<p begin="01:02.05" end="01:02:03.200" style="s2">Test</p>' +
1481
1643
  '</div></body></tt>',
1482
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1644
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1645
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1646
+ {startTime: 62.05, endTime: 3723.2});
1483
1647
  });
1484
1648
 
1485
1649
  it('can parse multiple cues', () => {
@@ -1492,10 +1656,11 @@ describe('TtmlTextParser', () => {
1492
1656
  '<p begin="00:01.00" end="00:02.00">First cue</p>' +
1493
1657
  '<p begin="00:03.00" end="00:04.00">Second cue</p>' +
1494
1658
  '</div></body></tt>',
1495
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1659
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1660
+ {startTime: 1, endTime: 4});
1496
1661
  });
1497
1662
 
1498
- // Regression test for https://github.com/google/shaka-player/issues/2478
1663
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/2478
1499
1664
  it('supports nested cues with only non-ASCII characters', () => {
1500
1665
  verifyHelper(
1501
1666
  [
@@ -1515,7 +1680,8 @@ describe('TtmlTextParser', () => {
1515
1680
  '<tt><body><div>' +
1516
1681
  '<p begin="01:02.05" end="01:02:03.200"><span>äöü</span></p>' +
1517
1682
  '</div></body></tt>',
1518
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1683
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1684
+ {startTime: 62.05, endTime: 3723.2});
1519
1685
  });
1520
1686
 
1521
1687
  it('supports timing on multiple levels', () => {
@@ -1531,7 +1697,9 @@ describe('TtmlTextParser', () => {
1531
1697
  '<p begin="3s" end="4s">First cue</p>' +
1532
1698
  '<p begin="4s" end="5s">Second cue</p>' +
1533
1699
  '</div></body></tt>',
1534
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1700
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1701
+ {startTime: 1, endTime: Infinity},
1702
+ {startTime: 3, endTime: Infinity});
1535
1703
 
1536
1704
  verifyHelper(
1537
1705
  [{
@@ -1554,7 +1722,9 @@ describe('TtmlTextParser', () => {
1554
1722
  '<span begin="5s" end="6s">Second cue</span>' +
1555
1723
  '</p>' +
1556
1724
  '</div></body></tt>',
1557
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1725
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1726
+ {startTime: 1, endTime: Infinity},
1727
+ {startTime: 3, endTime: Infinity});
1558
1728
  });
1559
1729
 
1560
1730
  it('gets end time from parent directly if missing', () => {
@@ -1568,7 +1738,9 @@ describe('TtmlTextParser', () => {
1568
1738
  '<p begin="3s" end="4s">First cue</p>' +
1569
1739
  '<p begin="4s">Second cue</p>' +
1570
1740
  '</div></body></tt>',
1571
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1741
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1742
+ {startTime: 1, endTime: 30},
1743
+ {startTime: 3, endTime: 30});
1572
1744
  });
1573
1745
 
1574
1746
  it('supports never-ending cues', () => {
@@ -1581,7 +1753,8 @@ describe('TtmlTextParser', () => {
1581
1753
  '<p begin="1s">First cue</p>' +
1582
1754
  '<p begin="2s">Second cue</p>' +
1583
1755
  '</div></body></tt>',
1584
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1756
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1757
+ {startTime: 1, endTime: Infinity});
1585
1758
  });
1586
1759
 
1587
1760
  // Regression test for b/159050711
@@ -1597,8 +1770,8 @@ describe('TtmlTextParser', () => {
1597
1770
  // Styles from regionStyle should apply only to the nested cue.
1598
1771
  backgroundColor: '',
1599
1772
  color: '',
1600
- displayAlign: Cue.displayAlign.AFTER, // displayAlign default value.
1601
- textAlign: Cue.textAlign.START, // textAlign default value.
1773
+ displayAlign: Cue.displayAlign.CENTER,
1774
+ textAlign: Cue.textAlign.CENTER,
1602
1775
 
1603
1776
  nestedCues: [
1604
1777
  {
@@ -1623,7 +1796,7 @@ describe('TtmlTextParser', () => {
1623
1796
  // Styles inherited from backgroundStyle via regionStyle via
1624
1797
  // spanStyle
1625
1798
  displayAlign: Cue.displayAlign.CENTER,
1626
- textAlign: Cue.textAlign.CENTER,
1799
+ textAlign: Cue.textAlign.END,
1627
1800
  },
1628
1801
  ],
1629
1802
  },
@@ -1637,7 +1810,7 @@ describe('TtmlTextParser', () => {
1637
1810
  // spanStyle inherits attributes from regionStyle
1638
1811
  ' <style xml:id="pStyle" tts:fontSize="15px" />' +
1639
1812
  ' <style xml:id="spanStyle" style="regionStyle" ' +
1640
- ' tts:backgroundColor="white" />' +
1813
+ ' tts:backgroundColor="white" tts:textAlign="end" />' +
1641
1814
  // regionStyle inherits attributes from backgroundStyle
1642
1815
  ' <style xml:id="regionStyle" style="backgroundStyle" ' +
1643
1816
  ' tts:backgroundColor="transparent" tts:color="blue" />' +
@@ -1652,32 +1825,117 @@ describe('TtmlTextParser', () => {
1652
1825
  ' <span style="spanStyle">Test with spanStyle</span>' +
1653
1826
  ' </p>' +
1654
1827
  '</div></body></tt>',
1655
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1828
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1829
+ {startTime: 0, endTime: 60});
1830
+ });
1831
+
1832
+ it('inherits alignment from parent regions', () => {
1833
+ verifyHelper(
1834
+ [
1835
+ {
1836
+ startTime: 0,
1837
+ endTime: 60,
1838
+ payload: '',
1839
+ fontSize: '',
1840
+ textAlign: Cue.textAlign.END,
1841
+ displayAlign: Cue.displayAlign.CENTER,
1842
+ nestedCues: [
1843
+ {
1844
+ startTime: 0,
1845
+ endTime: 60,
1846
+ payload: 'Hello!',
1847
+ textAlign: Cue.textAlign.END,
1848
+ displayAlign: Cue.displayAlign.CENTER,
1849
+ },
1850
+ ],
1851
+ },
1852
+ ],
1853
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1854
+ '<head><layout>' +
1855
+ '<region xml:id="r1" tts:textAlign="end" tts:displayAlign="center" />' +
1856
+ '</layout></head>' +
1857
+ '<body><div><p begin="00:00" end="01:00" region="r1">' +
1858
+ '<span>Hello!</span>' +
1859
+ '</p></div></body></tt>',
1860
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1861
+ {startTime: 0, endTime: 60},
1862
+ );
1863
+ });
1864
+
1865
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/3743
1866
+ it('inherits styles from other styles on nestedCues', () => {
1867
+ verifyHelper(
1868
+ [
1869
+ {
1870
+ // p element
1871
+ startTime: 0,
1872
+ endTime: 60,
1873
+ payload: '',
1874
+ fontSize: '',
1875
+ nestedCues: [
1876
+ {
1877
+ startTime: 0,
1878
+ endTime: 60,
1879
+ payload: 'A',
1880
+ fontSize: '16px',
1881
+ },
1882
+ {
1883
+ startTime: 0,
1884
+ endTime: 60,
1885
+ payload: '',
1886
+ fontSize: '',
1887
+ },
1888
+ {
1889
+ startTime: 0,
1890
+ endTime: 60,
1891
+ payload: 'B',
1892
+ fontSize: '16px',
1893
+ },
1894
+ ],
1895
+ },
1896
+ ],
1897
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1898
+ '<head>' +
1899
+ ' <styling>' +
1900
+ ' <style tts:backgroundColor="rgba(0,0,0,100)" ' +
1901
+ ' tts:displayAlign="center" ' +
1902
+ ' tts:extent="80% 10%" ' +
1903
+ ' tts:fontFamily="proportionalSansSerif" ' +
1904
+ ' tts:fontSize="16px" ' +
1905
+ ' tts:origin="10% 85%" ' +
1906
+ ' tts:textAlign="center" ' +
1907
+ ' xml:id="backgroundStyle"/>' +
1908
+ ' <style style="backgroundStyle" ' +
1909
+ ' tts:backgroundColor="transparent" ' +
1910
+ ' tts:color="white" ' +
1911
+ ' xml:id="speakerStyle"/>' +
1912
+ ' </styling>' +
1913
+ ' <layout>' +
1914
+ ' <region style="speakerStyle" tts:zIndex="1" xml:id="speaker"/>' +
1915
+ ' </layout>' +
1916
+ '</head>' +
1917
+ '<body><div>' +
1918
+ ' <p begin="00:00" end="01:00" region="speaker">' +
1919
+ ' A<br/>B' +
1920
+ ' </p>' +
1921
+ '</div></body></tt>',
1922
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1923
+ {startTime: 0, endTime: 60});
1656
1924
  });
1657
1925
 
1658
1926
  /**
1659
1927
  * @param {!Array} cues
1660
1928
  * @param {string} text
1661
1929
  * @param {shaka.extern.TextParser.TimeContext} time
1930
+ * @param {!Object} bodyProperties
1931
+ * @param {Object=} divProperties
1662
1932
  */
1663
- function verifyHelper(cues, text, time) {
1933
+ function verifyHelper(cues, text, time, bodyProperties, divProperties) {
1664
1934
  const data =
1665
1935
  shaka.util.BufferUtils.toUint8(shaka.util.StringUtils.toUTF8(text));
1666
1936
  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);
1937
+ shaka.test.TtmlUtils.verifyHelper(
1938
+ cues, result, bodyProperties, divProperties);
1681
1939
  }
1682
1940
 
1683
1941