shaka-player 4.3.11 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/AUTHORS +9 -0
  2. package/CHANGELOG.md +303 -202
  3. package/CONTRIBUTORS +8 -0
  4. package/LICENSE +32 -0
  5. package/README.md +63 -10
  6. package/demo/autoTemplate.txt +40 -5
  7. package/demo/close_button.js +11 -0
  8. package/demo/common/asset.js +13 -1
  9. package/demo/common/assets.js +53 -3
  10. package/demo/common/message_ids.js +25 -1
  11. package/demo/config.js +69 -10
  12. package/demo/customWarning.txt +2 -2
  13. package/demo/index.html +3 -1
  14. package/demo/locales/en.json +26 -2
  15. package/demo/locales/source.json +105 -9
  16. package/demo/main.js +52 -9
  17. package/demo/search.js +3 -1
  18. package/demo/service_worker.js +3 -0
  19. package/dist/controls.css +1 -1
  20. package/dist/controls.css.map +1 -1
  21. package/dist/demo.compiled.debug.js +124 -112
  22. package/dist/demo.compiled.debug.map +3 -3
  23. package/dist/demo.compiled.js +124 -112
  24. package/dist/demo.compiled.map +3 -3
  25. package/dist/deps.js +46 -28
  26. package/dist/locales.js +33 -33
  27. package/dist/receiver.compiled.debug.js +52 -46
  28. package/dist/receiver.compiled.debug.map +3 -3
  29. package/dist/receiver.compiled.js +52 -46
  30. package/dist/receiver.compiled.map +3 -3
  31. package/dist/shaka-player.compiled.d.ts +676 -391
  32. package/dist/shaka-player.compiled.debug.d.ts +676 -391
  33. package/dist/shaka-player.compiled.debug.externs.js +1188 -616
  34. package/dist/shaka-player.compiled.debug.js +1043 -699
  35. package/dist/shaka-player.compiled.debug.map +4 -4
  36. package/dist/shaka-player.compiled.externs.js +1188 -616
  37. package/dist/shaka-player.compiled.js +1091 -929
  38. package/dist/shaka-player.compiled.map +4 -4
  39. package/dist/shaka-player.ui.d.ts +677 -392
  40. package/dist/shaka-player.ui.debug.d.ts +677 -392
  41. package/dist/shaka-player.ui.debug.externs.js +1023 -451
  42. package/dist/shaka-player.ui.debug.js +1098 -737
  43. package/dist/shaka-player.ui.debug.map +4 -4
  44. package/dist/shaka-player.ui.externs.js +1023 -451
  45. package/dist/shaka-player.ui.js +1246 -1071
  46. package/dist/shaka-player.ui.map +4 -4
  47. package/docs/tutorials/ad_monetization.md +15 -1
  48. package/docs/tutorials/application-level-redirects.md +1 -1
  49. package/docs/tutorials/config.md +9 -5
  50. package/docs/tutorials/drm-config.md +61 -0
  51. package/docs/tutorials/fairplay.md +19 -4
  52. package/docs/tutorials/license-server-auth.md +4 -4
  53. package/docs/tutorials/license-wrapping.md +2 -2
  54. package/docs/tutorials/ui-customization.md +7 -3
  55. package/docs/tutorials/ui.md +7 -7
  56. package/docs/tutorials/upgrade.md +3 -0
  57. package/externs/ima.js +123 -2
  58. package/externs/isoboxer.js +217 -0
  59. package/externs/mediakeys.js +18 -0
  60. package/externs/mux.js +1 -105
  61. package/externs/pictureinpicture.js +48 -0
  62. package/externs/shaka/ads.js +61 -1
  63. package/externs/shaka/cea.js +110 -0
  64. package/externs/shaka/codecs.js +32 -0
  65. package/externs/shaka/manifest.js +101 -1
  66. package/externs/shaka/manifest_parser.js +0 -10
  67. package/externs/shaka/net.js +36 -7
  68. package/externs/shaka/offline.js +8 -1
  69. package/externs/shaka/player.js +220 -21
  70. package/externs/shaka/text.js +1 -382
  71. package/externs/shaka/transmuxer.js +60 -0
  72. package/karma.conf.js +13 -0
  73. package/lib/abr/simple_abr_manager.js +6 -3
  74. package/lib/ads/ad_manager.js +60 -2
  75. package/lib/ads/client_side_ad.js +86 -0
  76. package/lib/ads/client_side_ad_manager.js +79 -3
  77. package/lib/ads/server_side_ad.js +86 -0
  78. package/lib/ads/server_side_ad_manager.js +13 -0
  79. package/lib/cast/cast_utils.js +1 -0
  80. package/lib/cea/cea608_data_channel.js +24 -14
  81. package/lib/cea/cea608_memory.js +5 -2
  82. package/lib/cea/cea708_service.js +8 -9
  83. package/lib/cea/cea708_window.js +1 -2
  84. package/lib/cea/cea_decoder.js +23 -6
  85. package/lib/cea/cea_utils.js +25 -2
  86. package/lib/cea/dummy_caption_decoder.js +21 -0
  87. package/lib/cea/dummy_cea_parser.js +1 -3
  88. package/lib/cea/mp4_cea_parser.js +15 -10
  89. package/lib/cea/ts_cea_parser.js +69 -0
  90. package/lib/dash/content_protection.js +32 -2
  91. package/lib/dash/dash_parser.js +93 -31
  92. package/lib/dash/mpd_utils.js +6 -25
  93. package/lib/dash/segment_base.js +12 -14
  94. package/lib/dash/segment_list.js +10 -6
  95. package/lib/dash/segment_template.js +349 -32
  96. package/lib/dependencies/all.js +8 -0
  97. package/lib/hls/hls_classes.js +33 -8
  98. package/lib/hls/hls_parser.js +805 -191
  99. package/lib/hls/manifest_text_parser.js +4 -14
  100. package/lib/media/adaptation_set_criteria.js +43 -3
  101. package/lib/media/closed_caption_parser.js +74 -12
  102. package/lib/media/drm_engine.js +189 -49
  103. package/lib/media/gap_jumping_controller.js +1 -1
  104. package/lib/media/manifest_parser.js +34 -0
  105. package/lib/media/media_source_capabilities.js +10 -0
  106. package/lib/media/media_source_engine.js +495 -231
  107. package/lib/media/playhead.js +1 -1
  108. package/lib/media/presentation_timeline.js +62 -0
  109. package/lib/media/segment_index.js +50 -14
  110. package/lib/media/segment_prefetch.js +277 -0
  111. package/lib/media/segment_reference.js +70 -4
  112. package/lib/media/streaming_engine.js +258 -81
  113. package/lib/media/video_wrapper.js +15 -7
  114. package/lib/mss/content_protection.js +353 -0
  115. package/lib/mss/mss_parser.js +1082 -0
  116. package/lib/net/networking_engine.js +60 -10
  117. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  118. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  119. package/lib/offline/manifest_converter.js +6 -0
  120. package/lib/offline/storage.js +2 -4
  121. package/lib/player.js +309 -105
  122. package/lib/polyfill/media_capabilities.js +43 -3
  123. package/lib/polyfill/patchedmediakeys_apple.js +5 -0
  124. package/lib/polyfill/patchedmediakeys_nop.js +5 -0
  125. package/lib/polyfill/patchedmediakeys_webkit.js +5 -0
  126. package/lib/text/cue.js +208 -130
  127. package/lib/text/lrc_text_parser.js +2 -2
  128. package/lib/text/mp4_vtt_parser.js +2 -2
  129. package/lib/text/sbv_text_parser.js +1 -1
  130. package/lib/text/simple_text_displayer.js +1 -1
  131. package/lib/text/srt_text_parser.js +9 -1
  132. package/lib/text/ssa_text_parser.js +2 -2
  133. package/lib/text/text_engine.js +3 -21
  134. package/lib/text/text_utils.js +71 -20
  135. package/lib/text/ui_text_displayer.js +14 -14
  136. package/lib/text/vtt_text_parser.js +22 -14
  137. package/lib/transmuxer/aac_transmuxer.js +224 -0
  138. package/lib/transmuxer/ac3.js +142 -0
  139. package/lib/transmuxer/ac3_transmuxer.js +213 -0
  140. package/lib/transmuxer/adts.js +232 -0
  141. package/lib/transmuxer/ec3.js +103 -0
  142. package/lib/transmuxer/ec3_transmuxer.js +213 -0
  143. package/lib/transmuxer/h264.js +324 -0
  144. package/lib/transmuxer/mp3_transmuxer.js +205 -0
  145. package/lib/transmuxer/mpeg_audio.js +196 -0
  146. package/lib/transmuxer/mpeg_ts_transmuxer.js +182 -0
  147. package/lib/transmuxer/mss_transmuxer.js +389 -0
  148. package/lib/{media/transmuxer.js → transmuxer/muxjs_transmuxer.js} +34 -80
  149. package/lib/transmuxer/transmuxer_engine.js +161 -0
  150. package/lib/transmuxer/ts_transmuxer.js +721 -0
  151. package/lib/util/cmcd_manager.js +131 -71
  152. package/lib/util/error.js +62 -26
  153. package/lib/util/exp_golomb.js +220 -0
  154. package/lib/util/fairplay_utils.js +64 -13
  155. package/lib/util/id3_utils.js +56 -3
  156. package/lib/util/language_utils.js +11 -8
  157. package/lib/util/manifest_parser_utils.js +3 -0
  158. package/lib/util/mime_utils.js +44 -7
  159. package/lib/util/mp4_box_parsers.js +233 -5
  160. package/lib/util/mp4_generator.js +1388 -0
  161. package/lib/util/periods.js +40 -34
  162. package/lib/util/platform.js +17 -3
  163. package/lib/util/player_configuration.js +38 -1
  164. package/lib/util/stream_utils.js +138 -27
  165. package/lib/util/text_parser.js +1 -1
  166. package/lib/util/ts_parser.js +460 -74
  167. package/lib/util/xml_utils.js +16 -3
  168. package/maintained-branches.md +2 -2
  169. package/package.json +3 -1
  170. package/roadmap.md +21 -6
  171. package/shaka-player.uncompiled.js +18 -0
  172. package/test/abr/simple_abr_manager_unit.js +32 -4
  173. package/test/ads/ad_manager_unit.js +18 -2
  174. package/test/cast/cast_utils_unit.js +7 -2
  175. package/test/cea/cea608_memory_unit.js +24 -0
  176. package/test/cea/cea_decoder_unit.js +33 -0
  177. package/test/dash/dash_parser_content_protection_unit.js +93 -3
  178. package/test/dash/dash_parser_live_unit.js +56 -13
  179. package/test/dash/dash_parser_manifest_unit.js +70 -2
  180. package/test/dash/dash_parser_segment_base_unit.js +14 -9
  181. package/test/dash/dash_parser_segment_template_unit.js +286 -6
  182. package/test/demo/demo_unit.js +5 -1
  183. package/test/hls/hls_live_unit.js +188 -28
  184. package/test/hls/hls_parser_unit.js +250 -109
  185. package/test/hls/manifest_text_parser_unit.js +18 -13
  186. package/test/media/adaptation_set_criteria_unit.js +46 -14
  187. package/test/media/adaptation_set_unit.js +2 -0
  188. package/test/media/drm_engine_integration.js +11 -8
  189. package/test/media/drm_engine_unit.js +220 -7
  190. package/test/media/media_source_engine_integration.js +124 -40
  191. package/test/media/media_source_engine_unit.js +133 -153
  192. package/test/media/playhead_unit.js +3 -0
  193. package/test/media/presentation_timeline_unit.js +51 -0
  194. package/test/media/segment_index_unit.js +52 -0
  195. package/test/media/segment_prefetch_unit.js +243 -0
  196. package/test/media/streaming_engine_integration.js +9 -3
  197. package/test/media/streaming_engine_unit.js +440 -59
  198. package/test/mss/mss_parser_content_protection_unit.js +49 -0
  199. package/test/mss/mss_parser_unit.js +472 -0
  200. package/test/mss/mss_player_integration.js +123 -0
  201. package/test/offline/manifest_convert_unit.js +9 -0
  202. package/test/offline/storage_integration.js +6 -1
  203. package/test/player_unit.js +386 -133
  204. package/test/polyfill/media_capabilities_unit.js +18 -0
  205. package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
  206. package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
  207. package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
  208. package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
  209. package/test/test/assets/hls-raw-aac/manifest.m3u8 +4 -0
  210. package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +14 -0
  211. package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
  212. package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
  213. package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
  214. package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
  215. package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
  216. package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
  217. package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
  218. package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
  219. package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +31 -0
  220. package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
  221. package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
  222. package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
  223. package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
  224. package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
  225. package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
  226. package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
  227. package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
  228. package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +31 -0
  229. package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +13 -0
  230. package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
  231. package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
  232. package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
  233. package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
  234. package/test/test/assets/hls-raw-mp3/playlist.m3u8 +4 -0
  235. package/test/test/assets/hls-ts-aac/playlist.m3u8 +23 -0
  236. package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
  237. package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
  238. package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
  239. package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
  240. package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
  241. package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
  242. package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
  243. package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
  244. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
  245. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
  246. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
  247. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
  248. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
  249. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
  250. package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +19 -0
  251. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
  252. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
  253. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
  254. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
  255. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
  256. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
  257. package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +19 -0
  258. package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
  259. package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
  260. package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
  261. package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
  262. package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
  263. package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
  264. package/test/test/assets/hls-ts-h264/prog_index.m3u8 +25 -0
  265. package/test/test/assets/hls-ts-mp3/manifest.m3u8 +13 -0
  266. package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
  267. package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
  268. package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
  269. package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
  270. package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +17 -0
  271. package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
  272. package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
  273. package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
  274. package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
  275. package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
  276. package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
  277. package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +4 -0
  278. package/test/test/boot.js +7 -2
  279. package/test/test/util/fake_ad.js +99 -0
  280. package/test/test/util/fake_ad_manager.js +7 -1
  281. package/test/test/util/fake_networking_engine.js +41 -14
  282. package/test/test/util/fake_segment_prefetch.js +81 -0
  283. package/test/test/util/manifest_generator.js +19 -5
  284. package/test/test/util/mss_parser_util.js +115 -0
  285. package/test/test/util/offline_utils.js +1 -0
  286. package/test/test/util/simple_fakes.js +12 -3
  287. package/test/test/util/streaming_engine_util.js +14 -4
  288. package/test/test/util/ttml_utils.js +2 -2
  289. package/test/text/cue_integration.js +1 -1
  290. package/test/text/srt_text_parser_unit.js +78 -0
  291. package/test/text/text_engine_unit.js +17 -8
  292. package/test/text/ui_text_displayer_unit.js +4 -4
  293. package/test/text/vtt_text_parser_unit.js +59 -40
  294. package/test/text/web_vtt_generator_unit.js +9 -3
  295. package/test/{media/transmuxer_integration.js → transmuxer/muxjs_transmuxer_integration.js} +30 -33
  296. package/test/transmuxer/transmuxer_engine_integration.js +60 -0
  297. package/test/transmuxer/transmuxer_integration.js +296 -0
  298. package/test/util/cmcd_manager_unit.js +162 -13
  299. package/test/util/language_utils_unit.js +9 -2
  300. package/test/util/mp4_box_parsers_unit.js +39 -4
  301. package/test/util/periods_unit.js +34 -26
  302. package/test/util/stream_utils_unit.js +60 -107
  303. package/ui/controls.js +19 -1
  304. package/ui/controls.less +1 -0
  305. package/ui/externs/ui.js +11 -1
  306. package/ui/language_utils.js +15 -0
  307. package/ui/less/thumbnails.less +26 -0
  308. package/ui/locales/oc.json +42 -0
  309. package/ui/pip_button.js +83 -2
  310. package/ui/range_element.js +15 -0
  311. package/ui/resolution_selection.js +9 -2
  312. package/ui/seek_bar.js +223 -0
  313. package/ui/ui.js +5 -0
  314. package/lib/cea/i_caption_decoder.js +0 -51
  315. package/lib/cea/i_cea_parser.js +0 -68
@@ -174,9 +174,11 @@ shaka.test.FakeNetworkingEngine = class {
174
174
  *
175
175
  * @param {string} uri
176
176
  * @param {shaka.net.NetworkingEngine.RequestType} type
177
+ * @param {shaka.extern.RequestContext=} context
177
178
  */
178
- expectRequest(uri, type) {
179
- shaka.test.FakeNetworkingEngine.expectRequest(this.request, uri, type);
179
+ expectRequest(uri, type, context) {
180
+ shaka.test.FakeNetworkingEngine.expectRequest(
181
+ this.request, uri, type, context);
180
182
  }
181
183
 
182
184
  /**
@@ -184,9 +186,11 @@ shaka.test.FakeNetworkingEngine = class {
184
186
  *
185
187
  * @param {string} uri
186
188
  * @param {shaka.net.NetworkingEngine.RequestType} type
189
+ * @param {shaka.extern.RequestContext=} context
187
190
  */
188
- expectNoRequest(uri, type) {
189
- shaka.test.FakeNetworkingEngine.expectNoRequest(this.request, uri, type);
191
+ expectNoRequest(uri, type, context) {
192
+ shaka.test.FakeNetworkingEngine.expectNoRequest(
193
+ this.request, uri, type, context);
190
194
  }
191
195
 
192
196
  /**
@@ -195,10 +199,11 @@ shaka.test.FakeNetworkingEngine = class {
195
199
  * @param {string} uri
196
200
  * @param {number} startByte
197
201
  * @param {?number} endByte
202
+ * @param {boolean} isInit
198
203
  */
199
- expectRangeRequest(uri, startByte, endByte) {
204
+ expectRangeRequest(uri, startByte, endByte, isInit) {
200
205
  shaka.test.FakeNetworkingEngine.expectRangeRequest(
201
- this.request, uri, startByte, endByte);
206
+ this.request, uri, startByte, endByte, isInit);
202
207
  }
203
208
 
204
209
  /**
@@ -289,10 +294,18 @@ shaka.test.FakeNetworkingEngine = class {
289
294
  * @param {!Object} requestSpy
290
295
  * @param {string} uri
291
296
  * @param {shaka.net.NetworkingEngine.RequestType} type
297
+ * @param {shaka.extern.RequestContext=} context
292
298
  */
293
- static expectRequest(requestSpy, uri, type) {
294
- expect(requestSpy).toHaveBeenCalledWith(
295
- type, jasmine.objectContaining({uris: [uri]}));
299
+ static expectRequest(requestSpy, uri, type, context) {
300
+ // Jasmine "toHaveBeenCalledWith" doesn't handle optional parameters well.
301
+ if (context != undefined) {
302
+ expect(requestSpy).toHaveBeenCalledWith(
303
+ type, jasmine.objectContaining({uris: [uri]}),
304
+ jasmine.objectContaining({type: context.type}));
305
+ } else {
306
+ expect(requestSpy).toHaveBeenCalledWith(
307
+ type, jasmine.objectContaining({uris: [uri]}));
308
+ }
296
309
  }
297
310
 
298
311
  /**
@@ -301,10 +314,18 @@ shaka.test.FakeNetworkingEngine = class {
301
314
  * @param {!Object} requestSpy
302
315
  * @param {string} uri
303
316
  * @param {shaka.net.NetworkingEngine.RequestType} type
317
+ * @param {shaka.extern.RequestContext=} context
304
318
  */
305
- static expectNoRequest(requestSpy, uri, type) {
306
- expect(requestSpy).not.toHaveBeenCalledWith(
307
- type, jasmine.objectContaining({uris: [uri]}));
319
+ static expectNoRequest(requestSpy, uri, type, context) {
320
+ // Jasmine "toHaveBeenCalledWith" doesn't handle optional parameters well.
321
+ if (context != undefined) {
322
+ expect(requestSpy).not.toHaveBeenCalledWith(
323
+ type, jasmine.objectContaining({uris: [uri]}),
324
+ jasmine.objectContaining({type: context.type}));
325
+ } else {
326
+ expect(requestSpy).not.toHaveBeenCalledWith(
327
+ type, jasmine.objectContaining({uris: [uri]}));
328
+ }
308
329
  }
309
330
 
310
331
  /**
@@ -314,8 +335,9 @@ shaka.test.FakeNetworkingEngine = class {
314
335
  * @param {string} uri
315
336
  * @param {number} startByte
316
337
  * @param {?number} endByte
338
+ * @param {boolean} isInit
317
339
  */
318
- static expectRangeRequest(requestSpy, uri, startByte, endByte) {
340
+ static expectRangeRequest(requestSpy, uri, startByte, endByte, isInit) {
319
341
  const headers = {};
320
342
  if (startByte == 0 && endByte == null) {
321
343
  // No header required.
@@ -327,12 +349,17 @@ shaka.test.FakeNetworkingEngine = class {
327
349
  headers['Range'] = range;
328
350
  }
329
351
 
352
+ const type = isInit ?
353
+ shaka.net.NetworkingEngine.AdvancedRequestType.INIT_SEGMENT :
354
+ shaka.net.NetworkingEngine.AdvancedRequestType.MEDIA_SEGMENT;
355
+
330
356
  expect(requestSpy).toHaveBeenCalledWith(
331
357
  shaka.net.NetworkingEngine.RequestType.SEGMENT,
332
358
  jasmine.objectContaining({
333
359
  uris: [uri],
334
360
  headers: headers,
335
- }));
361
+ }),
362
+ jasmine.objectContaining({type}));
336
363
  }
337
364
  };
338
365
 
@@ -0,0 +1,81 @@
1
+ /*! @license
2
+ * Shaka Player
3
+ * Copyright 2016 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ /**
8
+ * A fake SegmentPrefetch class that is used for testing
9
+ * segment prefetching functionality.
10
+ *
11
+ * @final
12
+ * @struct
13
+ * @extends {shaka.media.SegmentPrefetch}
14
+ */
15
+ shaka.test.FakeSegmentPrefetch = class {
16
+ constructor(stream, segmentData) {
17
+ /** @private {(Set.<!shaka.media.SegmentReference>)} */
18
+ this.requestedReferences_ = new Set();
19
+
20
+ /** @private {shaka.extern.Stream} */
21
+ this.streamObj_ = stream;
22
+
23
+ /**
24
+ * @private {!Object.<string, shaka.test.FakeMediaSourceEngine.SegmentData>}
25
+ */
26
+ this.segmentData_ = segmentData;
27
+ }
28
+
29
+ /** @override */
30
+ prefetchSegments(reference) {
31
+ if (!(reference instanceof shaka.media.SegmentReference)) {
32
+ return;
33
+ }
34
+ this.requestedReferences_.add(reference);
35
+ }
36
+
37
+ /** @override */
38
+ switchStream(stream) {
39
+ if (stream !== this.streamObj_) {
40
+ this.requestedReferences_.clear();
41
+ }
42
+ }
43
+
44
+ /** @override */
45
+ resetLimit(limit) {
46
+ this.clearAll();
47
+ }
48
+
49
+ /** @override */
50
+ clearAll() {
51
+ this.requestedReferences_.clear();
52
+ }
53
+
54
+ /** @override */
55
+ getPrefetchedSegment(reference) {
56
+ if (!(reference instanceof shaka.media.SegmentReference)) {
57
+ return null;
58
+ }
59
+ /**
60
+ * The unit tests assume a segment is already prefetched
61
+ * if it was ever passed to prefetchSegments() as param.
62
+ * Otherwise return null so the streaming engine being tested
63
+ * will do actual fetch.
64
+ */
65
+ if (this.requestedReferences_.has(reference)) {
66
+ const segmentData = this.segmentData_[this.streamObj_.type];
67
+ return new shaka.net.NetworkingEngine.PendingRequest(
68
+ Promise.resolve({
69
+ uri: reference.getUris()[0],
70
+ data: segmentData.segments[
71
+ segmentData.segmentStartTimes.indexOf(reference.startTime)
72
+ ],
73
+ headers: {},
74
+ }),
75
+ () => Promise.resolve(null),
76
+ new shaka.net.NetworkingEngine.NumBytesRemainingClass(),
77
+ );
78
+ }
79
+ return null;
80
+ }
81
+ };
@@ -97,6 +97,13 @@ shaka.test.ManifestGenerator.Manifest = class {
97
97
  this.minBufferTime = 0;
98
98
  /** @type {boolean} */
99
99
  this.sequenceMode = false;
100
+ /** @type {boolean} */
101
+ this.ignoreManifestTimestampsInSegmentsMode = false;
102
+ /** @type {string} */
103
+ this.type = 'UNKNOWN';
104
+ /** @type {?shaka.extern.ServiceDescription} */
105
+ this.serviceDescription = null;
106
+
100
107
 
101
108
  /** @type {shaka.extern.Manifest} */
102
109
  const foo = this;
@@ -263,6 +270,8 @@ shaka.test.ManifestGenerator.Variant = class {
263
270
  if (!isPartial) {
264
271
  /** @type {string} */
265
272
  this.language = 'und';
273
+ /** @type {string} */
274
+ this.label = '';
266
275
  /** @type {number} */
267
276
  this.bandwidth = 0;
268
277
  /** @type {number} */
@@ -316,7 +325,7 @@ shaka.test.ManifestGenerator.Variant = class {
316
325
  const ContentType = shaka.util.ManifestParserUtils.ContentType;
317
326
  const stream = new shaka.test.ManifestGenerator.Stream(
318
327
  this.manifest_, /* isPartial= */ false, id, ContentType.AUDIO,
319
- this.language);
328
+ this.language, this.label);
320
329
  if (func) {
321
330
  func(stream);
322
331
  }
@@ -446,9 +455,10 @@ shaka.test.ManifestGenerator.Stream = class {
446
455
  * @param {boolean} isPartial
447
456
  * @param {?number} id
448
457
  * @param {shaka.util.ManifestParserUtils.ContentType} type
449
- * @param {string=} lang
458
+ * @param {?string=} lang
459
+ * @param {string=} label
450
460
  */
451
- constructor(manifest, isPartial, id, type, lang) {
461
+ constructor(manifest, isPartial, id, type, lang, label) {
452
462
  goog.asserts.assert(
453
463
  !manifest || !manifest.isIdUsed_(id),
454
464
  'Streams should have unique ids!');
@@ -516,9 +526,11 @@ shaka.test.ManifestGenerator.Stream = class {
516
526
  /** @type {!Set.<string>} */
517
527
  this.keyIds = new Set();
518
528
  /** @type {string} */
519
- this.language = lang || 'und';
529
+ this.language = shaka.util.LanguageUtils.normalize(lang || 'und');
530
+ /** @type {?string} */
531
+ this.originalLanguage = lang || null;
520
532
  /** @type {?string} */
521
- this.label = null;
533
+ this.label = label || null;
522
534
  /** @type {boolean} */
523
535
  this.primary = false;
524
536
  /** @type {?shaka.extern.Stream} */
@@ -541,6 +553,8 @@ shaka.test.ManifestGenerator.Stream = class {
541
553
  this.hdr = undefined;
542
554
  /** @type {(string|undefined)} */
543
555
  this.tilesLayout = undefined;
556
+ /** @type {?shaka.media.ManifestParser.AccessibilityPurpose} */
557
+ this.accessibilityPurpose;
544
558
  /** @type {boolean} */
545
559
  this.external = false;
546
560
  }
@@ -0,0 +1,115 @@
1
+ /*! @license
2
+ * Shaka Player
3
+ * Copyright 2016 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ /** @summary Utilities for working with the MSS parser. */
8
+ shaka.test.Mss = class {
9
+ /**
10
+ * Constructs and configures a very simple MSS parser.
11
+ * @return {!shaka.mss.MssParser}
12
+ */
13
+ static makeMssParser() {
14
+ const parser = new shaka.mss.MssParser();
15
+ const config = shaka.util.PlayerConfiguration.createDefault().manifest;
16
+ parser.configure(config);
17
+ return parser;
18
+ }
19
+
20
+ /**
21
+ * Tests the segment index produced by the MSS manifest parser.
22
+ *
23
+ * @param {string} manifestText
24
+ * @param {!Array.<shaka.media.SegmentReference>} references
25
+ * @return {!Promise}
26
+ */
27
+ static async testSegmentIndex(manifestText, references) {
28
+ const buffer = shaka.util.StringUtils.toUTF8(manifestText);
29
+ const mssParser = shaka.test.Mss.makeMssParser();
30
+
31
+ const networkingEngine = new shaka.test.FakeNetworkingEngine()
32
+ .setResponseValue('dummy://foo', buffer);
33
+
34
+ const playerInterface = {
35
+ networkingEngine: networkingEngine,
36
+ modifyManifestRequest: (request, manifestInfo) => {},
37
+ modifySegmentRequest: (request, segmentInfo) => {},
38
+ filter: () => {},
39
+ makeTextStreamsForClosedCaptions: (manifest) => {},
40
+ onTimelineRegionAdded: fail,
41
+ onEvent: fail,
42
+ onError: fail,
43
+ isLowLatencyMode: () => false,
44
+ isAutoLowLatencyMode: () => false,
45
+ enableLowLatencyMode: () => {},
46
+ updateDuration: () => {},
47
+ newDrmInfo: (stream) => {},
48
+ };
49
+ const manifest = await mssParser.start('dummy://foo', playerInterface);
50
+ const stream = manifest.variants[0].audio;
51
+ await stream.createSegmentIndex();
52
+
53
+ shaka.test.ManifestParser.verifySegmentIndex(stream, references);
54
+ }
55
+
56
+ /**
57
+ * Tests that the MSS manifest parser fails to parse the given manifest.
58
+ *
59
+ * @param {string} manifestText
60
+ * @param {!shaka.util.Error} expectedError
61
+ * @return {!Promise}
62
+ */
63
+ static async testFails(manifestText, expectedError) {
64
+ const manifestData = shaka.util.StringUtils.toUTF8(manifestText);
65
+ const mssParser = shaka.test.Mss.makeMssParser();
66
+
67
+ const networkingEngine = new shaka.test.FakeNetworkingEngine()
68
+ .setResponseValue('dummy://foo', manifestData);
69
+
70
+ const playerInterface = {
71
+ networkingEngine: networkingEngine,
72
+ modifyManifestRequest: (request, manifestInfo) => {},
73
+ modifySegmentRequest: (request, segmentInfo) => {},
74
+ filter: () => {},
75
+ makeTextStreamsForClosedCaptions: (manifest) => {},
76
+ onTimelineRegionAdded: fail, // Should not have any EventStream elements.
77
+ onEvent: fail,
78
+ onError: fail,
79
+ isLowLatencyMode: () => false,
80
+ isAutoLowLatencyMode: () => false,
81
+ enableLowLatencyMode: () => {},
82
+ updateDuration: () => {},
83
+ newDrmInfo: (stream) => {},
84
+ };
85
+ const p = mssParser.start('dummy://foo', playerInterface);
86
+ await expectAsync(p).toBeRejectedWith(
87
+ shaka.test.Util.jasmineError(expectedError));
88
+ }
89
+
90
+ /**
91
+ * @param {shaka.extern.Manifest} manifest
92
+ * @return {!Promise.<shaka.media.SegmentReference>}
93
+ */
94
+ static async getFirstAudioSegmentReference(manifest) {
95
+ const variant = manifest.variants[0];
96
+ expect(variant).not.toBe(null);
97
+ if (!variant) {
98
+ return null;
99
+ }
100
+
101
+ const audio = variant.audio;
102
+ expect(audio).not.toBe(null);
103
+ if (!audio) {
104
+ return null;
105
+ }
106
+
107
+ await audio.createSegmentIndex();
108
+ const position = audio.segmentIndex.find(0);
109
+ goog.asserts.assert(position != null, 'Position should not be null!');
110
+
111
+ const reference = audio.segmentIndex.get(position);
112
+ goog.asserts.assert(reference != null, 'Reference should not be null!');
113
+ return reference;
114
+ }
115
+ };
@@ -42,6 +42,7 @@ shaka.test.OfflineUtils = class {
42
42
  pixelAspectRatio: undefined,
43
43
  kind: undefined,
44
44
  language: '',
45
+ originalLanguage: null,
45
46
  label: null,
46
47
  width: null,
47
48
  height: null,
@@ -503,17 +503,26 @@ shaka.test.FakeSegmentIndex = class {
503
503
  }
504
504
  };
505
505
 
506
- /** @extends {shaka.media.Transmuxer} */
506
+ /** @implements {shaka.extern.Transmuxer} */
507
507
  shaka.test.FakeTransmuxer = class {
508
508
  constructor() {
509
+ const mp4MimeType = 'video/mp4; codecs="avc1.42E01E"';
510
+
509
511
  const output = {
510
512
  data: new Uint8Array(),
511
513
  captions: [],
512
514
  };
513
515
 
514
516
  /** @type {!jasmine.Spy} */
515
- this.destroy =
516
- jasmine.createSpy('destroy').and.returnValue(Promise.resolve());
517
+ this.destroy = jasmine.createSpy('destroy');
518
+
519
+ /** @type {!jasmine.Spy} */
520
+ this.isSupported =
521
+ jasmine.createSpy('isSupported').and.returnValue(true);
522
+
523
+ /** @type {!jasmine.Spy} */
524
+ this.convertCodecs =
525
+ jasmine.createSpy('convertCodecs').and.returnValue(mp4MimeType);
517
526
 
518
527
  /** @type {!jasmine.Spy} */
519
528
  this.transmux =
@@ -28,12 +28,12 @@ shaka.test.StreamingEngineUtil = class {
28
28
  static createFakeNetworkingEngine(getInitSegment, getSegment, delays) {
29
29
  const netEngine = new shaka.test.FakeNetworkingEngine();
30
30
 
31
- netEngine.request.and.callFake((requestType, request) => {
31
+ netEngine.request.and.callFake((requestType, request, context) => {
32
32
  expect(requestType).toBeTruthy();
33
33
  expect(request.uris.length).toBe(1);
34
34
 
35
35
  const parts = request.uris[0].split('_');
36
- expect(parts.length).toBe(3);
36
+ expect(parts.length).toBeGreaterThanOrEqual(3);
37
37
 
38
38
  const periodIndex = Number(parts[0]);
39
39
  expect(periodIndex).not.toBeNaN();
@@ -284,6 +284,9 @@ shaka.test.StreamingEngineUtil = class {
284
284
  textStreams: [],
285
285
  imageStreams: [],
286
286
  sequenceMode: false,
287
+ ignoreManifestTimestampsInSegmentsMode: false,
288
+ type: 'UNKNOWN',
289
+ serviceDescription: null,
287
290
  };
288
291
 
289
292
  /** @type {shaka.extern.Variant} */
@@ -399,6 +402,7 @@ shaka.test.StreamingEngineUtil = class {
399
402
  type: ContentType.AUDIO,
400
403
  label: '',
401
404
  language: 'und',
405
+ originalLanguage: null,
402
406
  drmInfos: [],
403
407
  encrypted: false,
404
408
  keyIds: new Set(),
@@ -410,6 +414,7 @@ shaka.test.StreamingEngineUtil = class {
410
414
  roles: [],
411
415
  forced: false,
412
416
  spatialAudio: false,
417
+ accessibilityPurpose: null,
413
418
  external: false,
414
419
  };
415
420
  }
@@ -418,9 +423,10 @@ shaka.test.StreamingEngineUtil = class {
418
423
  * Creates a mock video Stream.
419
424
  *
420
425
  * @param {number} id
426
+ * @param {string=} mimeType
421
427
  * @return {shaka.extern.Stream}
422
428
  */
423
- static createMockVideoStream(id) {
429
+ static createMockVideoStream(id, mimeType='video/mp4') {
424
430
  const ContentType = shaka.util.ManifestParserUtils.ContentType;
425
431
  const Util = shaka.test.Util;
426
432
 
@@ -429,7 +435,7 @@ shaka.test.StreamingEngineUtil = class {
429
435
  originalId: id.toString(),
430
436
  createSegmentIndex: Util.spyFunc(jasmine.createSpy('createSegmentIndex')),
431
437
  segmentIndex: null,
432
- mimeType: 'video/mp4',
438
+ mimeType: mimeType,
433
439
  codecs: 'avc1.42c01e',
434
440
  bandwidth: 5000000,
435
441
  width: 600,
@@ -437,6 +443,7 @@ shaka.test.StreamingEngineUtil = class {
437
443
  type: ContentType.VIDEO,
438
444
  label: '',
439
445
  language: 'und',
446
+ originalLanguage: null,
440
447
  drmInfos: [],
441
448
  encrypted: false,
442
449
  keyIds: new Set(),
@@ -448,6 +455,7 @@ shaka.test.StreamingEngineUtil = class {
448
455
  roles: [],
449
456
  forced: false,
450
457
  spatialAudio: false,
458
+ accessibilityPurpose: null,
451
459
  external: false,
452
460
  };
453
461
  }
@@ -473,6 +481,7 @@ shaka.test.StreamingEngineUtil = class {
473
481
  type: ManifestParserUtils.ContentType.TEXT,
474
482
  label: '',
475
483
  language: 'und',
484
+ originalLanguage: null,
476
485
  drmInfos: [],
477
486
  encrypted: false,
478
487
  keyIds: new Set(),
@@ -484,6 +493,7 @@ shaka.test.StreamingEngineUtil = class {
484
493
  roles: [],
485
494
  forced: false,
486
495
  spatialAudio: false,
496
+ accessibilityPurpose: null,
487
497
  external: false,
488
498
  };
489
499
  }
@@ -31,7 +31,7 @@ shaka.test.TtmlUtils = class {
31
31
 
32
32
  /**
33
33
  * @param {!Object} properties
34
- * @return {!shaka.extern.Cue}
34
+ * @return {!shaka.text.Cue}
35
35
  */
36
36
  const makeContainer = (properties) => {
37
37
  const region = {
@@ -47,7 +47,7 @@ shaka.test.TtmlUtils = class {
47
47
  viewportAnchorUnits: shaka.text.CueRegion.units.PERCENTAGE,
48
48
  scroll: '',
49
49
  };
50
- const containerCue = /** @type {!shaka.extern.Cue} */ ({
50
+ const containerCue = /** @type {!shaka.text.Cue} */ ({
51
51
  region,
52
52
  nestedCues: jasmine.any(Object),
53
53
  payload: '',
@@ -41,7 +41,7 @@ describe('Cue', () => {
41
41
  /**
42
42
  * @param {string} text
43
43
  * @param {!shaka.extern.TextParser.TimeContext} time
44
- * @return {!Array.<!shaka.extern.Cue>}
44
+ * @return {!Array.<!shaka.text.Cue>}
45
45
  */
46
46
  function parseVtt(text, time) {
47
47
  const data =
@@ -5,6 +5,8 @@
5
5
  */
6
6
 
7
7
  describe('SrtTextParser', () => {
8
+ const Cue = shaka.text.Cue;
9
+
8
10
  it('supports no cues', () => {
9
11
  verifyHelper([],
10
12
  '',
@@ -59,6 +61,82 @@ describe('SrtTextParser', () => {
59
61
  {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
60
62
  });
61
63
 
64
+ it('supports payload stylized', () => {
65
+ verifyHelper(
66
+ [
67
+ {
68
+ startTime: 10,
69
+ endTime: 20,
70
+ payload: '',
71
+ nestedCues: [
72
+ {
73
+ startTime: 10,
74
+ endTime: 20,
75
+ payload: 'Test',
76
+ fontWeight: Cue.fontWeight.BOLD,
77
+ },
78
+ {
79
+ startTime: 10,
80
+ endTime: 20,
81
+ payload: ' Unstyled',
82
+ },
83
+ ],
84
+ },
85
+ {
86
+ startTime: 20,
87
+ endTime: 30,
88
+ payload: '',
89
+ nestedCues: [
90
+ {
91
+ startTime: 20,
92
+ endTime: 30,
93
+ payload: 'Test2',
94
+ fontStyle: Cue.fontStyle.ITALIC,
95
+ },
96
+ ],
97
+ },
98
+ {
99
+ startTime: 30,
100
+ endTime: 40,
101
+ payload: '',
102
+ nestedCues: [
103
+ {
104
+ startTime: 30,
105
+ endTime: 40,
106
+ payload: 'Test3',
107
+ textDecoration: [Cue.textDecoration.UNDERLINE],
108
+ },
109
+ ],
110
+ },
111
+ {
112
+ startTime: 40,
113
+ endTime: 50,
114
+ payload: '',
115
+ nestedCues: [
116
+ {
117
+ startTime: 40,
118
+ endTime: 50,
119
+ payload: 'Test4',
120
+ color: 'red',
121
+ },
122
+ ],
123
+ },
124
+ ],
125
+ '1\n' +
126
+ '00:00:10,000 --> 00:00:20,000\n' +
127
+ '{b}Test{/b} Unstyled\n\n' +
128
+ '2\n' +
129
+ '00:00:20,000 --> 00:00:30,000\n' +
130
+ '{i}Test2{/i}\n\n' +
131
+ '3\n' +
132
+ '00:00:30,000 --> 00:00:40,000\n' +
133
+ '{u}Test3{/u}\n\n'+
134
+ '4\n' +
135
+ '00:00:40,000 --> 00:00:50,000\n' +
136
+ '<font color="red">Test4</font>',
137
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
138
+ });
139
+
62
140
  /**
63
141
  * @param {!Array} cues
64
142
  * @param {string} text
@@ -66,14 +66,23 @@ describe('TextEngine', () => {
66
66
  expect(TextEngine.isTypeSupported(dummyMimeType)).toBe(false);
67
67
  });
68
68
 
69
- it('reports support when it\'s closed captions',
70
- () => {
71
- // Both CEA-608 and CEA-708 is supported by our closed caption parser.
72
- expect(TextEngine.isTypeSupported(
73
- shaka.util.MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE)).toBe(true);
74
- expect(TextEngine.isTypeSupported(
75
- shaka.util.MimeUtils.CEA708_CLOSED_CAPTION_MIMETYPE)).toBe(true);
76
- });
69
+ it('reports support for closed captions if decoder is installed', () => {
70
+ const originalFind = shaka.media.ClosedCaptionParser.findDecoder;
71
+ const mockFind = jasmine.createSpy('findDecoder').and.returnValue(null);
72
+ shaka.media.ClosedCaptionParser.findDecoder =
73
+ shaka.test.Util.spyFunc(mockFind);
74
+ // Both CEA-608 and CEA-708 is supported by our closed caption parser.
75
+ expect(TextEngine.isTypeSupported(
76
+ shaka.util.MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE)).toBe(false);
77
+ expect(TextEngine.isTypeSupported(
78
+ shaka.util.MimeUtils.CEA708_CLOSED_CAPTION_MIMETYPE)).toBe(false);
79
+
80
+ shaka.media.ClosedCaptionParser.findDecoder = originalFind;
81
+ expect(TextEngine.isTypeSupported(
82
+ shaka.util.MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE)).toBe(true);
83
+ expect(TextEngine.isTypeSupported(
84
+ shaka.util.MimeUtils.CEA708_CLOSED_CAPTION_MIMETYPE)).toBe(true);
85
+ });
77
86
  });
78
87
 
79
88
  describe('appendBuffer', () => {
@@ -81,10 +81,10 @@ describe('UITextDisplayer', () => {
81
81
  cue.direction = shaka.text.Cue.direction.HORIZONTAL_LEFT_TO_RIGHT;
82
82
  cue.fontSize = '10px';
83
83
  cue.fontWeight = shaka.text.Cue.fontWeight.NORMAL;
84
- cue.fontStyle = 'normal';
84
+ cue.fontStyle = shaka.text.Cue.fontStyle.NORMAL;
85
85
  cue.lineHeight = '2';
86
86
  cue.nestedCues = [];
87
- cue.textAlign = 'center';
87
+ cue.textAlign = shaka.text.Cue.textAlign.CENTER;
88
88
  cue.writingMode = shaka.text.Cue.writingMode.HORIZONTAL_TOP_TO_BOTTOM;
89
89
 
90
90
  textDisplayer.setTextVisibility(true);
@@ -126,13 +126,13 @@ describe('UITextDisplayer', () => {
126
126
  const cue = new shaka.text.Cue(0, 100, '');
127
127
  const nestedCue = new shaka.text.Cue(0, 100, 'Captain\'s log.');
128
128
  cue.nestedCues = [nestedCue];
129
- nestedCue.textAlign = 'center';
129
+ nestedCue.textAlign = shaka.text.Cue.textAlign.CENTER;
130
130
  nestedCue.writingMode = shaka.text.Cue.writingMode.HORIZONTAL_TOP_TO_BOTTOM;
131
131
  nestedCue.color = 'green';
132
132
  nestedCue.backgroundColor = 'black';
133
133
  nestedCue.fontSize = '10px';
134
134
  nestedCue.fontWeight = shaka.text.Cue.fontWeight.NORMAL;
135
- nestedCue.fontStyle = 'normal';
135
+ nestedCue.fontStyle = shaka.text.Cue.fontStyle.NORMAL;
136
136
  nestedCue.lineHeight = '2';
137
137
  nestedCue.nestedCues = [];
138
138