shaka-player 3.3.0 → 3.3.3

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 (344) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/pull_request_template.md +6 -34
  4. package/.github/workflows/build-and-test.yaml +130 -0
  5. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  6. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  7. package/.github/workflows/demo-version-index.yaml +29 -0
  8. package/.github/workflows/nightly-demo.yaml +42 -0
  9. package/.github/workflows/release-please.yaml +145 -0
  10. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  11. package/.github/workflows/selenium-lab-tests.yaml +93 -0
  12. package/AUTHORS +2 -0
  13. package/CHANGELOG.md +1722 -1640
  14. package/CONTRIBUTING.md +2 -2
  15. package/CONTRIBUTORS +2 -0
  16. package/README.md +7 -7
  17. package/app-engine/README.md +9 -0
  18. package/app-engine/demo-version-index/README.md +14 -0
  19. package/app-engine/demo-version-index/app.yaml +2 -0
  20. package/app-engine/demo-version-index/main.py +162 -0
  21. package/app-engine/demo-version-index/requirements.txt +6 -0
  22. package/app-engine/demo-version-index/templates/index.html +114 -0
  23. package/app-engine/shaka-player-demo/README.md +18 -0
  24. package/app-engine/shaka-player-demo/app.yaml +61 -0
  25. package/app-engine/shaka-player-demo/main.py +95 -0
  26. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  27. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  28. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  29. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  30. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  31. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  32. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  33. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  34. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  35. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  36. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  37. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  38. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  39. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  40. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  41. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  42. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  43. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  44. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  45. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  46. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  47. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  48. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  49. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  50. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  51. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  52. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  53. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  54. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  55. package/app-engine/shaka-player-demo/posters.py +110 -0
  56. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  57. package/app-engine/shaka-player-demo/time.txt +1 -0
  58. package/build/README.md +1 -1
  59. package/build/checkversion.py +1 -1
  60. package/build/conformance.textproto +196 -169
  61. package/build/docker/Dockerfile +20 -0
  62. package/build/docker/docker-compose.yml +10 -0
  63. package/build/gendeps.py +18 -15
  64. package/build/shaka-lab.yaml +163 -0
  65. package/build/shakaBuildHelpers.py +4 -29
  66. package/build/test.py +93 -28
  67. package/build/types/polyfill +1 -0
  68. package/build/wrapper.template.js +2 -2
  69. package/demo/TengwarTelcontar.woff2 +0 -0
  70. package/demo/asset_card.js +1 -2
  71. package/demo/cast_receiver/index.html +1 -1
  72. package/demo/cast_receiver/receiver_app.css +14 -14
  73. package/demo/common/assets.js +2 -0
  74. package/demo/config.js +0 -1
  75. package/demo/custom.js +0 -1
  76. package/demo/customWarning.txt +2 -2
  77. package/demo/demo.less +29 -18
  78. package/demo/demo_uncompiled.js +1 -13
  79. package/demo/index.html +1 -1
  80. package/demo/main.js +3 -3
  81. package/dist/controls.css +3 -3
  82. package/dist/controls.css.map +1 -1
  83. package/dist/demo.compiled.debug.js +191 -194
  84. package/dist/demo.compiled.debug.map +4 -4
  85. package/dist/demo.compiled.js +191 -194
  86. package/dist/demo.compiled.map +4 -4
  87. package/dist/demo.css +1 -1
  88. package/dist/demo.css.map +1 -1
  89. package/dist/deps.js +233 -226
  90. package/dist/locales.js +30 -30
  91. package/dist/receiver.compiled.debug.js +43 -45
  92. package/dist/receiver.compiled.debug.map +4 -4
  93. package/dist/receiver.compiled.js +43 -45
  94. package/dist/receiver.compiled.map +4 -4
  95. package/dist/shaka-player.compiled.d.ts +272 -238
  96. package/dist/shaka-player.compiled.debug.d.ts +272 -238
  97. package/dist/shaka-player.compiled.debug.externs.js +53 -16
  98. package/dist/shaka-player.compiled.debug.js +393 -394
  99. package/dist/shaka-player.compiled.debug.map +4 -4
  100. package/dist/shaka-player.compiled.externs.js +53 -16
  101. package/dist/shaka-player.compiled.js +840 -843
  102. package/dist/shaka-player.compiled.map +4 -4
  103. package/dist/shaka-player.ui.d.ts +318 -293
  104. package/dist/shaka-player.ui.debug.d.ts +318 -293
  105. package/dist/shaka-player.ui.debug.externs.js +55 -27
  106. package/dist/shaka-player.ui.debug.js +415 -417
  107. package/dist/shaka-player.ui.debug.map +4 -4
  108. package/dist/shaka-player.ui.externs.js +55 -27
  109. package/dist/shaka-player.ui.js +997 -1000
  110. package/dist/shaka-player.ui.map +4 -4
  111. package/docs/design/REDESIGN.md +33 -33
  112. package/docs/design/bg-fetch.md +2 -2
  113. package/docs/design/codec_preferences.md +1 -1
  114. package/docs/design/dash-audio-channels.md +3 -3
  115. package/docs/design/dash-manifests.md +1 -1
  116. package/docs/design/gap-jumping.md +3 -3
  117. package/docs/design/preload.md +2 -2
  118. package/docs/tutorials/faq.md +8 -8
  119. package/docs/tutorials/index.json +1 -0
  120. package/docs/tutorials/plugins.md +3 -3
  121. package/docs/tutorials/selenium-grid-config.md +122 -0
  122. package/docs/tutorials/welcome.md +10 -2
  123. package/externs/cmcd.js +186 -0
  124. package/externs/shaka/player.js +8 -0
  125. package/externs/shaka/text.js +10 -0
  126. package/karma.conf.js +156 -45
  127. package/lib/abr/simple_abr_manager.js +12 -6
  128. package/lib/ads/ad_manager.js +1 -0
  129. package/lib/cast/cast_proxy.js +6 -4
  130. package/lib/cast/cast_receiver.js +3 -0
  131. package/lib/cea/cea608_data_channel.js +2 -2
  132. package/lib/cea/cea708_service.js +5 -4
  133. package/lib/cea/mp4_cea_parser.js +11 -5
  134. package/lib/cea/sei_processor.js +6 -3
  135. package/lib/dash/dash_parser.js +40 -30
  136. package/lib/dash/mpd_utils.js +4 -5
  137. package/lib/dash/segment_list.js +1 -2
  138. package/lib/dash/segment_template.js +3 -3
  139. package/lib/hls/hls_parser.js +41 -9
  140. package/lib/hls/manifest_text_parser.js +4 -3
  141. package/lib/media/adaptation_set.js +1 -2
  142. package/lib/media/content_workarounds.js +2 -2
  143. package/lib/media/drm_engine.js +3 -2
  144. package/lib/media/media_source_engine.js +3 -2
  145. package/lib/media/mp4_segment_index_parser.js +1 -4
  146. package/lib/media/playhead.js +2 -2
  147. package/lib/media/presentation_timeline.js +18 -8
  148. package/lib/media/quality_observer.js +17 -34
  149. package/lib/media/region_observer.js +39 -33
  150. package/lib/media/region_timeline.js +17 -19
  151. package/lib/media/segment_index.js +2 -1
  152. package/lib/media/segment_reference.js +19 -1
  153. package/lib/media/streaming_engine.js +12 -9
  154. package/lib/media/time_ranges_utils.js +1 -3
  155. package/lib/media/video_wrapper.js +1 -1
  156. package/lib/net/networking_engine.js +5 -1
  157. package/lib/offline/storage.js +12 -13
  158. package/lib/player.js +87 -41
  159. package/lib/polyfill/all.js +2 -3
  160. package/lib/polyfill/encryption_scheme.js +1 -1
  161. package/lib/polyfill/media_capabilities.js +32 -17
  162. package/lib/polyfill/mediasource.js +1 -1
  163. package/lib/polyfill/symbol.js +46 -0
  164. package/lib/text/cue.js +7 -1
  165. package/lib/text/simple_text_displayer.js +2 -1
  166. package/lib/text/ttml_text_parser.js +92 -63
  167. package/lib/text/ui_text_displayer.js +18 -12
  168. package/lib/util/buffer_utils.js +1 -3
  169. package/lib/util/cmcd_manager.js +47 -201
  170. package/lib/util/ebml_parser.js +3 -3
  171. package/lib/util/error.js +1 -1
  172. package/lib/util/fake_event_target.js +21 -1
  173. package/lib/util/iterables.js +0 -46
  174. package/lib/util/mp4_box_parsers.js +1 -4
  175. package/lib/util/mp4_parser.js +5 -7
  176. package/lib/util/periods.js +10 -11
  177. package/lib/util/platform.js +3 -3
  178. package/lib/util/pssh.js +1 -4
  179. package/lib/util/stream_utils.js +88 -11
  180. package/lib/util/string_utils.js +3 -5
  181. package/lib/util/uint8array_utils.js +3 -5
  182. package/lib/util/xml_utils.js +34 -7
  183. package/package.json +62 -40
  184. package/roadmap.md +17 -17
  185. package/shaka-player.uncompiled.js +1 -0
  186. package/test/abr/simple_abr_manager_unit.js +3 -8
  187. package/test/ads/ad_manager_unit.js +0 -6
  188. package/test/cast/cast_proxy_unit.js +0 -8
  189. package/test/cast/cast_receiver_integration.js +1 -18
  190. package/test/cast/cast_receiver_unit.js +1 -9
  191. package/test/cast/cast_sender_unit.js +0 -6
  192. package/test/cast/cast_utils_unit.js +0 -13
  193. package/test/cea/cea608_memory_unit.js +0 -5
  194. package/test/cea/cea708_service_unit.js +0 -7
  195. package/test/cea/cea708_window_unit.js +0 -5
  196. package/test/cea/cea_decoder_unit.js +0 -6
  197. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  198. package/test/cea/dtvcc_packet_unit.js +0 -5
  199. package/test/cea/mp4_cea_parser_unit.js +0 -4
  200. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  201. package/test/dash/dash_parser_live_unit.js +45 -15
  202. package/test/dash/dash_parser_manifest_unit.js +4 -17
  203. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  204. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  205. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  206. package/test/dash/mpd_utils_unit.js +3 -11
  207. package/test/demo/demo_unit.js +0 -5
  208. package/test/deprecate/enforcer_unit.js +0 -4
  209. package/test/deprecate/version_unit.js +0 -2
  210. package/test/hls/hls_live_unit.js +2 -14
  211. package/test/hls/hls_parser_unit.js +76 -15
  212. package/test/hls/manifest_text_parser_unit.js +0 -10
  213. package/test/media/adaptation_set_criteria_unit.js +3 -7
  214. package/test/media/adaptation_set_unit.js +0 -2
  215. package/test/media/buffering_observer_unit.js +1 -4
  216. package/test/media/closed_caption_parser_unit.js +0 -3
  217. package/test/media/drm_engine_integration.js +2 -15
  218. package/test/media/drm_engine_unit.js +7 -27
  219. package/test/media/manifest_parser_unit.js +0 -4
  220. package/test/media/media_source_engine_integration.js +0 -7
  221. package/test/media/media_source_engine_unit.js +1 -14
  222. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  223. package/test/media/play_rate_controller_unit.js +0 -4
  224. package/test/media/playhead_unit.js +8 -16
  225. package/test/media/presentation_timeline_unit.js +4 -7
  226. package/test/media/quality_observer_unit.js +4 -5
  227. package/test/media/region_observer_unit.js +40 -10
  228. package/test/media/region_timeline_unit.js +40 -25
  229. package/test/media/segment_index_unit.js +0 -6
  230. package/test/media/segment_reference_unit.js +0 -3
  231. package/test/media/stall_detector_unit.js +0 -5
  232. package/test/media/streaming_engine_integration.js +11 -37
  233. package/test/media/streaming_engine_unit.js +155 -34
  234. package/test/media/time_ranges_utils_unit.js +0 -2
  235. package/test/media/transmuxer_integration.js +0 -6
  236. package/test/media/webm_segment_index_parser_unit.js +0 -4
  237. package/test/net/data_uri_plugin_unit.js +0 -7
  238. package/test/net/http_plugin_unit.js +0 -9
  239. package/test/net/networking_engine_unit.js +0 -11
  240. package/test/offline/download_progress_estimator_unit.js +0 -2
  241. package/test/offline/indexeddb_storage_unit.js +0 -6
  242. package/test/offline/manifest_convert_unit.js +0 -8
  243. package/test/offline/offline_integration.js +1 -10
  244. package/test/offline/offline_manifest_parser_unit.js +0 -6
  245. package/test/offline/offline_scheme_unit.js +0 -8
  246. package/test/offline/offline_uri_unit.js +0 -2
  247. package/test/offline/storage_compatibility_unit.js +1 -14
  248. package/test/offline/storage_integration.js +1 -27
  249. package/test/player_external.js +2 -10
  250. package/test/player_integration.js +63 -36
  251. package/test/player_load_graph_integration.js +1 -6
  252. package/test/player_src_equals_external.js +3 -9
  253. package/test/player_src_equals_integration.js +41 -15
  254. package/test/player_unit.js +71 -46
  255. package/test/routing/walker_unit.js +0 -8
  256. package/test/test/assets/chapters.vtt +2 -2
  257. package/test/test/assets/chapters2.vtt +10 -0
  258. package/test/test/assets/large_file.mpd +1 -1
  259. package/test/test/boot.js +75 -22
  260. package/test/test/externs/jasmine.js +2 -2
  261. package/test/test/externs/karma.js +4 -0
  262. package/test/test/namespace.js +10 -0
  263. package/test/test/util/canned_idb.js +0 -8
  264. package/test/test/util/cea_utils.js +0 -6
  265. package/test/test/util/dash_parser_util.js +0 -13
  266. package/test/test/util/fake_ad.js +0 -3
  267. package/test/test/util/fake_ad_manager.js +0 -9
  268. package/test/test/util/fake_demo_main.js +0 -5
  269. package/test/test/util/fake_drm_engine.js +0 -6
  270. package/test/test/util/fake_media_source_engine.js +0 -7
  271. package/test/test/util/fake_networking_engine.js +0 -5
  272. package/test/test/util/fake_text_displayer.js +0 -5
  273. package/test/test/util/indexeddb_utils.js +1 -10
  274. package/test/test/util/jasmine_fetch.js +0 -1
  275. package/test/test/util/loader.js +0 -18
  276. package/test/test/util/manifest_generator.js +9 -14
  277. package/test/test/util/manifest_parser_util.js +0 -6
  278. package/test/test/util/offline_utils.js +0 -5
  279. package/test/test/util/simple_fakes.js +9 -26
  280. package/test/test/util/stream_generator.js +0 -14
  281. package/test/test/util/streaming_engine_util.js +0 -15
  282. package/test/test/util/test_scheme.js +1 -19
  283. package/test/test/util/ttml_utils.js +79 -0
  284. package/test/test/util/ui_utils.js +0 -9
  285. package/test/test/util/util.js +15 -26
  286. package/test/test/util/waiter.js +84 -43
  287. package/test/text/cue_integration.js +0 -4
  288. package/test/text/lrc_text_parser_unit.js +0 -4
  289. package/test/text/mp4_ttml_parser_unit.js +10 -23
  290. package/test/text/mp4_vtt_parser_unit.js +1 -7
  291. package/test/text/sbv_text_parser_unit.js +0 -4
  292. package/test/text/simple_text_displayer_unit.js +1 -8
  293. package/test/text/srt_text_parser_unit.js +0 -4
  294. package/test/text/ssa_text_parser_unit.js +0 -5
  295. package/test/text/text_engine_unit.js +2 -7
  296. package/test/text/text_track_integration.js +0 -2
  297. package/test/text/ttml_text_parser_unit.js +499 -239
  298. package/test/text/ui_text_displayer_unit.js +44 -41
  299. package/test/text/vtt_text_parser_unit.js +0 -9
  300. package/test/text/web_vtt_generator_unit.js +0 -3
  301. package/test/ui/ad_ui_unit.js +0 -11
  302. package/test/ui/localization_unit.js +0 -3
  303. package/test/ui/text_displayer_layout_unit.js +9 -19
  304. package/test/ui/ui_customization_unit.js +0 -6
  305. package/test/ui/ui_integration.js +0 -16
  306. package/test/ui/ui_unit.js +1 -17
  307. package/test/util/abortable_operation_unit.js +4 -9
  308. package/test/util/array_utils_unit.js +0 -2
  309. package/test/util/buffer_utils_unit.js +0 -2
  310. package/test/util/cmcd_manager_unit.js +29 -18
  311. package/test/util/data_view_reader_unit.js +0 -4
  312. package/test/util/ebml_parser_unit.js +0 -4
  313. package/test/util/event_manager_unit.js +0 -3
  314. package/test/util/fake_event_target_unit.js +0 -5
  315. package/test/util/functional_unit.js +1 -1
  316. package/test/util/iterables_unit.js +0 -64
  317. package/test/util/language_utils_unit.js +0 -3
  318. package/test/util/manifest_parser_utils_unit.js +0 -2
  319. package/test/util/mp4_box_parsers_unit.js +0 -5
  320. package/test/util/mp4_parser_unit.js +0 -4
  321. package/test/util/multi_map_unit.js +0 -3
  322. package/test/util/object_utils_unit.js +0 -2
  323. package/test/util/periods_unit.js +14 -7
  324. package/test/util/pssh_unit.js +0 -5
  325. package/test/util/state_history_unit.js +0 -2
  326. package/test/util/stream_utils_unit.js +39 -38
  327. package/test/util/string_utils_unit.js +0 -6
  328. package/test/util/text_parser_unit.js +0 -2
  329. package/test/util/xml_utils_unit.js +0 -4
  330. package/third_party/closure-uri/uri.js +21 -0
  331. package/ui/controls.js +3 -0
  332. package/ui/less/ad_controls.less +4 -4
  333. package/ui/less/buttons.less +5 -5
  334. package/ui/less/containers.less +9 -11
  335. package/ui/less/overflow_menu.less +4 -4
  336. package/ui/less/range_elements.less +5 -0
  337. package/ui/less/tooltip.less +1 -1
  338. package/ui/locales/sjn-translations.yaml +257 -0
  339. package/ui/locales/sjn.json +42 -0
  340. package/ui/localization.js +12 -36
  341. package/ui/text_selection.js +1 -0
  342. package/externs/media_capabilities.js +0 -16
  343. package/externs/svgelement.js +0 -18
  344. package/externs/webcrypto.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', () => {
@@ -1295,7 +1447,9 @@ describe('TtmlTextParser', () => {
1295
1447
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1296
1448
  '<p begin="00:02.00" end="00:04.00" style="s2">Test 2</p>' +
1297
1449
  '</div></body></tt>',
1298
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1450
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1451
+ {startTime: 1, endTime: 4, region: {id: 'subtitleArea'}},
1452
+ {startTime: 1, endTime: 4});
1299
1453
  });
1300
1454
 
1301
1455
  it('uses text color if tts:textOutline does not specify color', () => {
@@ -1318,7 +1472,8 @@ describe('TtmlTextParser', () => {
1318
1472
  '<body region="subtitleArea"><div>' +
1319
1473
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1320
1474
  '</div></body></tt>',
1321
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1475
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1476
+ {startTime: 1, endTime: 2});
1322
1477
  });
1323
1478
 
1324
1479
  it('does not add an outline if tts:textOutline only contains color', () => {
@@ -1339,7 +1494,8 @@ describe('TtmlTextParser', () => {
1339
1494
  '<body region="subtitleArea"><div>' +
1340
1495
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1341
1496
  '</div></body></tt>',
1342
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1497
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1498
+ {startTime: 1, endTime: 2});
1343
1499
  });
1344
1500
 
1345
1501
  // Regression test for #2623
@@ -1375,7 +1531,8 @@ describe('TtmlTextParser', () => {
1375
1531
  '<span style="s1">Test</span>' +
1376
1532
  '</p>' +
1377
1533
  '</div></body></tt>',
1378
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1534
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1535
+ {startTime: 1, endTime: 2});
1379
1536
  });
1380
1537
 
1381
1538
  it('parses wrapping option', () => {
@@ -1398,7 +1555,9 @@ describe('TtmlTextParser', () => {
1398
1555
  '<body region="subtitleArea"><div>' +
1399
1556
  '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
1400
1557
  '</div></body></tt>',
1401
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1558
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1559
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1560
+ {startTime: 62.05, endTime: 3723.2});
1402
1561
  });
1403
1562
 
1404
1563
  it('parses text decoration', () => {
@@ -1424,7 +1583,9 @@ describe('TtmlTextParser', () => {
1424
1583
  '<body region="subtitleArea"><div>' +
1425
1584
  '<p begin="01:02.05" end="01:02:03.200" style="s2">Test</p>' +
1426
1585
  '</div></body></tt>',
1427
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1586
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1587
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1588
+ {startTime: 62.05, endTime: 3723.2});
1428
1589
  });
1429
1590
 
1430
1591
  it('cues should have default cellResolution', () => {
@@ -1447,7 +1608,8 @@ describe('TtmlTextParser', () => {
1447
1608
  '<body><div>' +
1448
1609
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1449
1610
  '</div></body></tt>',
1450
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1611
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1612
+ {startTime: 1, endTime: 2});
1451
1613
  });
1452
1614
 
1453
1615
  it('parses cellResolution', () => {
@@ -1474,7 +1636,8 @@ describe('TtmlTextParser', () => {
1474
1636
  '<body><div>' +
1475
1637
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1476
1638
  '</div></body></tt>',
1477
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1639
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1640
+ {startTime: 1, endTime: 2});
1478
1641
  });
1479
1642
 
1480
1643
  it('parses line padding', () => {
@@ -1502,7 +1665,8 @@ describe('TtmlTextParser', () => {
1502
1665
  '<body><div>' +
1503
1666
  '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1504
1667
  '</div></body></tt>',
1505
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1668
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1669
+ {startTime: 1, endTime: 2});
1506
1670
  });
1507
1671
 
1508
1672
  it('chooses style on element over style on region', () => {
@@ -1526,7 +1690,9 @@ describe('TtmlTextParser', () => {
1526
1690
  '<body region="subtitleArea"><div>' +
1527
1691
  '<p begin="01:02.05" end="01:02:03.200" style="s2">Test</p>' +
1528
1692
  '</div></body></tt>',
1529
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1693
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1694
+ {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1695
+ {startTime: 62.05, endTime: 3723.2});
1530
1696
  });
1531
1697
 
1532
1698
  it('can parse multiple cues', () => {
@@ -1539,10 +1705,11 @@ describe('TtmlTextParser', () => {
1539
1705
  '<p begin="00:01.00" end="00:02.00">First cue</p>' +
1540
1706
  '<p begin="00:03.00" end="00:04.00">Second cue</p>' +
1541
1707
  '</div></body></tt>',
1542
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1708
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1709
+ {startTime: 1, endTime: 4});
1543
1710
  });
1544
1711
 
1545
- // Regression test for https://github.com/google/shaka-player/issues/2478
1712
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/2478
1546
1713
  it('supports nested cues with only non-ASCII characters', () => {
1547
1714
  verifyHelper(
1548
1715
  [
@@ -1562,7 +1729,8 @@ describe('TtmlTextParser', () => {
1562
1729
  '<tt><body><div>' +
1563
1730
  '<p begin="01:02.05" end="01:02:03.200"><span>äöü</span></p>' +
1564
1731
  '</div></body></tt>',
1565
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1732
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1733
+ {startTime: 62.05, endTime: 3723.2});
1566
1734
  });
1567
1735
 
1568
1736
  it('supports timing on multiple levels', () => {
@@ -1578,7 +1746,9 @@ describe('TtmlTextParser', () => {
1578
1746
  '<p begin="3s" end="4s">First cue</p>' +
1579
1747
  '<p begin="4s" end="5s">Second cue</p>' +
1580
1748
  '</div></body></tt>',
1581
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1749
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1750
+ {startTime: 1, endTime: Infinity},
1751
+ {startTime: 3, endTime: Infinity});
1582
1752
 
1583
1753
  verifyHelper(
1584
1754
  [{
@@ -1601,7 +1771,9 @@ describe('TtmlTextParser', () => {
1601
1771
  '<span begin="5s" end="6s">Second cue</span>' +
1602
1772
  '</p>' +
1603
1773
  '</div></body></tt>',
1604
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1774
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1775
+ {startTime: 1, endTime: Infinity},
1776
+ {startTime: 3, endTime: Infinity});
1605
1777
  });
1606
1778
 
1607
1779
  it('gets end time from parent directly if missing', () => {
@@ -1615,7 +1787,9 @@ describe('TtmlTextParser', () => {
1615
1787
  '<p begin="3s" end="4s">First cue</p>' +
1616
1788
  '<p begin="4s">Second cue</p>' +
1617
1789
  '</div></body></tt>',
1618
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1790
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1791
+ {startTime: 1, endTime: 30},
1792
+ {startTime: 3, endTime: 30});
1619
1793
  });
1620
1794
 
1621
1795
  it('supports never-ending cues', () => {
@@ -1628,7 +1802,8 @@ describe('TtmlTextParser', () => {
1628
1802
  '<p begin="1s">First cue</p>' +
1629
1803
  '<p begin="2s">Second cue</p>' +
1630
1804
  '</div></body></tt>',
1631
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1805
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1806
+ {startTime: 1, endTime: Infinity});
1632
1807
  });
1633
1808
 
1634
1809
  // Regression test for b/159050711
@@ -1644,8 +1819,8 @@ describe('TtmlTextParser', () => {
1644
1819
  // Styles from regionStyle should apply only to the nested cue.
1645
1820
  backgroundColor: '',
1646
1821
  color: '',
1647
- displayAlign: Cue.displayAlign.AFTER, // displayAlign default value.
1648
- textAlign: Cue.textAlign.START, // textAlign default value.
1822
+ displayAlign: Cue.displayAlign.CENTER,
1823
+ textAlign: Cue.textAlign.CENTER,
1649
1824
 
1650
1825
  nestedCues: [
1651
1826
  {
@@ -1670,7 +1845,7 @@ describe('TtmlTextParser', () => {
1670
1845
  // Styles inherited from backgroundStyle via regionStyle via
1671
1846
  // spanStyle
1672
1847
  displayAlign: Cue.displayAlign.CENTER,
1673
- textAlign: Cue.textAlign.CENTER,
1848
+ textAlign: Cue.textAlign.END,
1674
1849
  },
1675
1850
  ],
1676
1851
  },
@@ -1684,7 +1859,7 @@ describe('TtmlTextParser', () => {
1684
1859
  // spanStyle inherits attributes from regionStyle
1685
1860
  ' <style xml:id="pStyle" tts:fontSize="15px" />' +
1686
1861
  ' <style xml:id="spanStyle" style="regionStyle" ' +
1687
- ' tts:backgroundColor="white" />' +
1862
+ ' tts:backgroundColor="white" tts:textAlign="end" />' +
1688
1863
  // regionStyle inherits attributes from backgroundStyle
1689
1864
  ' <style xml:id="regionStyle" style="backgroundStyle" ' +
1690
1865
  ' tts:backgroundColor="transparent" tts:color="blue" />' +
@@ -1699,32 +1874,117 @@ describe('TtmlTextParser', () => {
1699
1874
  ' <span style="spanStyle">Test with spanStyle</span>' +
1700
1875
  ' </p>' +
1701
1876
  '</div></body></tt>',
1702
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
1877
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1878
+ {startTime: 0, endTime: 60});
1879
+ });
1880
+
1881
+ it('inherits alignment from parent regions', () => {
1882
+ verifyHelper(
1883
+ [
1884
+ {
1885
+ startTime: 0,
1886
+ endTime: 60,
1887
+ payload: '',
1888
+ fontSize: '',
1889
+ textAlign: Cue.textAlign.END,
1890
+ displayAlign: Cue.displayAlign.CENTER,
1891
+ nestedCues: [
1892
+ {
1893
+ startTime: 0,
1894
+ endTime: 60,
1895
+ payload: 'Hello!',
1896
+ textAlign: Cue.textAlign.END,
1897
+ displayAlign: Cue.displayAlign.CENTER,
1898
+ },
1899
+ ],
1900
+ },
1901
+ ],
1902
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1903
+ '<head><layout>' +
1904
+ '<region xml:id="r1" tts:textAlign="end" tts:displayAlign="center" />' +
1905
+ '</layout></head>' +
1906
+ '<body><div><p begin="00:00" end="01:00" region="r1">' +
1907
+ '<span>Hello!</span>' +
1908
+ '</p></div></body></tt>',
1909
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1910
+ {startTime: 0, endTime: 60},
1911
+ );
1912
+ });
1913
+
1914
+ // Regression test for https://github.com/shaka-project/shaka-player/issues/3743
1915
+ it('inherits styles from other styles on nestedCues', () => {
1916
+ verifyHelper(
1917
+ [
1918
+ {
1919
+ // p element
1920
+ startTime: 0,
1921
+ endTime: 60,
1922
+ payload: '',
1923
+ fontSize: '',
1924
+ nestedCues: [
1925
+ {
1926
+ startTime: 0,
1927
+ endTime: 60,
1928
+ payload: 'A',
1929
+ fontSize: '16px',
1930
+ },
1931
+ {
1932
+ startTime: 0,
1933
+ endTime: 60,
1934
+ payload: '',
1935
+ fontSize: '',
1936
+ },
1937
+ {
1938
+ startTime: 0,
1939
+ endTime: 60,
1940
+ payload: 'B',
1941
+ fontSize: '16px',
1942
+ },
1943
+ ],
1944
+ },
1945
+ ],
1946
+ '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1947
+ '<head>' +
1948
+ ' <styling>' +
1949
+ ' <style tts:backgroundColor="rgba(0,0,0,100)" ' +
1950
+ ' tts:displayAlign="center" ' +
1951
+ ' tts:extent="80% 10%" ' +
1952
+ ' tts:fontFamily="proportionalSansSerif" ' +
1953
+ ' tts:fontSize="16px" ' +
1954
+ ' tts:origin="10% 85%" ' +
1955
+ ' tts:textAlign="center" ' +
1956
+ ' xml:id="backgroundStyle"/>' +
1957
+ ' <style style="backgroundStyle" ' +
1958
+ ' tts:backgroundColor="transparent" ' +
1959
+ ' tts:color="white" ' +
1960
+ ' xml:id="speakerStyle"/>' +
1961
+ ' </styling>' +
1962
+ ' <layout>' +
1963
+ ' <region style="speakerStyle" tts:zIndex="1" xml:id="speaker"/>' +
1964
+ ' </layout>' +
1965
+ '</head>' +
1966
+ '<body><div>' +
1967
+ ' <p begin="00:00" end="01:00" region="speaker">' +
1968
+ ' A<br/>B' +
1969
+ ' </p>' +
1970
+ '</div></body></tt>',
1971
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0},
1972
+ {startTime: 0, endTime: 60});
1703
1973
  });
1704
1974
 
1705
1975
  /**
1706
1976
  * @param {!Array} cues
1707
1977
  * @param {string} text
1708
1978
  * @param {shaka.extern.TextParser.TimeContext} time
1979
+ * @param {!Object} bodyProperties
1980
+ * @param {Object=} divProperties
1709
1981
  */
1710
- function verifyHelper(cues, text, time) {
1982
+ function verifyHelper(cues, text, time, bodyProperties, divProperties) {
1711
1983
  const data =
1712
1984
  shaka.util.BufferUtils.toUint8(shaka.util.StringUtils.toUTF8(text));
1713
1985
  const result = new shaka.text.TtmlTextParser().parseMedia(data, time);
1714
-
1715
- const mapExpected = (cue) => {
1716
- if (cue.region) {
1717
- cue.region = jasmine.objectContaining(cue.region);
1718
- }
1719
-
1720
- if (cue.nestedCues) {
1721
- cue.nestedCues = cue.nestedCues.map(mapExpected);
1722
- }
1723
-
1724
- return jasmine.objectContaining(cue);
1725
- };
1726
- const expected = cues.map(mapExpected);
1727
- expect(result).toEqual(expected);
1986
+ shaka.test.TtmlUtils.verifyHelper(
1987
+ cues, result, bodyProperties, divProperties);
1728
1988
  }
1729
1989
 
1730
1990