shaka-player 3.1.3 → 3.2.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.
Files changed (182) hide show
  1. package/AUTHORS +3 -0
  2. package/CHANGELOG.md +175 -3
  3. package/CONTRIBUTORS +3 -0
  4. package/README.md +4 -4
  5. package/build/generateExterns.js +1 -1
  6. package/build/types/polyfill +1 -0
  7. package/demo/common/asset.js +9 -7
  8. package/demo/common/assets.js +11 -2
  9. package/demo/common/message_ids.js +2 -1
  10. package/demo/config.js +5 -2
  11. package/demo/index.html +1 -1
  12. package/demo/locales/en.json +2 -1
  13. package/demo/locales/source.json +8 -4
  14. package/demo/main.js +2 -1
  15. package/dist/controls.css +2 -2
  16. package/dist/controls.css.map +1 -1
  17. package/dist/demo.compiled.debug.js +15 -15
  18. package/dist/demo.compiled.debug.map +2 -2
  19. package/dist/demo.compiled.js +15 -15
  20. package/dist/demo.compiled.map +2 -2
  21. package/dist/deps.js +22 -21
  22. package/dist/locales.js +36 -36
  23. package/dist/receiver.compiled.debug.js +9 -9
  24. package/dist/receiver.compiled.debug.map +2 -2
  25. package/dist/receiver.compiled.js +9 -9
  26. package/dist/receiver.compiled.map +2 -2
  27. package/dist/shaka-player.compiled.d.ts +58 -10
  28. package/dist/shaka-player.compiled.debug.d.ts +58 -10
  29. package/dist/shaka-player.compiled.debug.externs.js +777 -717
  30. package/dist/shaka-player.compiled.debug.js +639 -607
  31. package/dist/shaka-player.compiled.debug.map +4 -4
  32. package/dist/shaka-player.compiled.externs.js +777 -717
  33. package/dist/shaka-player.compiled.js +826 -819
  34. package/dist/shaka-player.compiled.map +4 -4
  35. package/dist/shaka-player.ui.d.ts +58 -10
  36. package/dist/shaka-player.ui.debug.d.ts +58 -10
  37. package/dist/shaka-player.ui.debug.externs.js +529 -469
  38. package/dist/shaka-player.ui.debug.js +676 -645
  39. package/dist/shaka-player.ui.debug.map +4 -4
  40. package/dist/shaka-player.ui.externs.js +529 -469
  41. package/dist/shaka-player.ui.js +963 -955
  42. package/dist/shaka-player.ui.map +4 -4
  43. package/docs/tutorials/fairplay.md +1 -1
  44. package/docs/tutorials/ui.md +5 -5
  45. package/externs/aria.js +6 -0
  46. package/externs/shaka/ads.js +24 -1
  47. package/externs/shaka/manifest.js +6 -1
  48. package/externs/shaka/offline.js +5 -0
  49. package/externs/shaka/player.js +53 -9
  50. package/externs/shaka/text.js +10 -10
  51. package/externs/texttrack.js +3 -0
  52. package/karma.conf.js +1 -0
  53. package/lib/ads/ad_manager.js +16 -15
  54. package/lib/ads/client_side_ad_manager.js +52 -88
  55. package/lib/ads/server_side_ad_manager.js +26 -12
  56. package/lib/cast/cast_proxy.js +11 -2
  57. package/lib/cast/cast_receiver.js +2 -1
  58. package/lib/cast/cast_sender.js +2 -2
  59. package/lib/cast/cast_utils.js +6 -1
  60. package/lib/cea/cea608_data_channel.js +56 -56
  61. package/lib/cea/cea608_memory.js +33 -33
  62. package/lib/cea/cea708_service.js +43 -43
  63. package/lib/cea/cea708_window.js +38 -38
  64. package/lib/cea/cea_decoder.js +13 -14
  65. package/lib/cea/cea_utils.js +23 -23
  66. package/lib/cea/dtvcc_packet_builder.js +7 -7
  67. package/lib/cea/i_caption_decoder.js +2 -3
  68. package/lib/cea/i_cea_parser.js +2 -2
  69. package/lib/cea/mp4_cea_parser.js +6 -6
  70. package/lib/dash/dash_parser.js +98 -2
  71. package/lib/dash/segment_list.js +1 -1
  72. package/lib/dash/segment_template.js +1 -1
  73. package/lib/hls/hls_parser.js +159 -29
  74. package/lib/media/closed_caption_parser.js +1 -2
  75. package/lib/media/drm_engine.js +169 -192
  76. package/lib/media/gap_jumping_controller.js +4 -2
  77. package/lib/media/media_source_engine.js +1 -2
  78. package/lib/media/segment_index.js +3 -1
  79. package/lib/media/segment_reference.js +19 -2
  80. package/lib/media/streaming_engine.js +8 -7
  81. package/lib/net/networking_engine.js +3 -1
  82. package/lib/offline/download_manager.js +1 -2
  83. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  84. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  85. package/lib/offline/manifest_converter.js +3 -1
  86. package/lib/offline/storage.js +12 -14
  87. package/lib/player.js +437 -167
  88. package/lib/polyfill/aria.js +82 -0
  89. package/lib/polyfill/media_capabilities.js +7 -1
  90. package/lib/polyfill/mediasource.js +6 -0
  91. package/lib/polyfill/orientation.js +1 -1
  92. package/lib/polyfill/patchedmediakeys_apple.js +4 -4
  93. package/lib/polyfill/patchedmediakeys_ms.js +4 -4
  94. package/lib/polyfill/patchedmediakeys_webkit.js +4 -4
  95. package/lib/routing/walker.js +2 -3
  96. package/lib/text/mp4_ttml_parser.js +3 -0
  97. package/lib/text/srt_text_parser.js +4 -4
  98. package/lib/text/text_engine.js +16 -4
  99. package/lib/text/ttml_text_parser.js +5 -0
  100. package/lib/text/ui_text_displayer.js +85 -37
  101. package/lib/text/vtt_text_parser.js +2 -2
  102. package/lib/text/web_vtt_generator.js +55 -12
  103. package/lib/util/error.js +6 -0
  104. package/lib/util/fake_event.js +53 -7
  105. package/lib/util/manifest_parser_utils.js +1 -0
  106. package/lib/util/mp4_box_parsers.js +20 -20
  107. package/lib/util/multi_map.js +8 -0
  108. package/lib/util/periods.js +4 -1
  109. package/lib/util/platform.js +13 -1
  110. package/lib/util/player_configuration.js +13 -1
  111. package/lib/util/stream_utils.js +153 -85
  112. package/lib/util/xml_utils.js +31 -12
  113. package/package.json +1 -1
  114. package/roadmap.md +24 -22
  115. package/shaka-player.uncompiled.js +1 -0
  116. package/test/cast/cast_proxy_unit.js +12 -6
  117. package/test/cast/cast_utils_unit.js +2 -1
  118. package/test/cea/cea608_memory_unit.js +1 -1
  119. package/test/cea/cea708_service_unit.js +8 -8
  120. package/test/cea/cea708_window_unit.js +6 -6
  121. package/test/cea/cea_decoder_unit.js +1 -1
  122. package/test/cea/dtvcc_packet_builder_unit.js +2 -2
  123. package/test/dash/dash_parser_manifest_unit.js +230 -2
  124. package/test/hls/hls_parser_unit.js +255 -1
  125. package/test/media/closed_caption_parser_unit.js +6 -1
  126. package/test/media/drm_engine_integration.js +86 -12
  127. package/test/media/drm_engine_unit.js +353 -450
  128. package/test/offline/manifest_convert_unit.js +2 -0
  129. package/test/offline/storage_integration.js +9 -19
  130. package/test/player_integration.js +90 -0
  131. package/test/player_src_equals_integration.js +52 -0
  132. package/test/player_unit.js +11 -33
  133. package/test/test/assets/3675/chunk-stream0-00001.m4s +0 -0
  134. package/test/test/assets/3675/chunk-stream0-00002.m4s +0 -0
  135. package/test/test/assets/3675/chunk-stream0-00003.m4s +0 -0
  136. package/test/test/assets/3675/chunk-stream0-00004.m4s +0 -0
  137. package/test/test/assets/3675/chunk-stream0-00005.m4s +0 -0
  138. package/test/test/assets/3675/chunk-stream0-00006.m4s +0 -0
  139. package/test/test/assets/3675/chunk-stream0-00007.m4s +0 -0
  140. package/test/test/assets/3675/dash_0.mpd +30 -0
  141. package/test/test/assets/3675/dash_1.mpd +30 -0
  142. package/test/test/assets/3675/dash_2.mpd +30 -0
  143. package/test/test/assets/3675/dash_3.mpd +30 -0
  144. package/test/test/assets/3675/dash_4.mpd +30 -0
  145. package/test/test/assets/3675/dash_5.mpd +26 -0
  146. package/test/test/assets/3675/init-stream0.m4s +0 -0
  147. package/test/test/assets/chapters.srt +11 -0
  148. package/test/test/assets/chapters.vtt +10 -0
  149. package/test/test/util/cea_utils.js +12 -12
  150. package/test/test/util/fake_ad_manager.js +8 -1
  151. package/test/test/util/manifest_generator.js +2 -0
  152. package/test/test/util/manifest_parser_util.js +3 -1
  153. package/test/text/ttml_text_parser_unit.js +9 -0
  154. package/test/text/ui_text_displayer_unit.js +29 -17
  155. package/test/text/web_vtt_generator_unit.js +81 -7
  156. package/test/ui/localization_unit.js +15 -14
  157. package/test/ui/text_displayer_layout_unit.js +13 -1
  158. package/test/util/stream_utils_unit.js +153 -10
  159. package/ui/airplay_button.js +1 -1
  160. package/ui/audio_language_selection.js +2 -5
  161. package/ui/cast_button.js +6 -9
  162. package/ui/constants.js +0 -3
  163. package/ui/controls.js +4 -6
  164. package/ui/fast_forward_button.js +2 -3
  165. package/ui/fullscreen_button.js +1 -3
  166. package/ui/language_utils.js +1 -1
  167. package/ui/less/containers.less +3 -7
  168. package/ui/locales/ru.json +6 -6
  169. package/ui/localization.js +28 -51
  170. package/ui/loop_button.js +1 -3
  171. package/ui/mute_button.js +1 -3
  172. package/ui/overflow_menu.js +2 -3
  173. package/ui/pip_button.js +7 -10
  174. package/ui/playback_rate_selection.js +3 -6
  175. package/ui/presentation_time.js +1 -3
  176. package/ui/resolution_selection.js +4 -7
  177. package/ui/rewind_button.js +2 -3
  178. package/ui/seek_bar.js +2 -4
  179. package/ui/spacer.js +1 -1
  180. package/ui/text_selection.js +8 -11
  181. package/ui/ui_utils.js +1 -1
  182. package/ui/volume_bar.js +1 -3
@@ -138,7 +138,7 @@ shaka.ads.ClientSideAdManager = class {
138
138
  // Remove ad breaks from the timeline
139
139
  this.onEvent_(
140
140
  new shaka.util.FakeEvent(shaka.ads.AdManager.CUEPOINTS_CHANGED,
141
- {'cuepoints': []}));
141
+ (new Map()).set('cuepoints', [])));
142
142
  }
143
143
 
144
144
 
@@ -151,30 +151,31 @@ shaka.ads.ClientSideAdManager = class {
151
151
 
152
152
  const now = Date.now() / 1000;
153
153
  const loadTime = now - this.requestAdsStartTime_;
154
- this.onEvent_(
155
- new shaka.util.FakeEvent(shaka.ads.AdManager.ADS_LOADED,
156
- {'loadTime': loadTime}));
154
+ this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.ADS_LOADED,
155
+ (new Map()).set('loadTime', loadTime)));
157
156
 
158
157
  this.imaAdsManager_ = e.getAdsManager(this.video_);
159
158
 
160
159
  this.onEvent_(new shaka.util.FakeEvent(
161
160
  shaka.ads.AdManager.IMA_AD_MANAGER_LOADED,
162
- {
163
- 'imaAdManager': this.imaAdsManager_,
164
- }));
161
+ (new Map()).set('imaAdManager', this.imaAdsManager_)));
165
162
 
166
163
  const cuePointStarts = this.imaAdsManager_.getCuePoints();
167
164
  if (cuePointStarts.length) {
168
- /** @type {!Array.<!shaka.ads.CuePoint>} */
165
+ /** @type {!Array.<!shaka.extern.AdCuePoint>} */
169
166
  const cuePoints = [];
170
167
  for (const start of cuePointStarts) {
171
- const shakaCuePoint = new shaka.ads.CuePoint(start);
168
+ /** @type {shaka.extern.AdCuePoint} */
169
+ const shakaCuePoint = {
170
+ start: start,
171
+ end: null,
172
+ };
172
173
  cuePoints.push(shakaCuePoint);
173
174
  }
174
175
 
175
- this.onEvent_(
176
- new shaka.util.FakeEvent(shaka.ads.AdManager.CUEPOINTS_CHANGED,
177
- {'cuepoints': cuePoints}));
176
+ this.onEvent_(new shaka.util.FakeEvent(
177
+ shaka.ads.AdManager.CUEPOINTS_CHANGED,
178
+ (new Map()).set('cuepoints', cuePoints)));
178
179
  }
179
180
 
180
181
  this.addImaEventListeners_();
@@ -224,6 +225,15 @@ shaka.ads.ClientSideAdManager = class {
224
225
  * @private
225
226
  */
226
227
  addImaEventListeners_() {
228
+ /**
229
+ * @param {!Event} e
230
+ * @param {string} type
231
+ */
232
+ const convertEventAndSend = (e, type) => {
233
+ const data = (new Map()).set('originalEvent', e);
234
+ this.onEvent_(new shaka.util.FakeEvent(type, data));
235
+ };
236
+
227
237
  this.eventManager_.listen(this.imaAdsManager_,
228
238
  google.ima.AdErrorEvent.Type.AD_ERROR, (error) => {
229
239
  this.onAdError_(/** @type {!google.ima.AdErrorEvent} */ (error));
@@ -241,30 +251,22 @@ shaka.ads.ClientSideAdManager = class {
241
251
 
242
252
  this.eventManager_.listen(this.imaAdsManager_,
243
253
  google.ima.AdEvent.Type.FIRST_QUARTILE, (e) => {
244
- this.onEvent_(
245
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_FIRST_QUARTILE,
246
- {'originalEvent': e}));
254
+ convertEventAndSend(e, shaka.ads.AdManager.AD_FIRST_QUARTILE);
247
255
  });
248
256
 
249
257
  this.eventManager_.listen(this.imaAdsManager_,
250
258
  google.ima.AdEvent.Type.MIDPOINT, (e) => {
251
- this.onEvent_(
252
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_MIDPOINT,
253
- {'originalEvent': e}));
259
+ convertEventAndSend(e, shaka.ads.AdManager.AD_MIDPOINT);
254
260
  });
255
261
 
256
262
  this.eventManager_.listen(this.imaAdsManager_,
257
263
  google.ima.AdEvent.Type.THIRD_QUARTILE, (e) => {
258
- this.onEvent_(
259
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_THIRD_QUARTILE,
260
- {'originalEvent': e}));
264
+ convertEventAndSend(e, shaka.ads.AdManager.AD_THIRD_QUARTILE);
261
265
  });
262
266
 
263
267
  this.eventManager_.listen(this.imaAdsManager_,
264
268
  google.ima.AdEvent.Type.COMPLETE, (e) => {
265
- this.onEvent_(
266
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_COMPLETE,
267
- {'originalEvent': e}));
269
+ convertEventAndSend(e, shaka.ads.AdManager.AD_COMPLETE);
268
270
  });
269
271
 
270
272
  this.eventManager_.listen(this.imaAdsManager_,
@@ -279,140 +281,102 @@ shaka.ads.ClientSideAdManager = class {
279
281
 
280
282
  this.eventManager_.listen(this.imaAdsManager_,
281
283
  google.ima.AdEvent.Type.SKIPPED, (e) => {
282
- this.onEvent_(
283
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_SKIPPED,
284
- {'originalEvent': e}));
284
+ convertEventAndSend(e, shaka.ads.AdManager.AD_SKIPPED);
285
285
  });
286
286
 
287
287
  this.eventManager_.listen(this.imaAdsManager_,
288
288
  google.ima.AdEvent.Type.VOLUME_CHANGED, (e) => {
289
- this.onEvent_(
290
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_VOLUME_CHANGED,
291
- {'originalEvent': e}));
289
+ convertEventAndSend(e, shaka.ads.AdManager.AD_VOLUME_CHANGED);
292
290
  });
293
291
 
294
292
  this.eventManager_.listen(this.imaAdsManager_,
295
293
  google.ima.AdEvent.Type.VOLUME_MUTED, (e) => {
296
- this.onEvent_(
297
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_MUTED,
298
- {'originalEvent': e}));
294
+ convertEventAndSend(e, shaka.ads.AdManager.AD_MUTED);
299
295
  });
300
296
 
301
297
  this.eventManager_.listen(this.imaAdsManager_,
302
298
  google.ima.AdEvent.Type.PAUSED, (e) => {
303
299
  goog.asserts.assert(this.ad_ != null, 'Ad should not be null!');
304
300
  this.ad_.setPaused(true);
305
- this.onEvent_(
306
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_PAUSED,
307
- {'originalEvent': e}));
301
+ convertEventAndSend(e, shaka.ads.AdManager.AD_PAUSED);
308
302
  });
309
303
 
310
304
  this.eventManager_.listen(this.imaAdsManager_,
311
305
  google.ima.AdEvent.Type.RESUMED, (e) => {
312
306
  goog.asserts.assert(this.ad_ != null, 'Ad should not be null!');
313
307
  this.ad_.setPaused(false);
314
- this.onEvent_(
315
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_RESUMED,
316
- {'originalEvent': e}));
308
+ convertEventAndSend(e, shaka.ads.AdManager.AD_RESUMED);
317
309
  });
318
310
 
319
311
  this.eventManager_.listen(this.imaAdsManager_,
320
312
  google.ima.AdEvent.Type.SKIPPABLE_STATE_CHANGED, (e) => {
321
313
  goog.asserts.assert(this.ad_ != null, 'Ad should not be null!');
322
- this.onEvent_(new shaka.util.FakeEvent(
323
- shaka.ads.AdManager.AD_SKIP_STATE_CHANGED,
324
- {'originalEvent': e}));
314
+ convertEventAndSend(e, shaka.ads.AdManager.AD_SKIP_STATE_CHANGED);
325
315
  });
326
316
 
327
317
  this.eventManager_.listen(this.imaAdsManager_,
328
318
  google.ima.AdEvent.Type.CLICK, (e) => {
329
- this.onEvent_(new shaka.util.FakeEvent(
330
- shaka.ads.AdManager.AD_CLICKED,
331
- {'originalEvent': e}));
319
+ convertEventAndSend(e, shaka.ads.AdManager.AD_CLICKED);
332
320
  });
333
321
 
334
322
  this.eventManager_.listen(this.imaAdsManager_,
335
323
  google.ima.AdEvent.Type.AD_PROGRESS, (e) => {
336
- this.onEvent_(new shaka.util.FakeEvent(
337
- shaka.ads.AdManager.AD_PROGRESS,
338
- {'originalEvent': e}));
324
+ convertEventAndSend(e, shaka.ads.AdManager.AD_PROGRESS);
339
325
  });
340
326
 
341
327
  this.eventManager_.listen(this.imaAdsManager_,
342
328
  google.ima.AdEvent.Type.AD_BUFFERING, (e) => {
343
- this.onEvent_(new shaka.util.FakeEvent(
344
- shaka.ads.AdManager.AD_BUFFERING,
345
- {'originalEvent': e}));
329
+ convertEventAndSend(e, shaka.ads.AdManager.AD_BUFFERING);
346
330
  });
347
331
 
348
332
  this.eventManager_.listen(this.imaAdsManager_,
349
333
  google.ima.AdEvent.Type.IMPRESSION, (e) => {
350
- this.onEvent_(new shaka.util.FakeEvent(
351
- shaka.ads.AdManager.AD_IMPRESSION,
352
- {'originalEvent': e}));
334
+ convertEventAndSend(e, shaka.ads.AdManager.AD_IMPRESSION);
353
335
  });
354
336
 
355
337
  this.eventManager_.listen(this.imaAdsManager_,
356
338
  google.ima.AdEvent.Type.DURATION_CHANGE, (e) => {
357
- this.onEvent_(new shaka.util.FakeEvent(
358
- shaka.ads.AdManager.AD_DURATION_CHANGED,
359
- {'originalEvent': e}));
339
+ convertEventAndSend(e, shaka.ads.AdManager.AD_DURATION_CHANGED);
360
340
  });
361
341
 
362
342
  this.eventManager_.listen(this.imaAdsManager_,
363
343
  google.ima.AdEvent.Type.USER_CLOSE, (e) => {
364
- this.onEvent_(new shaka.util.FakeEvent(
365
- shaka.ads.AdManager.AD_CLOSED,
366
- {'originalEvent': e}));
344
+ convertEventAndSend(e, shaka.ads.AdManager.AD_CLOSED);
367
345
  });
368
346
 
369
347
  this.eventManager_.listen(this.imaAdsManager_,
370
348
  google.ima.AdEvent.Type.LOADED, (e) => {
371
- this.onEvent_(new shaka.util.FakeEvent(
372
- shaka.ads.AdManager.AD_LOADED,
373
- {'originalEvent': e}));
349
+ convertEventAndSend(e, shaka.ads.AdManager.AD_LOADED);
374
350
  });
375
351
 
376
352
  this.eventManager_.listen(this.imaAdsManager_,
377
353
  google.ima.AdEvent.Type.ALL_ADS_COMPLETED, (e) => {
378
- this.onEvent_(new shaka.util.FakeEvent(
379
- shaka.ads.AdManager.ALL_ADS_COMPLETED,
380
- {'originalEvent': e}));
354
+ convertEventAndSend(e, shaka.ads.AdManager.ALL_ADS_COMPLETED);
381
355
  });
382
356
 
383
357
  this.eventManager_.listen(this.imaAdsManager_,
384
358
  google.ima.AdEvent.Type.LINEAR_CHANGED, (e) => {
385
- this.onEvent_(new shaka.util.FakeEvent(
386
- shaka.ads.AdManager.AD_LINEAR_CHANGED,
387
- {'originalEvent': e}));
359
+ convertEventAndSend(e, shaka.ads.AdManager.AD_LINEAR_CHANGED);
388
360
  });
389
361
 
390
362
  this.eventManager_.listen(this.imaAdsManager_,
391
363
  google.ima.AdEvent.Type.AD_METADATA, (e) => {
392
- this.onEvent_(new shaka.util.FakeEvent(
393
- shaka.ads.AdManager.AD_METADATA,
394
- {'originalEvent': e}));
364
+ convertEventAndSend(e, shaka.ads.AdManager.AD_METADATA);
395
365
  });
396
366
 
397
367
  this.eventManager_.listen(this.imaAdsManager_,
398
368
  google.ima.AdEvent.Type.LOG, (e) => {
399
- this.onEvent_(new shaka.util.FakeEvent(
400
- shaka.ads.AdManager.AD_RECOVERABLE_ERROR,
401
- {'originalEvent': e}));
369
+ convertEventAndSend(e, shaka.ads.AdManager.AD_RECOVERABLE_ERROR);
402
370
  });
403
371
 
404
372
  this.eventManager_.listen(this.imaAdsManager_,
405
373
  google.ima.AdEvent.Type.AD_BREAK_READY, (e) => {
406
- this.onEvent_(new shaka.util.FakeEvent(
407
- shaka.ads.AdManager.AD_BREAK_READY,
408
- {'originalEvent': e}));
374
+ convertEventAndSend(e, shaka.ads.AdManager.AD_BREAK_READY);
409
375
  });
410
376
 
411
377
  this.eventManager_.listen(this.imaAdsManager_,
412
378
  google.ima.AdEvent.Type.INTERACTION, (e) => {
413
- this.onEvent_(new shaka.util.FakeEvent(
414
- shaka.ads.AdManager.AD_INTERACTION,
415
- {'originalEvent': e}));
379
+ convertEventAndSend(e, shaka.ads.AdManager.AD_INTERACTION);
416
380
  });
417
381
  }
418
382
 
@@ -426,12 +390,12 @@ shaka.ads.ClientSideAdManager = class {
426
390
 
427
391
  const imaAd = e.getAd();
428
392
  this.ad_ = new shaka.ads.ClientSideAd(imaAd, this.imaAdsManager_);
429
- this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.AD_STARTED,
430
- {
431
- 'ad': this.ad_,
432
- 'sdkAdObject': imaAd,
433
- 'originalEvent': e,
434
- }));
393
+ const data = new Map()
394
+ .set('ad', this.ad_)
395
+ .set('sdkAdObject', imaAd)
396
+ .set('originalEvent', e);
397
+ this.onEvent_(new shaka.util.FakeEvent(
398
+ shaka.ads.AdManager.AD_STARTED, data));
435
399
  this.adContainer_.setAttribute('ad-active', 'true');
436
400
  this.video_.pause();
437
401
  }
@@ -442,7 +406,7 @@ shaka.ads.ClientSideAdManager = class {
442
406
  */
443
407
  onAdComplete_(e) {
444
408
  this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.AD_STOPPED,
445
- {'originalEvent': e}));
409
+ (new Map()).set('originalEvent', e)));
446
410
  this.adContainer_.removeAttribute('ad-active');
447
411
  this.video_.play();
448
412
  }
@@ -64,6 +64,9 @@ shaka.ads.ServerSideAdManager = class {
64
64
  /** @private {string} */
65
65
  this.backupUrl_ = '';
66
66
 
67
+ /** @private {!Array.<!shaka.extern.AdCuePoint>} */
68
+ this.currentCuePoints_ = [];
69
+
67
70
  /** @private {shaka.util.EventManager} */
68
71
  this.eventManager_ = new shaka.util.EventManager();
69
72
 
@@ -77,9 +80,7 @@ shaka.ads.ServerSideAdManager = class {
77
80
 
78
81
  this.onEvent_(new shaka.util.FakeEvent(
79
82
  shaka.ads.AdManager.IMA_STREAM_MANAGER_LOADED,
80
- {
81
- 'imaStreamManager': this.streamManager_,
82
- }));
83
+ (new Map()).set('imaStreamManager', this.streamManager_)));
83
84
 
84
85
  // Events
85
86
  this.eventManager_.listen(this.streamManager_,
@@ -214,6 +215,7 @@ shaka.ads.ServerSideAdManager = class {
214
215
  // this.streamManager_.reset();
215
216
  this.backupUrl_ = '';
216
217
  this.snapForwardTime_ = null;
218
+ this.currentCuePoints_ = [];
217
219
  }
218
220
 
219
221
  /** @override */
@@ -251,6 +253,13 @@ shaka.ads.ServerSideAdManager = class {
251
253
  }
252
254
  }
253
255
 
256
+ /**
257
+ * @return {!Array.<!shaka.extern.AdCuePoint>}
258
+ */
259
+ getCuePoints() {
260
+ return this.currentCuePoints_;
261
+ }
262
+
254
263
  /**
255
264
  * If a seek jumped over the ad break, return to the start of the
256
265
  * ad break, then complete the seek after the ad played through.
@@ -298,7 +307,7 @@ shaka.ads.ServerSideAdManager = class {
298
307
  }
299
308
 
300
309
  this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.AD_STARTED,
301
- {'ad': this.ad_}));
310
+ (new Map()).set('ad', this.ad_)));
302
311
  this.adContainer_.setAttribute('ad-active', 'true');
303
312
  }
304
313
 
@@ -324,9 +333,8 @@ shaka.ads.ServerSideAdManager = class {
324
333
  onLoaded_(e) {
325
334
  const now = Date.now() / 1000;
326
335
  const loadTime = now - this.streamRequestStartTime_;
327
- this.onEvent_(
328
- new shaka.util.FakeEvent(shaka.ads.AdManager.ADS_LOADED,
329
- {'loadTime': loadTime}));
336
+ this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.ADS_LOADED,
337
+ (new Map()).set('loadTime', loadTime)));
330
338
 
331
339
  const streamData = e.getStreamData();
332
340
  const url = streamData.url;
@@ -379,15 +387,21 @@ shaka.ads.ServerSideAdManager = class {
379
387
  onCuePointsChanged_(e) {
380
388
  const streamData = e.getStreamData();
381
389
 
382
- /** @type {!Array.<!shaka.ads.CuePoint>} */
390
+ /** @type {!Array.<!shaka.extern.AdCuePoint>} */
383
391
  const cuePoints = [];
384
392
  for (const point of streamData.cuepoints) {
385
- const shakaCuePoint = new shaka.ads.CuePoint(point.start, point.end);
393
+ /** @type {shaka.extern.AdCuePoint} */
394
+ const shakaCuePoint = {
395
+ start: point.start,
396
+ end: point.end,
397
+ };
386
398
  cuePoints.push(shakaCuePoint);
387
399
  }
388
400
 
389
- this.onEvent_(
390
- new shaka.util.FakeEvent(shaka.ads.AdManager.CUEPOINTS_CHANGED,
391
- {'cuepoints': cuePoints}));
401
+ this.currentCuePoints_ = cuePoints;
402
+
403
+ this.onEvent_(new shaka.util.FakeEvent(
404
+ shaka.ads.AdManager.CUEPOINTS_CHANGED,
405
+ (new Map()).set('cuepoints', cuePoints)));
392
406
  }
393
407
  };
@@ -525,7 +525,8 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
525
525
  goog.asserts.assert(error instanceof shaka.util.Error,
526
526
  'Wrong error type!');
527
527
  const eventType = shaka.Player.EventName.Error;
528
- const event = new shaka.util.FakeEvent(eventType, {'detail': error});
528
+ const data = (new Map()).set('detail', error);
529
+ const event = new shaka.util.FakeEvent(eventType, data);
529
530
  this.localPlayer_.dispatchEvent(event);
530
531
  });
531
532
  }
@@ -598,7 +599,7 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
598
599
 
599
600
  // Convert this real Event into a FakeEvent for dispatch from our
600
601
  // FakeEventListener.
601
- const fakeEvent = new shaka.util.FakeEvent(event.type, event);
602
+ const fakeEvent = shaka.util.FakeEvent.fromRealEvent(event);
602
603
  this.videoEventTarget_.dispatchEvent(fakeEvent);
603
604
  }
604
605
 
@@ -647,6 +648,14 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
647
648
  return () => this.localPlayer_.getNetworkingEngine();
648
649
  }
649
650
 
651
+ if (name == 'getDrmEngine') {
652
+ // Always returns a local instance.
653
+ if (this.sender_.isCasting()) {
654
+ shaka.log.warning('NOTE: getDrmEngine() is always local!');
655
+ }
656
+ return () => this.localPlayer_.getDrmEngine();
657
+ }
658
+
650
659
  if (name == 'getAdManager') {
651
660
  // Always returns a local instance.
652
661
  if (this.sender_.isCasting()) {
@@ -407,7 +407,8 @@ shaka.cast.CastReceiver = class extends shaka.util.FakeEventTarget {
407
407
  goog.asserts.assert(error instanceof shaka.util.Error,
408
408
  'Wrong error type!');
409
409
  const eventType = shaka.Player.EventName.Error;
410
- const event = new shaka.util.FakeEvent(eventType, {'detail': error});
410
+ const data = (new Map()).set('detail', error);
411
+ const event = new shaka.util.FakeEvent(eventType, data);
411
412
  // Only dispatch the event if the player still exists.
412
413
  if (this.player_) {
413
414
  this.player_.dispatchEvent(event);
@@ -647,7 +647,7 @@ shaka.cast.CastSender = class {
647
647
  case 'event': {
648
648
  const targetName = message['targetName'];
649
649
  const event = message['event'];
650
- const fakeEvent = new shaka.util.FakeEvent(event['type'], event);
650
+ const fakeEvent = shaka.util.FakeEvent.fromRealEvent(event);
651
651
  this.onRemoteEvent_(targetName, fakeEvent);
652
652
  break;
653
653
  }
@@ -725,7 +725,7 @@ shaka.cast.CastSender = class {
725
725
 
726
726
  // Dispatch it through the Player proxy
727
727
  const fakeEvent = new shaka.util.FakeEvent(
728
- 'error', {'detail': shakaError});
728
+ 'error', (new Map()).set('detail', shakaError));
729
729
  this.onRemoteEvent_('player', fakeEvent);
730
730
 
731
731
  // Force this session to disconnect and transfer playback to the local
@@ -305,10 +305,11 @@ shaka.cast.CastUtils.PlayerGetterMethods = {
305
305
  'getAssetUri': 2,
306
306
  'getAudioLanguages': 4,
307
307
  'getAudioLanguagesAndRoles': 4,
308
+ 'getBufferFullness': 1,
308
309
  'getBufferedInfo': 2,
309
310
  // NOTE: The 'getSharedConfiguration' property is not proxied as it would
310
311
  // not be possible to share a reference.
311
- 'getConfiguration': 2,
312
+ 'getConfiguration': 4,
312
313
  'getExpiration': 2,
313
314
  'getKeyStatuses': 2,
314
315
  // NOTE: The 'getManifest' property is not proxied, as it is very large.
@@ -371,10 +372,13 @@ shaka.cast.CastUtils.PlayerInitAfterLoadState = [
371
372
  * @const {!Array.<string>}
372
373
  */
373
374
  shaka.cast.CastUtils.PlayerVoidMethods = [
375
+ 'addChaptersTrack',
374
376
  'addTextTrack',
375
377
  'addTextTrackAsync',
376
378
  'cancelTrickPlay',
377
379
  'configure',
380
+ 'getChapters',
381
+ 'getChaptersTracks',
378
382
  'resetConfiguration',
379
383
  'retryStreaming',
380
384
  'selectAudioLanguage',
@@ -384,6 +388,7 @@ shaka.cast.CastUtils.PlayerVoidMethods = [
384
388
  'selectVariantsByLabel',
385
389
  'setTextTrackVisibility',
386
390
  'trickPlay',
391
+ 'goToLive',
387
392
  ];
388
393
 
389
394