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