shaka-player 4.6.4 → 4.7.0

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 (598) hide show
  1. package/README.md +1 -0
  2. package/dist/controls.css +1 -1
  3. package/dist/controls.css.map +1 -1
  4. package/dist/deps.js +9 -5
  5. package/dist/locales.js +29 -29
  6. package/dist/shaka-player.compiled.d.ts +46 -3
  7. package/dist/shaka-player.compiled.debug.d.ts +46 -3
  8. package/dist/shaka-player.compiled.debug.externs.js +45 -0
  9. package/dist/shaka-player.compiled.debug.js +382 -351
  10. package/dist/shaka-player.compiled.debug.map +4 -4
  11. package/dist/shaka-player.compiled.externs.js +45 -0
  12. package/dist/shaka-player.compiled.js +1135 -1121
  13. package/dist/shaka-player.compiled.map +4 -4
  14. package/dist/shaka-player.ui.d.ts +68 -4
  15. package/dist/shaka-player.ui.debug.d.ts +68 -4
  16. package/dist/shaka-player.ui.debug.externs.js +77 -0
  17. package/dist/shaka-player.ui.debug.js +428 -392
  18. package/dist/shaka-player.ui.debug.map +4 -4
  19. package/dist/shaka-player.ui.externs.js +77 -0
  20. package/dist/shaka-player.ui.js +1304 -1290
  21. package/dist/shaka-player.ui.map +4 -4
  22. package/externs/mediasession.js +7 -0
  23. package/externs/shaka/abr_manager.js +8 -0
  24. package/externs/shaka/manifest.js +3 -3
  25. package/externs/shaka/player.js +59 -4
  26. package/lib/abr/simple_abr_manager.js +41 -15
  27. package/lib/cea/cea708_service.js +1 -1
  28. package/lib/cea/cea708_window.js +95 -7
  29. package/lib/dash/dash_parser.js +55 -11
  30. package/lib/media/adaptation_set_criteria.js +76 -10
  31. package/lib/media/media_source_engine.js +42 -18
  32. package/lib/media/segment_reference.js +12 -0
  33. package/lib/media/streaming_engine.js +55 -3
  34. package/lib/player.js +92 -6
  35. package/lib/util/cmsd_manager.js +269 -0
  36. package/lib/util/content_steering_manager.js +5 -1
  37. package/lib/util/mime_utils.js +6 -2
  38. package/lib/util/periods.js +108 -39
  39. package/lib/util/player_configuration.js +19 -5
  40. package/lib/util/stream_utils.js +82 -13
  41. package/package.json +1 -1
  42. package/ui/audio_language_selection.js +3 -0
  43. package/ui/controls.js +60 -0
  44. package/ui/externs/ui.js +12 -1
  45. package/ui/hidden_fast_forward_button.js +32 -0
  46. package/ui/hidden_rewind_button.js +32 -0
  47. package/ui/hidden_seek_button.js +121 -0
  48. package/ui/less/buttons.less +50 -0
  49. package/ui/less/containers.less +18 -0
  50. package/ui/resolution_selection.js +2 -0
  51. package/ui/ui.js +2 -0
  52. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -75
  53. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -26
  54. package/.github/ISSUE_TEMPLATE/question.md +0 -26
  55. package/.github/config.yml +0 -1
  56. package/.github/workflows/appspot.yaml +0 -39
  57. package/.github/workflows/build-and-test.yaml +0 -222
  58. package/.github/workflows/compute-incremental-coverage.py +0 -265
  59. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +0 -56
  60. package/.github/workflows/custom-actions/set-commit-status/action.yaml +0 -37
  61. package/.github/workflows/deflake.yaml +0 -31
  62. package/.github/workflows/demo-version-index.yaml +0 -43
  63. package/.github/workflows/nightly-demo.yaml +0 -42
  64. package/.github/workflows/release-please.yaml +0 -193
  65. package/.github/workflows/report-incremental-coverage.yaml +0 -39
  66. package/.github/workflows/safari-homedir-launcher.sh +0 -18
  67. package/.github/workflows/selenium-lab-tests.yaml +0 -370
  68. package/.github/workflows/shaka-bot-commands/command-help.sh +0 -27
  69. package/.github/workflows/shaka-bot-commands/command-test.sh +0 -56
  70. package/.github/workflows/shaka-bot-commands/lib.sh +0 -83
  71. package/.github/workflows/shaka-bot-commands/main.sh +0 -51
  72. package/.github/workflows/sync-labels.yaml +0 -33
  73. package/.github/workflows/talk-to-shaka-bot.yaml +0 -29
  74. package/.github/workflows/update-issues.yaml +0 -31
  75. package/.github/workflows/update-screenshots.yaml +0 -142
  76. package/.github/workflows/validate-pr-title.yaml +0 -27
  77. package/CHANGELOG.md +0 -5774
  78. package/CODE_OF_CONDUCT.md +0 -93
  79. package/CONTRIBUTING.md +0 -76
  80. package/demo/TengwarTelcontar.woff2 +0 -0
  81. package/demo/app_logo_144.png +0 -0
  82. package/demo/app_logo_192.png +0 -0
  83. package/demo/app_logo_256.png +0 -0
  84. package/demo/app_logo_384.png +0 -0
  85. package/demo/app_logo_512.png +0 -0
  86. package/demo/app_manifest.json +0 -29
  87. package/demo/asset_card.js +0 -410
  88. package/demo/autoTemplate.txt +0 -61
  89. package/demo/cast_receiver/idle1.jpg +0 -0
  90. package/demo/cast_receiver/idle2.jpg +0 -0
  91. package/demo/cast_receiver/idle3.jpg +0 -0
  92. package/demo/cast_receiver/index.html +0 -75
  93. package/demo/cast_receiver/receiver_app.css +0 -111
  94. package/demo/cast_receiver/receiver_app.js +0 -158
  95. package/demo/close_button.js +0 -60
  96. package/demo/common/asset.js +0 -510
  97. package/demo/common/assets.js +0 -1634
  98. package/demo/config.js +0 -859
  99. package/demo/custom.js +0 -907
  100. package/demo/customWarning.txt +0 -8
  101. package/demo/demo.less +0 -591
  102. package/demo/demo_uncompiled.js +0 -11
  103. package/demo/demo_utils.js +0 -113
  104. package/demo/favicon.ico +0 -0
  105. package/demo/front.js +0 -156
  106. package/demo/icons/README.md +0 -4
  107. package/demo/icons/baseline-audiotrack-24px.svg +0 -1
  108. package/demo/icons/baseline-closed_caption-24px.svg +0 -1
  109. package/demo/icons/baseline-fast_forward-24px.svg +0 -1
  110. package/demo/icons/baseline-language-24px.svg +0 -1
  111. package/demo/icons/baseline-live_tv-24px.svg +0 -1
  112. package/demo/icons/baseline-subtitles-24px.svg +0 -1
  113. package/demo/icons/baseline-surround_sound-24px.svg +0 -1
  114. package/demo/icons/custom_ad.svg +0 -1
  115. package/demo/icons/custom_box_with_text.svg +0 -1
  116. package/demo/icons/custom_clear_key.svg +0 -1
  117. package/demo/icons/custom_high_definition.svg +0 -1
  118. package/demo/icons/custom_playready.svg +0 -1
  119. package/demo/icons/custom_ultra_high_definition.svg +0 -1
  120. package/demo/icons/custom_widevine.svg +0 -1
  121. package/demo/index.html +0 -173
  122. package/demo/input.js +0 -270
  123. package/demo/input_container.js +0 -218
  124. package/demo/load.js +0 -156
  125. package/demo/main.js +0 -1854
  126. package/demo/search.js +0 -452
  127. package/demo/service_worker.js +0 -355
  128. package/demo/shaka_logo_trans.png +0 -0
  129. package/demo/tooltip.js +0 -29
  130. package/demo/visualizer.js +0 -335
  131. package/demo/visualizer_button.js +0 -84
  132. package/dist/demo.compiled.debug.js +0 -340
  133. package/dist/demo.compiled.debug.map +0 -8
  134. package/dist/demo.compiled.js +0 -340
  135. package/dist/demo.compiled.map +0 -8
  136. package/dist/demo.css +0 -6
  137. package/dist/demo.css.map +0 -1
  138. package/dist/receiver.compiled.debug.js +0 -187
  139. package/dist/receiver.compiled.debug.map +0 -8
  140. package/dist/receiver.compiled.js +0 -187
  141. package/dist/receiver.compiled.map +0 -8
  142. package/docs/announcement-list-join-group.png +0 -0
  143. package/docs/api-mainpage.md +0 -28
  144. package/docs/design/REDESIGN.md +0 -283
  145. package/docs/design/architecture.md +0 -13
  146. package/docs/design/bg-fetch-after.gv +0 -29
  147. package/docs/design/bg-fetch-after.gv.png +0 -0
  148. package/docs/design/bg-fetch-before.gv +0 -18
  149. package/docs/design/bg-fetch-before.gv.png +0 -0
  150. package/docs/design/bg-fetch.md +0 -134
  151. package/docs/design/cast.gv +0 -35
  152. package/docs/design/cast.gv.png +0 -0
  153. package/docs/design/chromecast.md +0 -151
  154. package/docs/design/codec_preferences.md +0 -158
  155. package/docs/design/dash-audio-channels.md +0 -123
  156. package/docs/design/dash-manifests.md +0 -248
  157. package/docs/design/dash-timeline.svg +0 -4
  158. package/docs/design/dataflow.gv +0 -66
  159. package/docs/design/dataflow.gv.png +0 -0
  160. package/docs/design/export.md +0 -70
  161. package/docs/design/fuzzy-locale-matching.md +0 -40
  162. package/docs/design/gap-jumping.md +0 -151
  163. package/docs/design/lcevc-architecture.png +0 -0
  164. package/docs/design/lcevc-demo.png +0 -0
  165. package/docs/design/lcevc-integration.md +0 -72
  166. package/docs/design/locale_compatibility.svg +0 -1
  167. package/docs/design/locales_tree.svg +0 -1
  168. package/docs/design/localization-design-principles.md +0 -158
  169. package/docs/design/newdemo.gv +0 -83
  170. package/docs/design/newdemo.gv.png +0 -0
  171. package/docs/design/offline.gv +0 -43
  172. package/docs/design/offline.gv.png +0 -0
  173. package/docs/design/offline.md +0 -153
  174. package/docs/design/ownership.gv +0 -76
  175. package/docs/design/ownership.gv.png +0 -0
  176. package/docs/design/preload.md +0 -299
  177. package/docs/design/preload.png +0 -0
  178. package/docs/design/talking-about-languages.md +0 -46
  179. package/docs/design/timeline.svg +0 -152
  180. package/docs/design/ui.md +0 -31
  181. package/docs/design/ui_player_relationships.svg +0 -1
  182. package/docs/jsdoc-plugin.js +0 -74
  183. package/docs/jsdoc-template/README.md +0 -1
  184. package/docs/jsdoc-template/publish.js +0 -879
  185. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.eot +0 -0
  186. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.svg +0 -1830
  187. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.woff +0 -0
  188. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  189. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.svg +0 -1830
  190. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  191. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.eot +0 -0
  192. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.svg +0 -1830
  193. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.woff +0 -0
  194. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.eot +0 -0
  195. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.svg +0 -1831
  196. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.woff +0 -0
  197. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  198. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.svg +0 -1835
  199. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  200. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.eot +0 -0
  201. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.svg +0 -1831
  202. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.woff +0 -0
  203. package/docs/jsdoc-template/static/scripts/linenumber.js +0 -44
  204. package/docs/jsdoc-template/static/scripts/show-widget.js +0 -55
  205. package/docs/jsdoc-template/static/styles/jsdoc-default.css +0 -438
  206. package/docs/jsdoc-template/tmpl/augments.tmpl +0 -10
  207. package/docs/jsdoc-template/tmpl/container.tmpl +0 -205
  208. package/docs/jsdoc-template/tmpl/details.tmpl +0 -152
  209. package/docs/jsdoc-template/tmpl/example.tmpl +0 -2
  210. package/docs/jsdoc-template/tmpl/examples.tmpl +0 -13
  211. package/docs/jsdoc-template/tmpl/exceptions.tmpl +0 -32
  212. package/docs/jsdoc-template/tmpl/layout.tmpl +0 -50
  213. package/docs/jsdoc-template/tmpl/mainpage.tmpl +0 -14
  214. package/docs/jsdoc-template/tmpl/members.tmpl +0 -47
  215. package/docs/jsdoc-template/tmpl/method.tmpl +0 -140
  216. package/docs/jsdoc-template/tmpl/modifies.tmpl +0 -14
  217. package/docs/jsdoc-template/tmpl/params.tmpl +0 -131
  218. package/docs/jsdoc-template/tmpl/properties.tmpl +0 -125
  219. package/docs/jsdoc-template/tmpl/returns.tmpl +0 -19
  220. package/docs/jsdoc-template/tmpl/source.tmpl +0 -8
  221. package/docs/jsdoc-template/tmpl/tutorial.tmpl +0 -21
  222. package/docs/jsdoc-template/tmpl/type.tmpl +0 -7
  223. package/docs/jsdoc.conf.json +0 -38
  224. package/docs/shaka-player-logo.png +0 -0
  225. package/docs/style.md +0 -174
  226. package/docs/tutorials/a11y.md +0 -64
  227. package/docs/tutorials/ad_monetization.md +0 -292
  228. package/docs/tutorials/application-level-redirects.md +0 -94
  229. package/docs/tutorials/architecture.md +0 -32
  230. package/docs/tutorials/basic-usage.md +0 -89
  231. package/docs/tutorials/blob-url.md +0 -15
  232. package/docs/tutorials/config.md +0 -148
  233. package/docs/tutorials/debugging.md +0 -189
  234. package/docs/tutorials/drm-config.md +0 -274
  235. package/docs/tutorials/errors.md +0 -95
  236. package/docs/tutorials/fairplay.md +0 -242
  237. package/docs/tutorials/faq.md +0 -252
  238. package/docs/tutorials/index.json +0 -29
  239. package/docs/tutorials/lcevc.md +0 -118
  240. package/docs/tutorials/license-server-auth.md +0 -248
  241. package/docs/tutorials/license-wrapping.md +0 -168
  242. package/docs/tutorials/manifest-parser.md +0 -365
  243. package/docs/tutorials/network-and-buffering-config.md +0 -119
  244. package/docs/tutorials/offline.md +0 -683
  245. package/docs/tutorials/plugins.md +0 -184
  246. package/docs/tutorials/selenium-grid-config.md +0 -174
  247. package/docs/tutorials/service-worker.md +0 -106
  248. package/docs/tutorials/ui-customization.md +0 -288
  249. package/docs/tutorials/ui.md +0 -232
  250. package/docs/tutorials/upgrade-manifest.md +0 -281
  251. package/docs/tutorials/upgrade.md +0 -104
  252. package/docs/tutorials/welcome.md +0 -108
  253. package/docs/tutorials/widevine-service-certs.md +0 -45
  254. package/karma.conf.js +0 -879
  255. package/maintained-branches.md +0 -15
  256. package/roadmap.md +0 -186
  257. package/test/abr/simple_abr_manager_unit.js +0 -398
  258. package/test/ads/ad_manager_unit.js +0 -260
  259. package/test/assumptions/uint8_array_unit.js +0 -22
  260. package/test/cast/cast_proxy_unit.js +0 -736
  261. package/test/cast/cast_receiver_integration.js +0 -488
  262. package/test/cast/cast_receiver_unit.js +0 -1183
  263. package/test/cast/cast_sender_unit.js +0 -973
  264. package/test/cast/cast_utils_unit.js +0 -311
  265. package/test/cea/cea608_memory_unit.js +0 -411
  266. package/test/cea/cea708_service_unit.js +0 -674
  267. package/test/cea/cea708_window_unit.js +0 -373
  268. package/test/cea/cea_decoder_unit.js +0 -615
  269. package/test/cea/dtvcc_packet_builder_unit.js +0 -158
  270. package/test/cea/dtvcc_packet_unit.js +0 -60
  271. package/test/cea/mp4_cea_parser_unit.js +0 -127
  272. package/test/codec_switching/codec_switching_integration.js +0 -182
  273. package/test/dash/dash_parser_content_protection_unit.js +0 -998
  274. package/test/dash/dash_parser_integration.js +0 -74
  275. package/test/dash/dash_parser_live_unit.js +0 -1542
  276. package/test/dash/dash_parser_manifest_unit.js +0 -3121
  277. package/test/dash/dash_parser_segment_base_unit.js +0 -421
  278. package/test/dash/dash_parser_segment_list_unit.js +0 -380
  279. package/test/dash/dash_parser_segment_template_unit.js +0 -910
  280. package/test/dash/mpd_utils_unit.js +0 -794
  281. package/test/demo/demo_unit.js +0 -108
  282. package/test/deprecate/enforcer_unit.js +0 -74
  283. package/test/deprecate/version_unit.js +0 -57
  284. package/test/hls/hls_live_unit.js +0 -1330
  285. package/test/hls/hls_parser_unit.js +0 -5276
  286. package/test/hls/manifest_text_parser_unit.js +0 -545
  287. package/test/media/adaptation_set_criteria_unit.js +0 -806
  288. package/test/media/adaptation_set_unit.js +0 -229
  289. package/test/media/buffering_observer_unit.js +0 -143
  290. package/test/media/closed_caption_parser_unit.js +0 -18
  291. package/test/media/content_workarounds_unit.js +0 -43
  292. package/test/media/drm_engine_integration.js +0 -356
  293. package/test/media/drm_engine_unit.js +0 -2805
  294. package/test/media/media_source_engine_integration.js +0 -691
  295. package/test/media/media_source_engine_unit.js +0 -1512
  296. package/test/media/mp4_segment_index_parser_unit.js +0 -80
  297. package/test/media/play_rate_controller_unit.js +0 -69
  298. package/test/media/playhead_unit.js +0 -1394
  299. package/test/media/presentation_timeline_unit.js +0 -477
  300. package/test/media/quality_observer_unit.js +0 -138
  301. package/test/media/region_observer_unit.js +0 -374
  302. package/test/media/region_timeline_unit.js +0 -139
  303. package/test/media/segment_index_unit.js +0 -1080
  304. package/test/media/segment_prefetch_unit.js +0 -243
  305. package/test/media/segment_reference_unit.js +0 -63
  306. package/test/media/stall_detector_unit.js +0 -184
  307. package/test/media/streaming_engine_integration.js +0 -632
  308. package/test/media/streaming_engine_unit.js +0 -4211
  309. package/test/media/time_ranges_utils_unit.js +0 -123
  310. package/test/media/webm_segment_index_parser_unit.js +0 -90
  311. package/test/mss/mss_parser_content_protection_unit.js +0 -49
  312. package/test/mss/mss_parser_unit.js +0 -474
  313. package/test/mss/mss_player_integration.js +0 -124
  314. package/test/net/data_uri_plugin_unit.js +0 -105
  315. package/test/net/http_plugin_unit.js +0 -439
  316. package/test/net/networking_engine_unit.js +0 -1236
  317. package/test/net/networking_utils_unit.js +0 -37
  318. package/test/offline/download_progress_estimator_unit.js +0 -90
  319. package/test/offline/indexeddb_storage_unit.js +0 -192
  320. package/test/offline/manifest_convert_unit.js +0 -622
  321. package/test/offline/offline_integration.js +0 -168
  322. package/test/offline/offline_manifest_parser_unit.js +0 -231
  323. package/test/offline/offline_scheme_unit.js +0 -154
  324. package/test/offline/offline_uri_unit.js +0 -59
  325. package/test/offline/storage_compatibility_unit.js +0 -344
  326. package/test/offline/storage_integration.js +0 -1858
  327. package/test/player_external.js +0 -237
  328. package/test/player_integration.js +0 -1371
  329. package/test/player_load_graph_integration.js +0 -865
  330. package/test/player_src_equals_external.js +0 -154
  331. package/test/player_src_equals_integration.js +0 -527
  332. package/test/player_unit.js +0 -4434
  333. package/test/polyfill/media_capabilities_unit.js +0 -277
  334. package/test/polyfill/patchedmediakeys_apple_unit.js +0 -130
  335. package/test/test/assets/3675/chunk-stream0-00001.m4s +0 -0
  336. package/test/test/assets/3675/chunk-stream0-00002.m4s +0 -0
  337. package/test/test/assets/3675/chunk-stream0-00003.m4s +0 -0
  338. package/test/test/assets/3675/chunk-stream0-00004.m4s +0 -0
  339. package/test/test/assets/3675/chunk-stream0-00005.m4s +0 -0
  340. package/test/test/assets/3675/chunk-stream0-00006.m4s +0 -0
  341. package/test/test/assets/3675/chunk-stream0-00007.m4s +0 -0
  342. package/test/test/assets/3675/dash_0.mpd +0 -30
  343. package/test/test/assets/3675/dash_1.mpd +0 -30
  344. package/test/test/assets/3675/dash_2.mpd +0 -30
  345. package/test/test/assets/3675/dash_3.mpd +0 -30
  346. package/test/test/assets/3675/dash_4.mpd +0 -30
  347. package/test/test/assets/3675/dash_5.mpd +0 -26
  348. package/test/test/assets/3675/init-stream0.m4s +0 -0
  349. package/test/test/assets/audio-xhe-aac.mp4 +0 -0
  350. package/test/test/assets/audio.ts +0 -0
  351. package/test/test/assets/captions-test.ts +0 -0
  352. package/test/test/assets/cea-init.mp4 +0 -0
  353. package/test/test/assets/cea-segment.mp4 +0 -0
  354. package/test/test/assets/chapters.srt +0 -11
  355. package/test/test/assets/chapters.vtt +0 -10
  356. package/test/test/assets/chapters2.vtt +0 -10
  357. package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
  358. package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
  359. package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
  360. package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
  361. package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
  362. package/test/test/assets/dash-aes-128/dash.mpd +0 -18
  363. package/test/test/assets/dash-aes-128/license +0 -1
  364. package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
  365. package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
  366. package/test/test/assets/dash-multi-codec/dash.mpd +0 -32
  367. package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
  368. package/test/test/assets/db-dump-v1.json +0 -1
  369. package/test/test/assets/db-dump-v2-broken.json +0 -1
  370. package/test/test/assets/db-dump-v2-clean.json +0 -1
  371. package/test/test/assets/db-dump-v3.json +0 -1
  372. package/test/test/assets/db-dump-v4-broken.json +0 -1
  373. package/test/test/assets/db-dump-v5.json +0 -1
  374. package/test/test/assets/empty_caption_video_init.mp4 +0 -0
  375. package/test/test/assets/empty_caption_video_segment.mp4 +0 -0
  376. package/test/test/assets/encrypted-sintel-audio-init.mp4 +0 -0
  377. package/test/test/assets/encrypted-sintel-audio-segment.mp4 +0 -0
  378. package/test/test/assets/encrypted-sintel-video-init.mp4 +0 -0
  379. package/test/test/assets/encrypted-sintel-video-segment.mp4 +0 -0
  380. package/test/test/assets/green-pixel.mp4 +0 -0
  381. package/test/test/assets/green-pixel.txt +0 -15
  382. package/test/test/assets/h265-cea-init.mp4 +0 -0
  383. package/test/test/assets/h265-cea-segment.mp4 +0 -0
  384. package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
  385. package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
  386. package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
  387. package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
  388. package/test/test/assets/hls-raw-aac/manifest.m3u8 +0 -4
  389. package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +0 -14
  390. package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
  391. package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
  392. package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
  393. package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
  394. package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
  395. package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
  396. package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
  397. package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
  398. package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +0 -31
  399. package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
  400. package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
  401. package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
  402. package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
  403. package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
  404. package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
  405. package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
  406. package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
  407. package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +0 -31
  408. package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +0 -13
  409. package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
  410. package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
  411. package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
  412. package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
  413. package/test/test/assets/hls-raw-mp3/playlist.m3u8 +0 -4
  414. package/test/test/assets/hls-ts-aac/playlist.m3u8 +0 -23
  415. package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
  416. package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
  417. package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
  418. package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
  419. package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
  420. package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
  421. package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
  422. package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
  423. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
  424. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
  425. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
  426. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
  427. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
  428. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
  429. package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +0 -19
  430. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
  431. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
  432. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
  433. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
  434. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
  435. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
  436. package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +0 -19
  437. package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
  438. package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
  439. package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
  440. package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
  441. package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
  442. package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
  443. package/test/test/assets/hls-ts-h264/prog_index.m3u8 +0 -25
  444. package/test/test/assets/hls-ts-h265/0.ts +0 -0
  445. package/test/test/assets/hls-ts-h265/hevc.m3u8 +0 -6
  446. package/test/test/assets/hls-ts-h265/index.m3u8 +0 -7
  447. package/test/test/assets/hls-ts-mp3/manifest.m3u8 +0 -13
  448. package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
  449. package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
  450. package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
  451. package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
  452. package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +0 -17
  453. package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
  454. package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
  455. package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
  456. package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
  457. package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
  458. package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
  459. package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +0 -4
  460. package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
  461. package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
  462. package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +0 -9
  463. package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +0 -24
  464. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
  465. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
  466. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
  467. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
  468. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
  469. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
  470. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
  471. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
  472. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
  473. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
  474. package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +0 -14
  475. package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +0 -23
  476. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
  477. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
  478. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
  479. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
  480. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
  481. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
  482. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
  483. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
  484. package/test/test/assets/id3-metadata.aac +0 -0
  485. package/test/test/assets/id3-metadata.ts +0 -0
  486. package/test/test/assets/index-segment.mp4 +0 -0
  487. package/test/test/assets/index-segment.webm +0 -0
  488. package/test/test/assets/init-segment.webm +0 -0
  489. package/test/test/assets/large_file.mpd +0 -4930
  490. package/test/test/assets/multidrm-audio-init.mp4 +0 -0
  491. package/test/test/assets/multidrm-audio-segment.mp4 +0 -0
  492. package/test/test/assets/multidrm-video-init.mp4 +0 -0
  493. package/test/test/assets/multidrm-video-segment.mp4 +0 -0
  494. package/test/test/assets/multiple-trun-init.mp4 +0 -0
  495. package/test/test/assets/multiple-trun-segment.mp4 +0 -0
  496. package/test/test/assets/sintel-audio-init.mp4 +0 -0
  497. package/test/test/assets/sintel-audio-segment.mp4 +0 -0
  498. package/test/test/assets/sintel-video-init.mp4 +0 -0
  499. package/test/test/assets/sintel-video-segment.mp4 +0 -0
  500. package/test/test/assets/small.mp4 +0 -0
  501. package/test/test/assets/text-clip-alt.vtt +0 -63
  502. package/test/test/assets/text-clip.vtt +0 -63
  503. package/test/test/assets/thumbnails-sprites.vtt +0 -10
  504. package/test/test/assets/thumbnails.vtt +0 -10
  505. package/test/test/assets/ttml-init.mp4 +0 -0
  506. package/test/test/assets/ttml-segment-multiplemdat.mp4 +0 -0
  507. package/test/test/assets/ttml-segment.mp4 +0 -0
  508. package/test/test/assets/video.ts +0 -0
  509. package/test/test/assets/vtt-init.mp4 +0 -0
  510. package/test/test/assets/vtt-segment-multi-payload.mp4 +0 -0
  511. package/test/test/assets/vtt-segment-no-duration.mp4 +0 -0
  512. package/test/test/assets/vtt-segment-settings.mp4 +0 -0
  513. package/test/test/assets/vtt-segment.mp4 +0 -0
  514. package/test/test/boot.js +0 -495
  515. package/test/test/externs/filters.js +0 -44
  516. package/test/test/externs/fontfaceonload.js +0 -29
  517. package/test/test/externs/jasmine.js +0 -670
  518. package/test/test/externs/karma.js +0 -26
  519. package/test/test/externs/require.js +0 -21
  520. package/test/test/externs/sprintf.js +0 -18
  521. package/test/test/namespace.js +0 -10
  522. package/test/test/util/canned_idb.js +0 -379
  523. package/test/test/util/cea_utils.js +0 -60
  524. package/test/test/util/dash_parser_util.js +0 -329
  525. package/test/test/util/fake_ad.js +0 -321
  526. package/test/test/util/fake_ad_manager.js +0 -122
  527. package/test/test/util/fake_demo_main.js +0 -144
  528. package/test/test/util/fake_drm_engine.js +0 -103
  529. package/test/test/util/fake_media_source_engine.js +0 -464
  530. package/test/test/util/fake_networking_engine.js +0 -381
  531. package/test/test/util/fake_segment_prefetch.js +0 -84
  532. package/test/test/util/fake_text_displayer.js +0 -60
  533. package/test/test/util/id3_generator.js +0 -100
  534. package/test/test/util/indexeddb_utils.js +0 -124
  535. package/test/test/util/jasmine_fetch.js +0 -382
  536. package/test/test/util/layout_tests.js +0 -435
  537. package/test/test/util/loader.js +0 -88
  538. package/test/test/util/manifest_generator.js +0 -705
  539. package/test/test/util/manifest_parser_util.js +0 -101
  540. package/test/test/util/mss_parser_util.js +0 -119
  541. package/test/test/util/offline_utils.js +0 -105
  542. package/test/test/util/simple_fakes.js +0 -535
  543. package/test/test/util/stream_generator.js +0 -676
  544. package/test/test/util/streaming_engine_util.js +0 -506
  545. package/test/test/util/test_scheme.js +0 -778
  546. package/test/test/util/ttml_utils.js +0 -77
  547. package/test/test/util/ui_utils.js +0 -183
  548. package/test/test/util/util.js +0 -374
  549. package/test/test/util/waiter.js +0 -406
  550. package/test/text/cue_integration.js +0 -51
  551. package/test/text/lrc_text_parser_unit.js +0 -98
  552. package/test/text/mp4_ttml_parser_unit.js +0 -171
  553. package/test/text/mp4_vtt_parser_unit.js +0 -195
  554. package/test/text/sbv_text_parser_unit.js +0 -81
  555. package/test/text/simple_text_displayer_unit.js +0 -468
  556. package/test/text/srt_text_parser_unit.js +0 -163
  557. package/test/text/ssa_text_parser_unit.js +0 -382
  558. package/test/text/text_displayer_layout_unit.js +0 -323
  559. package/test/text/text_engine_unit.js +0 -500
  560. package/test/text/text_track_integration.js +0 -186
  561. package/test/text/ttml_text_parser_unit.js +0 -2176
  562. package/test/text/ui_text_displayer_unit.js +0 -608
  563. package/test/text/vtt_text_parser_unit.js +0 -1363
  564. package/test/text/web_vtt_generator_unit.js +0 -144
  565. package/test/text/web_vtt_layout_integration.js +0 -524
  566. package/test/transmuxer/transmuxer_engine_integration.js +0 -69
  567. package/test/transmuxer/transmuxer_integration.js +0 -443
  568. package/test/ui/ad_ui_unit.js +0 -369
  569. package/test/ui/localization_unit.js +0 -508
  570. package/test/ui/ui_customization_unit.js +0 -208
  571. package/test/ui/ui_integration.js +0 -669
  572. package/test/ui/ui_unit.js +0 -902
  573. package/test/util/abortable_operation_unit.js +0 -624
  574. package/test/util/array_utils_unit.js +0 -58
  575. package/test/util/buffer_utils_unit.js +0 -185
  576. package/test/util/cmcd_manager_unit.js +0 -440
  577. package/test/util/content_steering_manager_unit.js +0 -427
  578. package/test/util/data_view_reader_unit.js +0 -254
  579. package/test/util/ebml_parser_unit.js +0 -297
  580. package/test/util/event_manager_unit.js +0 -185
  581. package/test/util/fake_event_target_unit.js +0 -123
  582. package/test/util/id3_utils_unit.js +0 -168
  583. package/test/util/iterables_unit.js +0 -68
  584. package/test/util/language_utils_unit.js +0 -240
  585. package/test/util/manifest_parser_utils_unit.js +0 -55
  586. package/test/util/mime_utils_unit.js +0 -64
  587. package/test/util/mp4_box_parsers_unit.js +0 -246
  588. package/test/util/mp4_parser_unit.js +0 -373
  589. package/test/util/multi_map_unit.js +0 -94
  590. package/test/util/object_utils_unit.js +0 -79
  591. package/test/util/periods_unit.js +0 -1623
  592. package/test/util/pssh_unit.js +0 -226
  593. package/test/util/state_history_unit.js +0 -101
  594. package/test/util/stream_utils_unit.js +0 -1068
  595. package/test/util/string_utils_unit.js +0 -166
  596. package/test/util/text_parser_unit.js +0 -165
  597. package/test/util/ts_parser_unit.js +0 -77
  598. package/test/util/xml_utils_unit.js +0 -444
@@ -1,2176 +0,0 @@
1
- /*! @license
2
- * Shaka Player
3
- * Copyright 2016 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- describe('TtmlTextParser', () => {
8
- const Cue = shaka.text.Cue;
9
- const CueRegion = shaka.text.CueRegion;
10
- const Util = shaka.test.Util;
11
- const anyString = jasmine.any(String);
12
-
13
- it('supports no cues', () => {
14
- verifyHelper([],
15
- '<tt></tt>',
16
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
17
- {});
18
- });
19
-
20
- it('supports empty text string', () => {
21
- verifyHelper([],
22
- '',
23
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
24
- {});
25
- });
26
-
27
- it('supports div with no cues but whitespace', () => {
28
- verifyHelper(
29
- [],
30
- '<tt><body><div> \r\n </div></body></tt>',
31
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
32
- {});
33
- });
34
-
35
- it('supports xml:space', () => {
36
- const ttBody =
37
- '<body><div>\n' +
38
- ' <p begin="01:02.03" end="01:02.05">\n' +
39
- ' <span> A B C </span>\n' +
40
- ' </p>\n' +
41
- '</div></body>\n';
42
-
43
- // When xml:space="default", ignore whitespace outside tags.
44
- verifyHelper(
45
- [
46
- {
47
- startTime: 62.03,
48
- endTime: 62.05,
49
- nestedCues: [{
50
- payload: 'A B C',
51
- startTime: 62.03,
52
- endTime: 62.05,
53
- }],
54
- payload: '',
55
- },
56
- ],
57
- '<tt xml:space="default">' + ttBody + '</tt>',
58
- {periodStart: 0, segmentStart: 60, segmentEnd: 70, vttOffset: 0},
59
- {startTime: 62.03, endTime: 62.05});
60
- // When xml:space="preserve", take them into account.
61
- verifyHelper(
62
- [
63
- {
64
- startTime: 62.03,
65
- endTime: 62.05,
66
- nestedCues: [{
67
- // anonymous span
68
- payload: '\n ',
69
- startTime: 62.03,
70
- endTime: 62.05,
71
- }, {
72
- payload: ' A B C ',
73
- startTime: 62.03,
74
- endTime: 62.05,
75
- }, {
76
- // anonymous span
77
- payload: '\n ',
78
- startTime: 62.03,
79
- endTime: 62.05,
80
- }],
81
- },
82
- ],
83
- '<tt xml:space="preserve">' + ttBody + '</tt>',
84
- {periodStart: 0, segmentStart: 60, segmentEnd: 70, vttOffset: 0},
85
- {startTime: 62.03, endTime: 62.05});
86
- // The default value for xml:space is "default".
87
- verifyHelper(
88
- [
89
- {
90
- startTime: 62.03,
91
- endTime: 62.05,
92
- nestedCues: [{
93
- payload: 'A B C',
94
- startTime: 62.03,
95
- endTime: 62.05,
96
- }],
97
- },
98
- ],
99
- '<tt>' + ttBody + '</tt>',
100
- {periodStart: 0, segmentStart: 60, segmentEnd: 70, vttOffset: 0},
101
- {startTime: 62.03, endTime: 62.05});
102
-
103
- // Any other value is rejected as an error.
104
- errorHelper(shaka.util.Error.Code.INVALID_XML,
105
- '<tt xml:space="invalid">' + ttBody + '</tt>',
106
- jasmine.any(String));
107
- });
108
-
109
- it('supports xml:space overriding default at span level', () => {
110
- const ttBody = '\n' +
111
- ' <body><div>\n' +
112
- ' <p begin="01:02.03" end="01:02.05">\n' +
113
- ' <span xml:space="preserve"> A B C </span>\n' +
114
- ' </p>\n' +
115
- ' </div></body>\n';
116
-
117
- // When xml:space="preserve", take them into account.
118
- verifyHelper(
119
- [
120
- {
121
- startTime: 62.03,
122
- endTime: 62.05,
123
- nestedCues: [{
124
- payload: ' A B C ',
125
- startTime: 62.03,
126
- endTime: 62.05,
127
- }],
128
- },
129
- ],
130
- '<tt>' + ttBody + '</tt>',
131
- {periodStart: 0, segmentStart: 60, segmentEnd: 70, vttOffset: 0},
132
- {startTime: 62.03, endTime: 62.05});
133
- });
134
-
135
- it('rejects invalid ttml', () => {
136
- errorHelper(shaka.util.Error.Code.INVALID_XML, '<test></test>', anyString);
137
- });
138
-
139
- it('rejects ttml with body>p instead of body>div', () => {
140
- errorHelper(
141
- shaka.util.Error.Code.INVALID_TEXT_CUE,
142
- '<tt><body><p></p></body></tt>',
143
- anyString);
144
- });
145
-
146
- it('rejects ttml with div>span instead of div>p', () => {
147
- errorHelper(
148
- shaka.util.Error.Code.INVALID_TEXT_CUE,
149
- '<tt><body><div><span></span></div></body></tt>',
150
- anyString);
151
- });
152
-
153
- it('rejects invalid time format', () => {
154
- const wrap = (ttmlCue) => {
155
- return `<tt><body><div>${ttmlCue}</div></body></tt>`;
156
- };
157
-
158
- errorHelper(
159
- shaka.util.Error.Code.INVALID_TEXT_CUE,
160
- wrap('<p begin="test" end="test">My very own cue</p>'),
161
- anyString);
162
-
163
- errorHelper(
164
- shaka.util.Error.Code.INVALID_TEXT_CUE,
165
- wrap('<p begin="3.45" end="1a">An invalid cue</p>'),
166
- anyString);
167
- });
168
-
169
- it('supports spans as nestedCues of paragraphs', () => {
170
- verifyHelper(
171
- [
172
- {
173
- startTime: 62.05,
174
- endTime: 3723.2,
175
- payload: '',
176
- nestedCues: [
177
- {
178
- payload: 'First cue',
179
- startTime: 62.05,
180
- endTime: 3723.2,
181
- },
182
- {
183
- payload: '',
184
- lineBreak: true,
185
- startTime: 62.05,
186
- endTime: 3723.2,
187
- },
188
- {
189
- payload: 'Second cue',
190
- startTime: 62.05,
191
- endTime: 3723.2,
192
- },
193
- ],
194
- },
195
- ],
196
- '<tt><body><div>' +
197
- '<p begin="01:02.05" end="01:02:03.200">' +
198
- '<span>First cue</span><br /><span>Second cue</span>' +
199
- '</p>' +
200
- '</div></body></tt>',
201
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
202
- {startTime: 62.05, endTime: 3723.2});
203
- });
204
-
205
- it('supports anonymous spans as nestedCues of paragraphs', () => {
206
- verifyHelper(
207
- [
208
- {
209
- startTime: 62.05,
210
- endTime: 3723.2,
211
- payload: '',
212
- nestedCues: [
213
- {
214
- payload: 'First cue',
215
- startTime: 62.05,
216
- endTime: 3723.2,
217
- },
218
- {
219
- payload: '',
220
- lineBreak: true,
221
- startTime: 62.05,
222
- endTime: 3723.2,
223
- },
224
- {
225
- payload: 'Second cue',
226
- startTime: 62.05,
227
- endTime: 3723.2,
228
- },
229
- ],
230
- },
231
- ],
232
- '<tt><body><div>' +
233
- '<p begin="01:02.05" end="01:02:03.200">' +
234
- 'First cue<br />Second cue' +
235
- '</p>' +
236
- '</div></body></tt>',
237
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
238
- {startTime: 62.05, endTime: 3723.2});
239
- });
240
-
241
- it('supports multiple levels of nestedCues', () => {
242
- verifyHelper(
243
- [
244
- {
245
- startTime: 62.05,
246
- endTime: 3723.2,
247
- payload: '',
248
- color: 'black',
249
- // cues in p container.
250
- nestedCues: [
251
- // anonymous span in p container.
252
- {
253
- payload: 'First cue',
254
- startTime: 62.05,
255
- endTime: 3723.2,
256
- },
257
- // container for Second cue and Third cue.
258
- {
259
- payload: '',
260
- startTime: 62.05,
261
- endTime: 3723.2,
262
- color: 'blue',
263
- nestedCues: [
264
- {
265
- payload: 'Second cue',
266
- startTime: 62.05,
267
- endTime: 3723.2,
268
- color: '',
269
- },
270
- {
271
- payload: 'Third cue',
272
- startTime: 62.05,
273
- endTime: 3723.2,
274
- color: 'green',
275
- },
276
- ],
277
- },
278
- ],
279
- },
280
- ],
281
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
282
- '<styling>' +
283
- '<style xml:id="black" tts:color="black" />' +
284
- '<style xml:id="blue" tts:color="blue" />' +
285
- '<style xml:id="green" tts:color="green" />' +
286
- '</styling>' +
287
-
288
- '<body><div>' +
289
- '<p begin="01:02.05" end="01:02:03.200" style="black">' +
290
- 'First cue' +
291
- '<span style="blue">Second cue' +
292
- '<span style="green">Third cue</span>' +
293
- '</span>' +
294
- '</p>' +
295
- '</div></body></tt>',
296
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
297
- {startTime: 62.05, endTime: 3723.2});
298
- });
299
-
300
- it('inherits timing information of nested cues if unprovided', () => {
301
- verifyHelper(
302
- [
303
- {
304
- startTime: 62.05,
305
- endTime: 3723.2,
306
- nestedCues: [
307
- {startTime: 62.05, endTime: 3723.2, payload: 'Test'},
308
- ],
309
- },
310
- ],
311
- '<tt><body>' +
312
- '<div><p begin="01:02.05" end="01:02:03.200">' +
313
- '<span>Test</span></p></div>' +
314
- '</body></tt>',
315
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
316
- {startTime: 62.05, endTime: 3723.2});
317
- });
318
-
319
- it('does not discard cues with image subcues', () => {
320
- verifyHelper(
321
- [
322
- {
323
- startTime: 62.05,
324
- endTime: 3723.2,
325
- nestedCues: [
326
- {
327
- startTime: 62.05,
328
- endTime: 3723.2,
329
- payload: '',
330
- backgroundImage: 'data:image/png;base64,base64EncodedImage',
331
- },
332
- ],
333
- },
334
- ],
335
- '<tt ' +
336
- 'xmlns:ttm="http://www.w3.org/ns/ttml#metadata" ' +
337
- 'xmlns:smpte="http://www.smpte-ra.org/schemas/2052-1/2010/smpte-tt">' +
338
- '<metadata>' +
339
- '<smpte:image imageType="PNG" encoding="Base64" xml:id="img_0">' +
340
- 'base64EncodedImage</smpte:image>' +
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: 60, segmentEnd: 3730, vttOffset: 0},
346
- {startTime: 62.05, endTime: 3723.2});
347
- });
348
-
349
- it('supports colon formatted time', () => {
350
- verifyHelper(
351
- [
352
- {startTime: 62.05, endTime: 3723.2, payload: 'Test'},
353
- ],
354
- '<tt><body><div>' +
355
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
356
- '</div></body></tt>',
357
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
358
- {startTime: 62.05, endTime: 3723.2});
359
- });
360
-
361
- it('accounts for offset', () => {
362
- verifyHelper(
363
- [
364
- {startTime: 69.05, endTime: 3730.2, payload: 'Test'},
365
- ],
366
- '<tt><body><div>' +
367
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
368
- '</div></body></tt>',
369
- {periodStart: 7, segmentStart: 60, segmentEnd: 3740, vttOffset: 0},
370
- {startTime: 69.05, endTime: 3730.2});
371
- });
372
-
373
- it('supports nested cues with an offset', () => {
374
- verifyHelper(
375
- [
376
- {
377
- startTime: 69.05,
378
- endTime: 3730.2,
379
- payload: '',
380
- nestedCues: [
381
- {
382
- payload: 'Nested cue',
383
- startTime: 69.05,
384
- endTime: 3730.2,
385
- },
386
- ],
387
- },
388
- ],
389
- '<tt><body><div>' +
390
- '<p begin="01:02.05" end="01:02:03.200"><span>Nested cue</span></p>' +
391
- '</div></body></tt>',
392
- {periodStart: 7, segmentStart: 60, segmentEnd: 3740, vttOffset: 0},
393
- {startTime: 69.05, endTime: 3730.2});
394
- });
395
-
396
- it('supports time in 0.00h 0.00m 0.00s format', () => {
397
- verifyHelper(
398
- [
399
- {startTime: 3567.03, endTime: 5402.3, payload: 'Test'},
400
- ],
401
- '<tt><body><div>' +
402
- '<p begin="59.45m30ms" end="1.5h2.3s">Test</p>' +
403
- '</div></body></tt>',
404
- {periodStart: 0, segmentStart: 3560, segmentEnd: 5410, vttOffset: 0},
405
- {startTime: 3567.03, endTime: 5402.3});
406
- });
407
-
408
- it('supports time with frame rate', () => {
409
- verifyHelper(
410
- [
411
- {startTime: 615.5, endTime: 663, payload: 'Test'},
412
- ],
413
- '<tt xmlns:ttp="http://www.w3.org/ns/ttml#parameter" ' +
414
- 'ttp:frameRate="30"> ' +
415
- '<body><div>' +
416
- '<p begin="00:10:15:15" end="00:11:02:30">Test</p>' +
417
- '</div></body></tt>',
418
- {periodStart: 0, segmentStart: 610, segmentEnd: 670, vttOffset: 0},
419
- {startTime: 615.5, endTime: 663});
420
- });
421
-
422
- it('supports time with frame rate multiplier', () => {
423
- verifyHelper(
424
- [
425
- {startTime: 615.5, endTime: 663, payload: 'Test'},
426
- ],
427
- '<tt xmlns:ttp="http://www.w3.org/ns/ttml#parameter" ' +
428
- 'ttp:frameRate="60" ttp:frameRateMultiplier="1 2"> ' +
429
- '<body><div>' +
430
- '<p begin="00:10:15:15" end="00:11:02:30">Test</p>' +
431
- '</div></body></tt>',
432
- {periodStart: 0, segmentStart: 610, segmentEnd: 670, vttOffset: 0},
433
- {startTime: 615.5, endTime: 663});
434
- });
435
-
436
- it('supports time with subframes', () => {
437
- verifyHelper(
438
- [
439
- {
440
- startTime: Util.closeTo(615.5 + 1 / 60),
441
- endTime: 663,
442
- payload: 'Test',
443
- },
444
- ],
445
- '<tt xmlns:ttp="http://www.w3.org/ns/ttml#parameter" ' +
446
- 'ttp:frameRate="30" ttp:subFrameRate="2"> ' +
447
- '<body><div>' +
448
- '<p begin="00:10:15:15.1" end="00:11:02:29.2">Test</p>' +
449
- '</div></body></tt>',
450
- {periodStart: 0, segmentStart: 610, segmentEnd: 670, vttOffset: 0},
451
- {startTime: Util.closeTo(615.5 + 1 / 60), endTime: 663});
452
- });
453
-
454
- it('supports time in frame format', () => {
455
- verifyHelper(
456
- [
457
- {startTime: 2.5, endTime: Util.closeTo(10.01), payload: 'Test'},
458
- ],
459
- '<tt xmlns:ttp="http://www.w3.org/ns/ttml#parameter" ' +
460
- 'ttp:frameRate="60" ttp:frameRateMultiplier="1 2">' +
461
- '<body><div>' +
462
- '<p begin="75f" end="300.3f">Test</p>' +
463
- '</div></body></tt>',
464
- {periodStart: 0, segmentStart: 0, segmentEnd: 20, vttOffset: 0},
465
- {startTime: 2.5, endTime: Util.closeTo(10.01)});
466
- });
467
-
468
- it('supports time in tick format', () => {
469
- verifyHelper(
470
- [
471
- {startTime: 5, endTime: Util.closeTo(6.02), payload: 'Test'},
472
- ],
473
- '<tt xmlns:ttp="http://www.w3.org/ns/ttml#parameter" ' +
474
- 'ttp:frameRate="60" ttp:tickRate="10">' +
475
- '<body><div>' +
476
- '<p begin="50t" end="60.2t">Test</p>' +
477
- '</div></body></tt>',
478
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
479
- {startTime: 5, endTime: Util.closeTo(6.02)});
480
- });
481
-
482
- it('supports time with duration', () => {
483
- verifyHelper(
484
- [
485
- {startTime: 62.05, endTime: 67.05, payload: 'Test'},
486
- ],
487
- '<tt><body><div>' +
488
- '<p begin="01:02.05" dur="5s">Test</p>' +
489
- '</div></body></tt>',
490
- {periodStart: 0, segmentStart: 60, segmentEnd: 70, vttOffset: 0},
491
- {startTime: 62.05, endTime: 67.05});
492
- });
493
-
494
- it('supports comments in the body', () => {
495
- verifyHelper(
496
- [],
497
- '<tt><body><div>' +
498
- '<!-- text-based TTML -->' +
499
- '</div></body></tt>',
500
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 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: 60, segmentEnd: 3730, vttOffset: 0},
521
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
522
- {startTime: 62.05, endTime: 3723.2});
523
- });
524
-
525
- it('parses alignment from textAlign attribute of a region', () => {
526
- verifyHelper(
527
- [
528
- {
529
- startTime: 62.05,
530
- endTime: 3723.2,
531
- payload: 'Test',
532
- lineAlign: Cue.textAlign.START,
533
- },
534
- ],
535
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
536
- '<layout>' +
537
- '<region xml:id="subtitleArea" tts:textAlign="start" />' +
538
- '</layout>' +
539
- '<body region="subtitleArea"><div>' +
540
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
541
- '</div></body></tt>',
542
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
543
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
544
- {startTime: 62.05, endTime: 3723.2});
545
- });
546
-
547
- it('allows non-standard namespace names', () => {
548
- verifyHelper(
549
- [
550
- {
551
- startTime: 62.05,
552
- endTime: 3723.2,
553
- payload: 'Test',
554
- lineAlign: Cue.textAlign.START,
555
- },
556
- ],
557
- '<tt xmlns:p1="http://www.w3.org/ns/ttml#styling">' +
558
- '<layout>' +
559
- '<region xml:id="subtitleArea" p1:textAlign="start" />' +
560
- '</layout>' +
561
- '<body region="subtitleArea"><div>' +
562
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
563
- '</div></body></tt>',
564
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
565
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
566
- {startTime: 62.05, endTime: 3723.2});
567
- });
568
-
569
- it('parses alignment from <style> block with id on region', () => {
570
- verifyHelper(
571
- [
572
- {
573
- startTime: 62.05,
574
- endTime: 3723.2,
575
- payload: 'Test',
576
- lineAlign: Cue.textAlign.END,
577
- },
578
- ],
579
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
580
- '<styling>' +
581
- '<style xml:id="s1" tts:textAlign="end"/>' +
582
- '</styling>' +
583
- '<layout>' +
584
- '<region xml:id="subtitleArea" style="s1" />' +
585
- '</layout>' +
586
- '<body region="subtitleArea"><div>' +
587
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
588
- '</div></body></tt>',
589
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
590
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
591
- {startTime: 62.05, endTime: 3723.2});
592
- });
593
-
594
- it('parses alignment from <style> block with id on p', () => {
595
- verifyHelper(
596
- [
597
- {
598
- startTime: 62.05,
599
- endTime: 3723.2,
600
- payload: 'Test',
601
- lineAlign: Cue.textAlign.END,
602
- },
603
- ],
604
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
605
- '<styling>' +
606
- '<style xml:id="s1" tts:textAlign="end"/>' +
607
- '</styling>' +
608
- '<layout>' +
609
- '<region xml:id="subtitleArea" />' +
610
- '</layout>' +
611
- '<body region="subtitleArea"><div>' +
612
- '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
613
- '</div></body></tt>',
614
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
615
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
616
- {startTime: 62.05, endTime: 3723.2});
617
- });
618
-
619
- it('supports region settings for horizontal text', () => {
620
- verifyHelper(
621
- [
622
- {
623
- startTime: 62.05,
624
- endTime: 3723.2,
625
- payload: 'Test',
626
- },
627
- ],
628
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
629
- '<layout>' +
630
- '<region xml:id="subtitleArea" tts:origin="50% 16%"/>' +
631
- '</layout>' +
632
- '<body region="subtitleArea"><div>' +
633
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
634
- '</div></body></tt>',
635
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 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});
647
-
648
- verifyHelper(
649
- [
650
- {
651
- startTime: 62.05,
652
- endTime: 3723.2,
653
- payload: 'Test',
654
- },
655
- ],
656
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
657
- '<layout>' +
658
- '<region xml:id="subtitleArea" tts:origin="50% 16%" ' +
659
- 'tts:writingMode="lrtb" />' +
660
- '</layout>' +
661
- '<body region="subtitleArea"><div>' +
662
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
663
- '</div></body></tt>',
664
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 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});
675
-
676
- verifyHelper(
677
- [
678
- {
679
- startTime: 62.05,
680
- endTime: 3723.2,
681
- payload: 'Test',
682
- },
683
- ],
684
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
685
- '<layout>' +
686
- '<region xml:id="subtitleArea" tts:origin="50% 16%" ' +
687
- 'tts:writingMode="lr" />' +
688
- '</layout>' +
689
- '<body region="subtitleArea"><div>' +
690
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
691
- '</div></body></tt>',
692
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 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});
703
- });
704
-
705
- it('supports region settings in pixels (origin)', () => {
706
- verifyHelper(
707
- [
708
- {
709
- startTime: 62.05,
710
- endTime: 3723.2,
711
- payload: 'Test',
712
- },
713
- ],
714
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
715
- '<layout>' +
716
- '<region xml:id="subtitleArea" tts:origin="50px 16px"/>' +
717
- '</layout>' +
718
- '<body region="subtitleArea"><div>' +
719
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
720
- '</div></body></tt>',
721
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 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});
739
- });
740
-
741
- it('supports region settings in pixels (extent)', () => {
742
- verifyHelper(
743
- [
744
- {
745
- startTime: 62.05,
746
- endTime: 3723.2,
747
- payload: 'Test',
748
- },
749
- ],
750
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
751
- '<layout>' +
752
- '<region xml:id="subtitleArea" tts:extent="50px 16px"/>' +
753
- '</layout>' +
754
- '<body region="subtitleArea"><div>' +
755
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
756
- '</div></body></tt>',
757
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 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});
775
- });
776
-
777
- it('supports region settings in pixels: origin (with global extent)', () => {
778
- verifyHelper(
779
- [
780
- {
781
- startTime: 62.05,
782
- endTime: 3723.2,
783
- payload: 'Test',
784
- },
785
- ],
786
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
787
- '<layout>' +
788
- '<region xml:id="subtitleArea" tts:origin="192px 108px"/>' +
789
- '</layout>' +
790
- '<body region="subtitleArea"><div>' +
791
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
792
- '</div></body></tt>',
793
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 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});
811
- });
812
-
813
- it('supports region settings in pixels: extent (with global extent)', () => {
814
- verifyHelper(
815
- [
816
- {
817
- startTime: 62.05,
818
- endTime: 3723.2,
819
- payload: 'Test',
820
- },
821
- ],
822
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" tts:extent="1920px 1080px">' +
823
- '<layout>' +
824
- '<region xml:id="subtitleArea" tts:extent="576px 324px" ' +
825
- 'tts:writingMode="lrtb" />' +
826
- '</layout>' +
827
- '<body region="subtitleArea"><div>' +
828
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
829
- '</div></body></tt>',
830
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 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});
848
- });
849
-
850
- it('supports region settings in percentage (origin)', () => {
851
- verifyHelper(
852
- [
853
- {
854
- startTime: 62.05,
855
- endTime: 3723.2,
856
- payload: 'Test',
857
- },
858
- ],
859
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" ' +
860
- 'tts:extent="1920px 1080px">' +
861
- '<layout>' +
862
- '<region xml:id="subtitleArea" tts:origin="50% 16%"/>' +
863
- '</layout>' +
864
- '<body region="subtitleArea"><div>' +
865
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
866
- '</div></body></tt>',
867
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 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});
885
- });
886
-
887
- it('supports region settings in percentage (extent)', () => {
888
- verifyHelper(
889
- [
890
- {
891
- startTime: 62.05,
892
- endTime: 3723.2,
893
- payload: 'Test',
894
- },
895
- ],
896
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling" ' +
897
- 'tts:extent="1920px 1080px">' +
898
- '<layout>' +
899
- '<region xml:id="subtitleArea" tts:extent="50% 16%" ' +
900
- 'tts:writingMode="lrtb" />' +
901
- '</layout>' +
902
- '<body region="subtitleArea"><div>' +
903
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
904
- '</div></body></tt>',
905
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 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});
923
- });
924
-
925
- it('supports region settings for vertical text', () => {
926
- verifyHelper(
927
- [
928
- {
929
- startTime: 62.05,
930
- endTime: 3723.2,
931
- payload: 'Test',
932
- },
933
- ],
934
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
935
- '<layout>' +
936
- '<region xml:id="subtitleArea" tts:origin="50% 16%" ' +
937
- 'tts:writingMode="tb" />' +
938
- '</layout>' +
939
- '<body region="subtitleArea"><div>' +
940
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
941
- '</div></body></tt>',
942
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 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});
954
-
955
- verifyHelper(
956
- [
957
- {
958
- startTime: 62.05,
959
- endTime: 3723.2,
960
- payload: 'Test',
961
- },
962
- ],
963
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
964
- '<layout>' +
965
- '<region xml:id="subtitleArea" tts:origin="50% 16%" ' +
966
- 'tts:writingMode="tblr" />' +
967
- '</layout>' +
968
- '<body region="subtitleArea"><div>' +
969
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
970
- '</div></body></tt>',
971
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 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});
982
-
983
- verifyHelper(
984
- [
985
- {
986
- startTime: 62.05,
987
- endTime: 3723.2,
988
- payload: 'Test',
989
- },
990
- ],
991
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
992
- '<layout>' +
993
- '<region xml:id="subtitleArea" tts:origin="50% 16%" ' +
994
- 'tts:writingMode="tbrl" />' +
995
- '</layout>' +
996
- '<body region="subtitleArea"><div>' +
997
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
998
- '</div></body></tt>',
999
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 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});
1010
- });
1011
-
1012
- it('supports percentages containing decimals', () => {
1013
- verifyHelper(
1014
- [
1015
- {
1016
- startTime: 62.05,
1017
- endTime: 3723.2,
1018
- payload: 'Test',
1019
- },
1020
- ],
1021
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1022
- '<layout>' +
1023
- '<region xml:id="subtitleArea" tts:origin="12.2% 50.005%" ' +
1024
- 'tts:writingMode="tb" />' +
1025
- '</layout>' +
1026
- '<body region="subtitleArea"><div>' +
1027
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1028
- '</div></body></tt>',
1029
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 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});
1041
- });
1042
-
1043
- it('supports writingMode setting', () => {
1044
- verifyHelper(
1045
- [
1046
- {
1047
- startTime: 62.05,
1048
- endTime: 3723.2,
1049
- payload: 'Test',
1050
- writingMode: Cue.writingMode.VERTICAL_LEFT_TO_RIGHT,
1051
- },
1052
- ],
1053
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1054
- '<layout>' +
1055
- '<region xml:id="subtitleArea" ' +
1056
- 'tts:writingMode="tb" />' +
1057
- '</layout>' +
1058
- '<body region="subtitleArea"><div>' +
1059
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1060
- '</div></body></tt>',
1061
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1062
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1063
- {startTime: 62.05, endTime: 3723.2});
1064
-
1065
- verifyHelper(
1066
- [
1067
- {
1068
- startTime: 62.05,
1069
- endTime: 3723.2,
1070
- payload: 'Test',
1071
- writingMode: Cue.writingMode.VERTICAL_RIGHT_TO_LEFT,
1072
- },
1073
- ],
1074
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1075
- '<layout>' +
1076
- '<region xml:id="subtitleArea" ' +
1077
- 'tts:writingMode="tbrl" />' +
1078
- '</layout>' +
1079
- '<body region="subtitleArea"><div>' +
1080
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1081
- '</div></body></tt>',
1082
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1083
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1084
- {startTime: 62.05, endTime: 3723.2});
1085
-
1086
- verifyHelper(
1087
- [
1088
- {
1089
- startTime: 62.05,
1090
- endTime: 3723.2,
1091
- payload: 'Test',
1092
- writingMode: Cue.writingMode.VERTICAL_LEFT_TO_RIGHT,
1093
- },
1094
- ],
1095
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1096
- '<layout>' +
1097
- '<region xml:id="subtitleArea" ' +
1098
- 'tts:writingMode="tblr" />' +
1099
- '</layout>' +
1100
- '<body region="subtitleArea"><div>' +
1101
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1102
- '</div></body></tt>',
1103
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1104
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1105
- {startTime: 62.05, endTime: 3723.2});
1106
-
1107
- verifyHelper(
1108
- [
1109
- {
1110
- startTime: 62.05,
1111
- endTime: 3723.2,
1112
- payload: 'Test',
1113
- direction: Cue.direction.HORIZONTAL_RIGHT_TO_LEFT,
1114
- },
1115
- ],
1116
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1117
- '<layout>' +
1118
- '<region xml:id="subtitleArea" ' +
1119
- 'tts:direction="rtl" />' +
1120
- '</layout>' +
1121
- '<body region="subtitleArea"><div>' +
1122
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1123
- '</div></body></tt>',
1124
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1125
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1126
- {startTime: 62.05, endTime: 3723.2});
1127
-
1128
- verifyHelper(
1129
- [
1130
- {
1131
- startTime: 62.05,
1132
- endTime: 3723.2,
1133
- payload: 'Test',
1134
- direction: Cue.direction.HORIZONTAL_LEFT_TO_RIGHT,
1135
- },
1136
- ],
1137
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1138
- '<layout>' +
1139
- '<region xml:id="subtitleArea" ' +
1140
- 'tts:direction="rtl" tts:writingMode="lrtb"/>' +
1141
- '</layout>' +
1142
- '<body region="subtitleArea"><div>' +
1143
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1144
- '</div></body></tt>',
1145
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1146
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1147
- {startTime: 62.05, endTime: 3723.2});
1148
- });
1149
-
1150
- it('supports textCombine setting', () => {
1151
- verifyHelper(
1152
- [
1153
- {
1154
- startTime: 62.05,
1155
- endTime: 3723.2,
1156
- payload: 'Test',
1157
- textCombineUpright: 'all',
1158
- writingMode: Cue.writingMode.VERTICAL_LEFT_TO_RIGHT,
1159
- },
1160
- ],
1161
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1162
- '<layout>' +
1163
- '<region xml:id="subtitleArea" ' +
1164
- 'tts:writingMode="tb" ' +
1165
- 'tts:textCombine="all"/>' +
1166
- '</layout>' +
1167
- '<body region="subtitleArea"><div>' +
1168
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1169
- '</div></body></tt>',
1170
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1171
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1172
- {startTime: 62.05, endTime: 3723.2});
1173
- });
1174
-
1175
- it('disregards empty divs and ps', () => {
1176
- verifyHelper(
1177
- [
1178
- {startTime: 62.05, endTime: 3723.2, payload: 'Test'},
1179
- ],
1180
- '<tt>' +
1181
- '<body>' +
1182
- '<div>' +
1183
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1184
- '</div>' +
1185
- '<div></div>' +
1186
- '</body>' +
1187
- '</tt>',
1188
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1189
- {startTime: 62.05, endTime: 3723.2});
1190
-
1191
- verifyHelper(
1192
- [
1193
- {startTime: 62.05, endTime: 3723.2, payload: 'Test'},
1194
- ],
1195
- '<tt>' +
1196
- '<body>' +
1197
- '<div>' +
1198
- '<p begin="01:02.05" end="01:02:03.200">Test</p>' +
1199
- '<p></p>' +
1200
- '</div>' +
1201
- '</body>' +
1202
- '</tt>',
1203
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1204
- {startTime: 62.05, endTime: 3723.2});
1205
-
1206
- verifyHelper(
1207
- [],
1208
- '<tt>' +
1209
- '<body>' +
1210
- '<div>' +
1211
- '<p></p>' +
1212
- '</div>' +
1213
- '<div></div>' +
1214
- '</body>' +
1215
- '</tt>',
1216
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1217
- {});
1218
- });
1219
-
1220
- it('should let empty paragraphs with begin or end attributes through', () => {
1221
- verifyHelper(
1222
- [
1223
- {startTime: 62.05, endTime: 3723.2, payload: ''},
1224
- ],
1225
- '<tt>' +
1226
- '<body>' +
1227
- '<div>' +
1228
- '<p begin="01:02.05" end="01:02:03.200" />' +
1229
- '<p></p>' +
1230
- '</div>' +
1231
- '</body>' +
1232
- '</tt>',
1233
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1234
- {startTime: 62.05, endTime: 3723.2});
1235
- });
1236
-
1237
- it('supports smpte:backgroundImage attribute', () => {
1238
- verifyHelper(
1239
- [
1240
- {
1241
- startTime: 62.05,
1242
- endTime: 3723.2,
1243
- payload: '',
1244
- },
1245
- ],
1246
- '<tt ' +
1247
- 'xmlns:ttm="http://www.w3.org/ns/ttml#metadata" ' +
1248
- 'xmlns:smpte="http://www.smpte-ra.org/schemas/2052-1/2010/smpte-tt">' +
1249
- '<metadata>' +
1250
- '<smpte:image imageType="PNG" encoding="Base64" xml:id="img_0">' +
1251
- 'base64EncodedImage</smpte:image>' +
1252
- '</metadata>' +
1253
- '<body><div smpte:backgroundImage="#img_0">' +
1254
- '<p begin="01:02.05" end="01:02:03.200"></p>' +
1255
- '</div></body></tt>',
1256
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1257
- {startTime: 62.05, endTime: 3723.2},
1258
- {
1259
- startTime: 62.05,
1260
- endTime: 3723.2,
1261
- backgroundImage: 'data:image/png;base64,base64EncodedImage',
1262
- isContainer: false,
1263
- });
1264
- });
1265
-
1266
- it('supports smpte:backgroundImage attribute with url', () => {
1267
- verifyHelper(
1268
- [
1269
- {
1270
- startTime: 62.05,
1271
- endTime: 3723.2,
1272
- payload: '',
1273
- },
1274
- ],
1275
- '<tt ' +
1276
- 'xmlns:ttm="http://www.w3.org/ns/ttml#metadata" ' +
1277
- 'xmlns:smpte="http://www.smpte-ra.org/schemas/2052-1/2010/smpte-tt">' +
1278
- '<metadata>' +
1279
- '<smpte:image imageType="PNG" encoding="Base64" xml:id="img_0">' +
1280
- 'base64EncodedImage</smpte:image>' +
1281
- '</metadata>' +
1282
- '<body><div smpte:backgroundImage="img_0.png">' +
1283
- '<p begin="01:02.05" end="01:02:03.200"></p>' +
1284
- '</div></body></tt>',
1285
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1286
- {startTime: 62.05, endTime: 3723.2},
1287
- {
1288
- startTime: 62.05,
1289
- endTime: 3723.2,
1290
- backgroundImage: 'foo://bar/img_0.png',
1291
- isContainer: false,
1292
- });
1293
- });
1294
-
1295
- it('supports smpte:backgroundImage attribute in div element', () => {
1296
- verifyHelper(
1297
- [],
1298
- '<tt ' +
1299
- 'xmlns:ttm="http://www.w3.org/ns/ttml#metadata" ' +
1300
- 'xmlns:smpte="http://www.smpte-ra.org/schemas/2052-1/2010/smpte-tt">' +
1301
- '<metadata>' +
1302
- '<smpte:image imageType="PNG" encoding="Base64" xml:id="img_0">' +
1303
- 'base64EncodedImage</smpte:image>' +
1304
- '</metadata>' +
1305
- '<body><div begin="00:00.00" end="01:02.05" '+
1306
- 'smpte:backgroundImage="#img_0"></div>' +
1307
- '</body></tt>',
1308
- {periodStart: 0, segmentStart: 0, segmentEnd: 70, vttOffset: 0},
1309
- {startTime: 0, endTime: 62.05},
1310
- {
1311
- startTime: 0,
1312
- endTime: 62.05,
1313
- backgroundImage: 'data:image/png;base64,base64EncodedImage',
1314
- isContainer: false,
1315
- });
1316
- });
1317
-
1318
- it('supports smpte:backgroundImage attribute alt namespace', () => {
1319
- verifyHelper(
1320
- [
1321
- {
1322
- startTime: 62.05,
1323
- endTime: 3723.2,
1324
- payload: '',
1325
- backgroundImage: 'data:image/png;base64,base64EncodedImage',
1326
- },
1327
- ],
1328
- '<tt ' +
1329
- 'xmlns:ttm="http://www.w3.org/ns/ttml#metadata" ' +
1330
- 'xmlns:smpte="http://www.smpte-ra.org/schemas/2052-1/2013/smpte-tt">' +
1331
- '<metadata>' +
1332
- '<smpte:image imageType="PNG" encoding="Base64" xml:id="img_0">' +
1333
- 'base64EncodedImage</smpte:image>' +
1334
- '</metadata>' +
1335
- '<body><div>' +
1336
- '<p begin="01:02.05" end="01:02:03.200" ' +
1337
- 'smpte:backgroundImage="#img_0" />' +
1338
- '</div></body></tt>',
1339
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1340
- {startTime: 62.05, endTime: 3723.2});
1341
- });
1342
-
1343
- it('supports tts:ruby', () => {
1344
- verifyHelper(
1345
- [{
1346
- startTime: 62.05,
1347
- endTime: 3723.2,
1348
- payload: '',
1349
- nestedCues: [{
1350
- startTime: 62.05,
1351
- endTime: 3723.2,
1352
- payload: 'Line1',
1353
- }, {
1354
- startTime: 62.05,
1355
- endTime: 3723.2,
1356
- payload: 'Line2',
1357
- rubyTag: 'rt',
1358
- }],
1359
- rubyTag: 'ruby',
1360
- }],
1361
- // With anonymous spans
1362
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling"><body><div>' +
1363
- '<p begin="01:02.05" end="01:02:03.200" tts:ruby="container">' +
1364
- '<span tts:ruby="base">Line1</span><span tts:ruby="text">Line2' +
1365
- '</span></p></div></body></tt>',
1366
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1367
- {startTime: 62.05, endTime: 3723.2});
1368
- });
1369
-
1370
- it('inserts line breaks for <br> tags', () => {
1371
- verifyHelper(
1372
- [{
1373
- startTime: 62.05,
1374
- endTime: 3723.2,
1375
- payload: '',
1376
- nestedCues: [{
1377
- startTime: 62.05,
1378
- endTime: 3723.2,
1379
- payload: 'Line1',
1380
- }, {
1381
- startTime: 62.05,
1382
- endTime: 3723.2,
1383
- payload: '',
1384
- lineBreak: true,
1385
- }, {
1386
- startTime: 62.05,
1387
- endTime: 3723.2,
1388
- payload: 'Line2',
1389
- }],
1390
- }],
1391
- // With anonymous spans
1392
- '<tt><body><div>' +
1393
- '<p begin="01:02.05" end="01:02:03.200">Line1<br/>Line2</p>' +
1394
- '</div></body></tt>',
1395
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1396
- {startTime: 62.05, endTime: 3723.2});
1397
-
1398
- verifyHelper(
1399
- [{
1400
- startTime: 62.05,
1401
- endTime: 3723.2,
1402
- payload: '',
1403
- nestedCues: [{
1404
- startTime: 62.05,
1405
- endTime: 3723.2,
1406
- payload: '',
1407
- nestedCues: [{
1408
- startTime: 62.05,
1409
- endTime: 3723.2,
1410
- payload: 'Line1',
1411
- }, {
1412
- startTime: 62.05,
1413
- endTime: 3723.2,
1414
- payload: '',
1415
- lineBreak: true,
1416
- }, {
1417
- startTime: 62.05,
1418
- endTime: 3723.2,
1419
- payload: 'Line2',
1420
- }],
1421
- }],
1422
- }],
1423
- // With explicit spans
1424
- '<tt><body><div>' +
1425
- '<p begin="01:02.05" end="01:02:03.200">' +
1426
- '<span>Line1<br/>Line2</span>' +
1427
- '</p>' +
1428
- '</div></body></tt>',
1429
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1430
- {startTime: 62.05, endTime: 3723.2});
1431
- });
1432
-
1433
- it('allows old-standard namespace', () => {
1434
- verifyHelper(
1435
- [
1436
- {
1437
- startTime: 1,
1438
- endTime: 2,
1439
- payload: 'Test',
1440
- cellResolution: {
1441
- columns: 60,
1442
- rows: 20,
1443
- },
1444
- fontSize: '67%',
1445
- },
1446
- ],
1447
- '<tt ' +
1448
- 'xmlns:ttp="http://www.w3.org/2006/10/ttaf1#parameter" ' +
1449
- 'xmlns:tts="http://www.w3.org/2006/10/ttaf1#styling" ' +
1450
- 'ttp:cellResolution="60 20">' +
1451
- '<styling>' +
1452
- '<style xml:id="s1" tts:fontSize="67%"/>' +
1453
- '</styling>' +
1454
- '<body><div>' +
1455
- '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1456
- '</div></body></tt>',
1457
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
1458
- {startTime: 1, endTime: 2});
1459
- });
1460
-
1461
- it('parses cue alignment from textAlign attribute', () => {
1462
- verifyHelper(
1463
- [
1464
- {
1465
- startTime: 62.05,
1466
- endTime: 3723.2,
1467
- payload: 'Test',
1468
- lineAlign: Cue.lineAlign.START,
1469
- textAlign: Cue.textAlign.LEFT,
1470
- positionAlign: Cue.positionAlign.LEFT,
1471
- },
1472
- ],
1473
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1474
- '<styling>' +
1475
- '<style xml:id="s1" tts:textAlign="left"/>' +
1476
- '</styling>' +
1477
- '<layout>' +
1478
- '<region xml:id="subtitleArea" />' +
1479
- '</layout>' +
1480
- '<body region="subtitleArea"><div>' +
1481
- '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
1482
- '</div></body></tt>',
1483
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1484
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1485
- {startTime: 62.05, endTime: 3723.2});
1486
- });
1487
-
1488
- it('parses text style information', () => {
1489
- verifyHelper(
1490
- [
1491
- {
1492
- startTime: 1,
1493
- endTime: 2,
1494
- payload: 'Test',
1495
- color: 'red',
1496
- backgroundColor: 'blue',
1497
- fontWeight: Cue.fontWeight.BOLD,
1498
- fontFamily: 'Times New Roman',
1499
- fontStyle: Cue.fontStyle.ITALIC,
1500
- lineHeight: '20px',
1501
- fontSize: '10em',
1502
- textStrokeColor: 'blue',
1503
- textStrokeWidth: '3px',
1504
- },
1505
- {
1506
- startTime: 2,
1507
- endTime: 4,
1508
- payload: 'Test 2',
1509
- fontSize: '0.80c',
1510
- },
1511
- ],
1512
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1513
- '<styling>' +
1514
- '<style xml:id="s1" tts:color="red" ' +
1515
- 'tts:textOutline="blue 3px" ' +
1516
- 'tts:backgroundColor="blue" ' +
1517
- 'tts:fontWeight="bold" ' +
1518
- 'tts:fontFamily="Times New Roman" ' +
1519
- 'tts:fontStyle="italic" ' +
1520
- 'tts:lineHeight="20px" ' +
1521
- 'tts:fontSize="10em"/>' +
1522
- '<style xml:id="s2" tts:fontSize="0.80c" />' +
1523
- '</styling>' +
1524
- '<layout>' +
1525
- '<region xml:id="subtitleArea" />' +
1526
- '</layout>' +
1527
- '<body region="subtitleArea"><div>' +
1528
- '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1529
- '<p begin="00:02.00" end="00:04.00" style="s2">Test 2</p>' +
1530
- '</div></body></tt>',
1531
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
1532
- {startTime: 1, endTime: 4, region: {id: 'subtitleArea'}},
1533
- {startTime: 1, endTime: 4});
1534
- });
1535
-
1536
- it('uses text color if tts:textOutline does not specify color', () => {
1537
- verifyHelper(
1538
- [
1539
- {
1540
- startTime: 1,
1541
- endTime: 2,
1542
- payload: 'Test',
1543
- color: 'red',
1544
- textStrokeColor: 'red',
1545
- textStrokeWidth: '3px',
1546
- },
1547
- ],
1548
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1549
- '<styling>' +
1550
- '<style xml:id="s1" tts:color="red" ' +
1551
- 'tts:textOutline="3px" />' +
1552
- '</styling>' +
1553
- '<body region="subtitleArea"><div>' +
1554
- '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1555
- '</div></body></tt>',
1556
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
1557
- {startTime: 1, endTime: 2});
1558
- });
1559
-
1560
- it('does not add an outline if tts:textOutline only contains color', () => {
1561
- verifyHelper(
1562
- [
1563
- {
1564
- startTime: 1,
1565
- endTime: 2,
1566
- payload: 'Test',
1567
- color: 'red',
1568
- },
1569
- ],
1570
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1571
- '<styling>' +
1572
- '<style xml:id="s1" tts:color="red" ' +
1573
- 'tts:textOutline="blue" />' +
1574
- '</styling>' +
1575
- '<body region="subtitleArea"><div>' +
1576
- '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1577
- '</div></body></tt>',
1578
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
1579
- {startTime: 1, endTime: 2});
1580
- });
1581
-
1582
- // Regression test for #2623
1583
- it('does not apply background colors to containers', () => {
1584
- verifyHelper(
1585
- [
1586
- {
1587
- startTime: 1,
1588
- endTime: 2,
1589
- payload: '',
1590
- // background color should not be set on the p container.
1591
- backgroundColor: '',
1592
-
1593
- nestedCues: [{
1594
- payload: 'Test',
1595
- color: 'red',
1596
- backgroundColor: 'blue',
1597
- }],
1598
- },
1599
- ],
1600
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1601
- '<head>' +
1602
- '<styling>' +
1603
- '<style xml:id="s1" tts:color="red" ' +
1604
- 'tts:backgroundColor="blue" />' +
1605
- '</styling>' +
1606
- '<layout>' +
1607
- '<region xml:id="r1" />' +
1608
- '</layout>' +
1609
- '</head>' +
1610
- '<body><div>' +
1611
- '<p begin="00:01.00" end="00:02.00" region="r1">' +
1612
- '<span style="s1">Test</span>' +
1613
- '</p>' +
1614
- '</div></body></tt>',
1615
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
1616
- {startTime: 1, endTime: 2});
1617
- });
1618
-
1619
- // Regression test for #4468
1620
- it('defaults the body background to transparent', () => {
1621
- verifyHelper(
1622
- // One cue, don't care about the details
1623
- [{}],
1624
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1625
- '<head>' +
1626
- '<styling>' +
1627
- '<style xml:id="s1" tts:backgroundColor="black" />' +
1628
- '</styling>' +
1629
- '</head>' +
1630
- '<body><div>' +
1631
- '<p begin="00:01.00" end="00:02.00">' +
1632
- '<span style="s1">Test</span>' +
1633
- '</p>' +
1634
- '</div></body></tt>',
1635
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
1636
- // The body must have these properties:
1637
- {backgroundColor: 'transparent'},
1638
- // The div must have these properties:
1639
- {}); // don't care
1640
- });
1641
-
1642
- // Regression test for #4468
1643
- it('allows the body background color to be set', () => {
1644
- verifyHelper(
1645
- // One cue, don't care about the details
1646
- [{}],
1647
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1648
- '<head>' +
1649
- '<styling>' +
1650
- '<style xml:id="s1" tts:backgroundColor="black" />' +
1651
- '</styling>' +
1652
- '</head>' +
1653
- '<body style="s1"><div>' +
1654
- '<p begin="00:01.00" end="00:02.00">' +
1655
- '<span>Test</span>' +
1656
- '</p>' +
1657
- '</div></body></tt>',
1658
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
1659
- // The body must have these properties:
1660
- {backgroundColor: 'black'},
1661
- // The div must have these properties:
1662
- {}); // don't care
1663
- });
1664
-
1665
- it('parses wrapping option', () => {
1666
- verifyHelper(
1667
- [
1668
- {
1669
- startTime: 62.05,
1670
- endTime: 3723.2,
1671
- payload: 'Test',
1672
- wrapLine: false,
1673
- },
1674
- ],
1675
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1676
- '<styling>' +
1677
- '<style xml:id="s1" tts:wrapOption="noWrap"/>' +
1678
- '</styling>' +
1679
- '<layout xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1680
- '<region xml:id="subtitleArea" />' +
1681
- '</layout>' +
1682
- '<body region="subtitleArea"><div>' +
1683
- '<p begin="01:02.05" end="01:02:03.200" style="s1">Test</p>' +
1684
- '</div></body></tt>',
1685
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1686
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1687
- {startTime: 62.05, endTime: 3723.2});
1688
- });
1689
-
1690
- it('parses text decoration', () => {
1691
- verifyHelper(
1692
- [
1693
- {
1694
- startTime: 62.05,
1695
- endTime: 3723.2,
1696
- payload: 'Test',
1697
- textDecoration: [Cue.textDecoration.UNDERLINE,
1698
- Cue.textDecoration.OVERLINE],
1699
- },
1700
- ],
1701
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1702
- '<styling>' +
1703
- '<style xml:id="s1" tts:textDecoration="underline ' +
1704
- 'overline lineThrough"/>' +
1705
- '<style xml:id="s2" tts:textDecoration="noLineThrough"/>' +
1706
- '</styling>' +
1707
- '<layout>' +
1708
- '<region xml:id="subtitleArea" style="s1"/>' +
1709
- '</layout>' +
1710
- '<body region="subtitleArea"><div>' +
1711
- '<p begin="01:02.05" end="01:02:03.200" style="s2">Test</p>' +
1712
- '</div></body></tt>',
1713
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1714
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1715
- {startTime: 62.05, endTime: 3723.2});
1716
- });
1717
-
1718
- it('cues should have default cellResolution', () => {
1719
- verifyHelper(
1720
- [
1721
- {
1722
- startTime: 1,
1723
- endTime: 2,
1724
- cellResolution: {
1725
- columns: 32,
1726
- rows: 15,
1727
- },
1728
- fontSize: '0.45c',
1729
- },
1730
- ],
1731
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1732
- '<styling>' +
1733
- '<style xml:id="s1" tts:fontSize="0.45c"/>' +
1734
- '</styling>' +
1735
- '<body><div>' +
1736
- '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1737
- '</div></body></tt>',
1738
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
1739
- {startTime: 1, endTime: 2});
1740
- });
1741
-
1742
- it('parses cellResolution', () => {
1743
- verifyHelper(
1744
- [
1745
- {
1746
- startTime: 1,
1747
- endTime: 2,
1748
- payload: 'Test',
1749
- cellResolution: {
1750
- columns: 60,
1751
- rows: 20,
1752
- },
1753
- fontSize: '67%',
1754
- },
1755
- ],
1756
- '<tt ' +
1757
- 'xmlns:ttp="http://www.w3.org/ns/ttml#parameter" ' +
1758
- 'xmlns:tts="http://www.w3.org/ns/ttml#styling" ' +
1759
- 'ttp:cellResolution="60 20">' +
1760
- '<styling>' +
1761
- '<style xml:id="s1" tts:fontSize="67%"/>' +
1762
- '</styling>' +
1763
- '<body><div>' +
1764
- '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1765
- '</div></body></tt>',
1766
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
1767
- {startTime: 1, endTime: 2});
1768
- });
1769
-
1770
- it('parses line padding', () => {
1771
- verifyHelper(
1772
- [
1773
- {
1774
- startTime: 1,
1775
- endTime: 2,
1776
- payload: 'Test',
1777
- cellResolution: {
1778
- columns: 60,
1779
- rows: 20,
1780
- },
1781
- linePadding: '0.5c',
1782
- },
1783
- ],
1784
- '<tt ' +
1785
- 'xmlns:ttp="http://www.w3.org/ns/ttml#parameter" ' +
1786
- 'xmlns:tts="http://www.w3.org/ns/ttml#styling" ' +
1787
- 'xmlns:ebutts="urn:ebu:tt:style" ' +
1788
- 'ttp:cellResolution="60 20">' +
1789
- '<styling>' +
1790
- '<style xml:id="s1" ebutts:linePadding="0.5c"/>' +
1791
- '</styling>' +
1792
- '<body><div>' +
1793
- '<p begin="00:01.00" end="00:02.00" style="s1">Test</p>' +
1794
- '</div></body></tt>',
1795
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
1796
- {startTime: 1, endTime: 2});
1797
- });
1798
-
1799
- it('chooses style on element over style on region', () => {
1800
- verifyHelper(
1801
- [
1802
- {
1803
- startTime: 62.05,
1804
- endTime: 3723.2,
1805
- payload: 'Test',
1806
- color: 'blue',
1807
- },
1808
- ],
1809
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1810
- '<styling>' +
1811
- '<style xml:id="s1" tts:color="red"/>' +
1812
- '<style xml:id="s2" tts:color="blue"/>' +
1813
- '</styling>' +
1814
- '<layout>' +
1815
- '<region xml:id="subtitleArea" style="s1"/>' +
1816
- '</layout>' +
1817
- '<body region="subtitleArea"><div>' +
1818
- '<p begin="01:02.05" end="01:02:03.200" style="s2">Test</p>' +
1819
- '</div></body></tt>',
1820
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1821
- {startTime: 62.05, endTime: 3723.2, region: {id: 'subtitleArea'}},
1822
- {startTime: 62.05, endTime: 3723.2});
1823
- });
1824
-
1825
- it('can parse multiple cues', () => {
1826
- verifyHelper(
1827
- [
1828
- {startTime: 1, endTime: 2, payload: 'First cue'},
1829
- {startTime: 3, endTime: 4, payload: 'Second cue'},
1830
- ],
1831
- '<tt><body><div>' +
1832
- '<p begin="00:01.00" end="00:02.00">First cue</p>' +
1833
- '<p begin="00:03.00" end="00:04.00">Second cue</p>' +
1834
- '</div></body></tt>',
1835
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
1836
- {startTime: 1, endTime: 4});
1837
- });
1838
-
1839
- // Regression test for https://github.com/shaka-project/shaka-player/issues/2478
1840
- it('supports nested cues with only non-ASCII characters', () => {
1841
- verifyHelper(
1842
- [
1843
- {
1844
- startTime: 62.05,
1845
- endTime: 3723.2,
1846
- payload: '',
1847
- nestedCues: [
1848
- {
1849
- payload: 'äöü',
1850
- startTime: 62.05,
1851
- endTime: 3723.2,
1852
- },
1853
- ],
1854
- },
1855
- ],
1856
- '<tt><body><div>' +
1857
- '<p begin="01:02.05" end="01:02:03.200"><span>äöü</span></p>' +
1858
- '</div></body></tt>',
1859
- {periodStart: 0, segmentStart: 60, segmentEnd: 3730, vttOffset: 0},
1860
- {startTime: 62.05, endTime: 3723.2});
1861
- });
1862
-
1863
- it('supports timing on multiple levels', () => {
1864
- // Both start and end times are relative to the parent start time.
1865
-
1866
- verifyHelper(
1867
- [
1868
- {startTime: 6, endTime: 7, payload: 'First cue'},
1869
- {startTime: 7, endTime: 8, payload: 'Second cue'},
1870
- ],
1871
- '<tt><body begin="1s">' +
1872
- '<div begin="2s">' +
1873
- '<p begin="3s" end="4s">First cue</p>' +
1874
- '<p begin="4s" end="5s">Second cue</p>' +
1875
- '</div></body></tt>',
1876
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
1877
- // Capped to segment end time.
1878
- {startTime: 1, endTime: 10},
1879
- {startTime: 3, endTime: 10});
1880
-
1881
- verifyHelper(
1882
- [{
1883
- startTime: 6,
1884
- payload: '',
1885
- nestedCues: [{
1886
- startTime: 10,
1887
- endTime: 11,
1888
- payload: 'First cue',
1889
- }, {
1890
- startTime: 11,
1891
- endTime: 12,
1892
- payload: 'Second cue',
1893
- }],
1894
- }],
1895
- '<tt><body begin="1s">' +
1896
- '<div begin="2s">' +
1897
- '<p begin="3s">' +
1898
- '<span begin="4s" end="5s">First cue</span>' +
1899
- '<span begin="5s" end="6s">Second cue</span>' +
1900
- '</p>' +
1901
- '</div></body></tt>',
1902
- {periodStart: 0, segmentStart: 0, segmentEnd: 20, vttOffset: 0},
1903
- // Capped to segment end time.
1904
- {startTime: 1, endTime: 20},
1905
- {startTime: 3, endTime: 20});
1906
- });
1907
-
1908
- it('gets end time from parent directly if missing', () => {
1909
- verifyHelper(
1910
- [
1911
- {startTime: 6, endTime: 7, payload: 'First cue'},
1912
- {startTime: 7, endTime: 30, payload: 'Second cue'},
1913
- ],
1914
- '<tt><body begin="1s" end="30s">' +
1915
- '<div begin="2s">' +
1916
- '<p begin="3s" end="4s">First cue</p>' +
1917
- '<p begin="4s">Second cue</p>' +
1918
- '</div></body></tt>',
1919
- {periodStart: 0, segmentStart: 0, segmentEnd: 30, vttOffset: 0},
1920
- {startTime: 1, endTime: 30},
1921
- {startTime: 3, endTime: 30});
1922
- });
1923
-
1924
- it('supports never-ending cues', () => {
1925
- verifyHelper(
1926
- [
1927
- // Capped to segment end time.
1928
- {startTime: 1, endTime: 9000, payload: 'First cue'},
1929
- {startTime: 2, endTime: 9000, payload: 'Second cue'},
1930
- ],
1931
- '<tt><body><div>' +
1932
- '<p begin="1s">First cue</p>' +
1933
- '<p begin="2s">Second cue</p>' +
1934
- '</div></body></tt>',
1935
- {periodStart: 0, segmentStart: 0, segmentEnd: 9000, vttOffset: 0},
1936
- // Capped to segment end time.
1937
- {startTime: 1, endTime: 9000});
1938
- });
1939
-
1940
- // Regression test for b/159050711
1941
- it('inherits styles from other styles on both element and region', () => {
1942
- verifyHelper(
1943
- [
1944
- {
1945
- // p element
1946
- startTime: 0,
1947
- endTime: 60,
1948
- payload: '',
1949
- fontSize: '15px',
1950
- backgroundColor: 'transparent',
1951
- color: 'blue',
1952
- displayAlign: Cue.displayAlign.CENTER,
1953
- textAlign: Cue.textAlign.CENTER,
1954
-
1955
- nestedCues: [
1956
- {
1957
- startTime: 0,
1958
- endTime: 60,
1959
- payload: 'Test with regionStyle',
1960
- // Style inherited from regionStyle.
1961
- backgroundColor: 'transparent',
1962
- color: 'blue',
1963
- displayAlign: Cue.displayAlign.CENTER,
1964
- fontSize: '15px',
1965
- textAlign: Cue.textAlign.CENTER,
1966
- },
1967
- {
1968
- startTime: 0,
1969
- endTime: 60,
1970
- payload: 'Test with spanStyle',
1971
- // Style from spanStyle, overrides regionStyle
1972
- backgroundColor: 'white',
1973
- // Style inherited from regionStyle via spanStyle
1974
- color: 'blue',
1975
- // Styles inherited from backgroundStyle via regionStyle via
1976
- // spanStyle
1977
- displayAlign: Cue.displayAlign.CENTER,
1978
- textAlign: Cue.textAlign.END,
1979
- },
1980
- ],
1981
- },
1982
- ],
1983
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
1984
- '<head>' +
1985
- ' <layout>' +
1986
- ' <region xml:id="r1" style="regionStyle" />' +
1987
- ' </layout>' +
1988
- ' <styling>' +
1989
- // spanStyle inherits attributes from regionStyle
1990
- ' <style xml:id="pStyle" tts:fontSize="15px" />' +
1991
- ' <style xml:id="spanStyle" style="regionStyle" ' +
1992
- ' tts:backgroundColor="white" tts:textAlign="end" />' +
1993
- // regionStyle inherits attributes from backgroundStyle
1994
- ' <style xml:id="regionStyle" style="backgroundStyle" ' +
1995
- ' tts:backgroundColor="transparent" tts:color="blue" />' +
1996
- ' <style xml:id="backgroundStyle" ' +
1997
- ' tts:displayAlign="center" tts:textAlign="center" ' +
1998
- ' tts:fontSize="18px" />' +
1999
- ' </styling>' +
2000
- '</head>' +
2001
- '<body><div>' +
2002
- ' <p begin="00:00" end="01:00" region="r1" style="pStyle">' +
2003
- ' <span>Test with regionStyle</span>' +
2004
- ' <span style="spanStyle">Test with spanStyle</span>' +
2005
- ' </p>' +
2006
- '</div></body></tt>',
2007
- {periodStart: 0, segmentStart: 0, segmentEnd: 60, vttOffset: 0},
2008
- {startTime: 0, endTime: 60});
2009
- });
2010
-
2011
- it('inherits alignment from parent regions', () => {
2012
- verifyHelper(
2013
- [
2014
- {
2015
- startTime: 0,
2016
- endTime: 60,
2017
- payload: '',
2018
- fontSize: '',
2019
- textAlign: Cue.textAlign.END,
2020
- displayAlign: Cue.displayAlign.CENTER,
2021
- nestedCues: [
2022
- {
2023
- startTime: 0,
2024
- endTime: 60,
2025
- payload: 'Hello!',
2026
- textAlign: Cue.textAlign.END,
2027
- displayAlign: Cue.displayAlign.CENTER,
2028
- },
2029
- ],
2030
- },
2031
- ],
2032
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
2033
- '<head><layout>' +
2034
- '<region xml:id="r1" tts:textAlign="end" tts:displayAlign="center" />' +
2035
- '</layout></head>' +
2036
- '<body><div><p begin="00:00" end="01:00" region="r1">' +
2037
- '<span>Hello!</span>' +
2038
- '</p></div></body></tt>',
2039
- {periodStart: 0, segmentStart: 0, segmentEnd: 60, vttOffset: 0},
2040
- {startTime: 0, endTime: 60},
2041
- );
2042
- });
2043
-
2044
- // Regression test for https://github.com/shaka-project/shaka-player/issues/3743
2045
- it('inherits styles from other styles on nestedCues', () => {
2046
- verifyHelper(
2047
- [
2048
- {
2049
- // p element
2050
- startTime: 0,
2051
- endTime: 60,
2052
- payload: '',
2053
- fontSize: '16px',
2054
- nestedCues: [
2055
- {
2056
- startTime: 0,
2057
- endTime: 60,
2058
- payload: 'A',
2059
- fontSize: '16px',
2060
- },
2061
- {
2062
- startTime: 0,
2063
- endTime: 60,
2064
- payload: '',
2065
- fontSize: '',
2066
- },
2067
- {
2068
- startTime: 0,
2069
- endTime: 60,
2070
- payload: 'B',
2071
- fontSize: '16px',
2072
- },
2073
- ],
2074
- },
2075
- ],
2076
- '<tt xmlns:tts="http://www.w3.org/ns/ttml#styling">' +
2077
- '<head>' +
2078
- ' <styling>' +
2079
- ' <style tts:backgroundColor="rgba(0,0,0,100)" ' +
2080
- ' tts:displayAlign="center" ' +
2081
- ' tts:extent="80% 10%" ' +
2082
- ' tts:fontFamily="proportionalSansSerif" ' +
2083
- ' tts:fontSize="16px" ' +
2084
- ' tts:origin="10% 85%" ' +
2085
- ' tts:textAlign="center" ' +
2086
- ' xml:id="backgroundStyle"/>' +
2087
- ' <style style="backgroundStyle" ' +
2088
- ' tts:backgroundColor="transparent" ' +
2089
- ' tts:color="white" ' +
2090
- ' xml:id="speakerStyle"/>' +
2091
- ' </styling>' +
2092
- ' <layout>' +
2093
- ' <region style="speakerStyle" tts:zIndex="1" xml:id="speaker"/>' +
2094
- ' </layout>' +
2095
- '</head>' +
2096
- '<body><div>' +
2097
- ' <p begin="00:00" end="01:00" region="speaker">' +
2098
- ' A<br/>B' +
2099
- ' </p>' +
2100
- '</div></body></tt>',
2101
- {periodStart: 0, segmentStart: 0, segmentEnd: 60, vttOffset: 0},
2102
- {startTime: 0, endTime: 60});
2103
- });
2104
-
2105
- // Test for https://github.com/shaka-project/shaka-player/issues/4631
2106
- it('trims cues to segment boundaries', () => {
2107
- verifyHelper(
2108
- [
2109
- // Capped to segment end time.
2110
- {startTime: 168, endTime: 170},
2111
- ],
2112
- '<tt><body><div>' +
2113
- ' <p begin="00:02:48.00" end="00:02:50.92" xml:id="sub22">' +
2114
- ' <span style="s1">Emo look.<br/>I mean listen.</span>' +
2115
- ' </p>' +
2116
- '</div></body></tt>',
2117
- {periodStart: 0, segmentStart: 160, segmentEnd: 170, vttOffset: 0},
2118
- {});
2119
-
2120
- verifyHelper(
2121
- [
2122
- // Capped to segment start time.
2123
- {startTime: 170, endTime: Util.closeTo(170.92)},
2124
- ],
2125
- '<tt><body><div>' +
2126
- ' <p begin="00:02:48.00" end="00:02:50.92" xml:id="sub22">' +
2127
- ' <span style="s1">Emo look.<br/>I mean listen.</span>' +
2128
- ' </p>' +
2129
- '</div></body></tt>',
2130
- {periodStart: 0, segmentStart: 170, segmentEnd: 180, vttOffset: 0},
2131
- {});
2132
- });
2133
-
2134
- /**
2135
- * @param {!Array} cues
2136
- * @param {string} text
2137
- * @param {shaka.extern.TextParser.TimeContext} time
2138
- * @param {!Object} bodyProperties
2139
- * @param {Object=} divProperties
2140
- */
2141
- function verifyHelper(cues, text, time, bodyProperties, divProperties) {
2142
- const data =
2143
- shaka.util.BufferUtils.toUint8(shaka.util.StringUtils.toUTF8(text));
2144
- const result = new shaka.text.TtmlTextParser()
2145
- .parseMedia(data, time, 'foo://bar');
2146
- shaka.test.TtmlUtils.verifyHelper(
2147
- cues, result, bodyProperties, divProperties);
2148
- }
2149
-
2150
-
2151
- /**
2152
- * @param {shaka.util.Error.Code} code
2153
- * @param {string} text
2154
- * @param {*=} errorData
2155
- */
2156
- function errorHelper(code, text, errorData = undefined) {
2157
- let shakaError;
2158
- if (errorData) {
2159
- shakaError = new shaka.util.Error(
2160
- shaka.util.Error.Severity.CRITICAL, shaka.util.Error.Category.TEXT,
2161
- code, errorData);
2162
- } else {
2163
- shakaError = new shaka.util.Error(
2164
- shaka.util.Error.Severity.CRITICAL, shaka.util.Error.Category.TEXT,
2165
- code);
2166
- }
2167
- const error = shaka.test.Util.jasmineError(shakaError);
2168
- const data = shaka.util.StringUtils.toUTF8(text);
2169
- expect(() => {
2170
- new shaka.text.TtmlTextParser().parseMedia(
2171
- shaka.util.BufferUtils.toUint8(data),
2172
- {periodStart: 0, segmentStart: 0, segmentEnd: 10, vttOffset: 0},
2173
- 'foo://bar');
2174
- }).toThrow(error);
2175
- }
2176
- });