shaka-player 3.2.1 → 3.3.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 (213) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +1 -1
  3. package/.github/ISSUE_TEMPLATE/question.md +1 -1
  4. package/AUTHORS +9 -5
  5. package/CHANGELOG.md +358 -0
  6. package/CONTRIBUTORS +7 -2
  7. package/build/conformance.textproto +183 -169
  8. package/build/generateExterns.js +1 -1
  9. package/build/types/core +3 -0
  10. package/build/types/offline +1 -0
  11. package/build/types/polyfill +1 -0
  12. package/build/types/ui +2 -0
  13. package/demo/common/assets.js +19 -1
  14. package/demo/common/message_ids.js +13 -1
  15. package/demo/config.js +31 -1
  16. package/demo/index.html +1 -1
  17. package/demo/locales/en.json +12 -0
  18. package/demo/locales/source.json +48 -0
  19. package/dist/controls.css +26 -2
  20. package/dist/controls.css.map +1 -1
  21. package/dist/demo.compiled.debug.js +20 -17
  22. package/dist/demo.compiled.debug.map +3 -3
  23. package/dist/demo.compiled.js +20 -17
  24. package/dist/demo.compiled.map +3 -3
  25. package/dist/deps.js +19 -12
  26. package/dist/locales.js +39 -37
  27. package/dist/receiver.compiled.debug.js +12 -10
  28. package/dist/receiver.compiled.debug.map +3 -3
  29. package/dist/receiver.compiled.js +12 -10
  30. package/dist/receiver.compiled.map +3 -3
  31. package/dist/shaka-player.compiled.d.ts +231 -18
  32. package/dist/shaka-player.compiled.debug.d.ts +231 -18
  33. package/dist/shaka-player.compiled.debug.externs.js +279 -8
  34. package/dist/shaka-player.compiled.debug.js +512 -449
  35. package/dist/shaka-player.compiled.debug.map +4 -4
  36. package/dist/shaka-player.compiled.externs.js +279 -8
  37. package/dist/shaka-player.compiled.js +854 -821
  38. package/dist/shaka-player.compiled.map +4 -4
  39. package/dist/shaka-player.ui.d.ts +247 -19
  40. package/dist/shaka-player.ui.debug.d.ts +247 -19
  41. package/dist/shaka-player.ui.debug.externs.js +307 -9
  42. package/dist/shaka-player.ui.debug.js +662 -580
  43. package/dist/shaka-player.ui.debug.map +4 -4
  44. package/dist/shaka-player.ui.externs.js +307 -9
  45. package/dist/shaka-player.ui.js +1047 -1000
  46. package/dist/shaka-player.ui.map +4 -4
  47. package/docs/design/bg-fetch-after.gv +29 -0
  48. package/docs/design/bg-fetch-after.gv.png +0 -0
  49. package/docs/design/bg-fetch-before.gv +18 -0
  50. package/docs/design/bg-fetch-before.gv.png +0 -0
  51. package/docs/design/bg-fetch.md +134 -0
  52. package/docs/tutorials/blob-url.md +15 -0
  53. package/docs/tutorials/fairplay.md +1 -1
  54. package/docs/tutorials/index.json +1 -0
  55. package/docs/tutorials/ui-customization.md +66 -0
  56. package/docs/tutorials/ui.md +5 -5
  57. package/externs/cmcd.js +186 -0
  58. package/externs/ima.js +3 -0
  59. package/externs/shaka/ads.js +5 -0
  60. package/externs/shaka/manifest.js +12 -1
  61. package/externs/shaka/manifest_parser.js +10 -1
  62. package/externs/shaka/net.js +20 -4
  63. package/externs/shaka/offline.js +31 -2
  64. package/externs/shaka/player.js +138 -5
  65. package/externs/shaka/text.js +24 -0
  66. package/externs/webcrypto.js +18 -0
  67. package/karma.conf.js +1 -0
  68. package/lib/abr/ewma.js +14 -0
  69. package/lib/abr/ewma_bandwidth_estimator.js +16 -2
  70. package/lib/abr/simple_abr_manager.js +6 -0
  71. package/lib/ads/client_side_ad.js +8 -0
  72. package/lib/ads/client_side_ad_manager.js +54 -90
  73. package/lib/ads/server_side_ad.js +7 -0
  74. package/lib/ads/server_side_ad_manager.js +7 -10
  75. package/lib/cast/cast_proxy.js +3 -2
  76. package/lib/cast/cast_receiver.js +2 -1
  77. package/lib/cast/cast_sender.js +2 -2
  78. package/lib/cast/cast_utils.js +1 -0
  79. package/lib/dash/dash_parser.js +141 -16
  80. package/lib/dash/segment_base.js +25 -1
  81. package/lib/dash/segment_list.js +19 -10
  82. package/lib/dash/segment_template.js +24 -11
  83. package/lib/hls/hls_parser.js +146 -40
  84. package/lib/media/drm_engine.js +7 -0
  85. package/lib/media/gap_jumping_controller.js +4 -2
  86. package/lib/media/media_source_engine.js +1 -2
  87. package/lib/media/quality_observer.js +291 -0
  88. package/lib/media/segment_index.js +8 -1
  89. package/lib/media/segment_reference.js +37 -4
  90. package/lib/media/streaming_engine.js +49 -7
  91. package/lib/net/http_fetch_plugin.js +31 -11
  92. package/lib/net/http_plugin_utils.js +1 -0
  93. package/lib/net/http_xhr_plugin.js +40 -14
  94. package/lib/net/networking_engine.js +83 -19
  95. package/lib/offline/download_info.js +68 -0
  96. package/lib/offline/download_manager.js +13 -5
  97. package/lib/offline/indexeddb/base_storage_cell.js +35 -0
  98. package/lib/offline/indexeddb/storage_mechanism.js +1 -1
  99. package/lib/offline/indexeddb/v5_storage_cell.js +5 -0
  100. package/lib/offline/storage.js +393 -284
  101. package/lib/offline/stored_content_utils.js +2 -0
  102. package/lib/player.js +249 -43
  103. package/lib/polyfill/media_capabilities.js +36 -15
  104. package/lib/polyfill/mediasource.js +6 -0
  105. package/lib/polyfill/orientation.js +1 -1
  106. package/lib/polyfill/patchedmediakeys_apple.js +4 -4
  107. package/lib/polyfill/patchedmediakeys_ms.js +4 -4
  108. package/lib/polyfill/patchedmediakeys_webkit.js +4 -4
  109. package/lib/polyfill/random_uuid.js +52 -0
  110. package/lib/text/cue.js +18 -0
  111. package/lib/text/mp4_ttml_parser.js +3 -0
  112. package/lib/text/text_engine.js +14 -2
  113. package/lib/text/ttml_text_parser.js +114 -60
  114. package/lib/text/ui_text_displayer.js +95 -41
  115. package/lib/util/cmcd_manager.js +672 -0
  116. package/lib/util/error.js +6 -0
  117. package/lib/util/fake_event.js +53 -7
  118. package/lib/util/language_utils.js +12 -0
  119. package/lib/util/mutex.js +52 -0
  120. package/lib/util/periods.js +102 -65
  121. package/lib/util/platform.js +13 -1
  122. package/lib/util/player_configuration.js +18 -0
  123. package/lib/util/stream_utils.js +99 -10
  124. package/lib/util/xml_utils.js +19 -0
  125. package/package.json +2 -2
  126. package/shaka-player.uncompiled.js +3 -0
  127. package/test/cast/cast_proxy_unit.js +12 -6
  128. package/test/cast/cast_utils_unit.js +1 -1
  129. package/test/dash/dash_parser_content_protection_unit.js +2 -0
  130. package/test/dash/dash_parser_live_unit.js +101 -1
  131. package/test/dash/dash_parser_manifest_unit.js +222 -2
  132. package/test/dash/dash_parser_segment_base_unit.js +2 -0
  133. package/test/dash/dash_parser_segment_list_unit.js +2 -1
  134. package/test/dash/dash_parser_segment_template_unit.js +2 -1
  135. package/test/hls/hls_live_unit.js +2 -0
  136. package/test/hls/hls_parser_unit.js +7 -1
  137. package/test/media/closed_caption_parser_unit.js +6 -1
  138. package/test/media/drm_engine_unit.js +47 -3
  139. package/test/media/quality_observer_unit.js +139 -0
  140. package/test/media/segment_reference_unit.js +16 -1
  141. package/test/media/streaming_engine_integration.js +4 -2
  142. package/test/media/streaming_engine_unit.js +147 -0
  143. package/test/net/http_plugin_unit.js +20 -15
  144. package/test/offline/storage_integration.js +108 -4
  145. package/test/player_integration.js +178 -8
  146. package/test/player_src_equals_integration.js +41 -8
  147. package/test/player_unit.js +19 -9
  148. package/test/test/assets/3675/chunk-stream0-00001.m4s +0 -0
  149. package/test/test/assets/3675/chunk-stream0-00002.m4s +0 -0
  150. package/test/test/assets/3675/chunk-stream0-00003.m4s +0 -0
  151. package/test/test/assets/3675/chunk-stream0-00004.m4s +0 -0
  152. package/test/test/assets/3675/chunk-stream0-00005.m4s +0 -0
  153. package/test/test/assets/3675/chunk-stream0-00006.m4s +0 -0
  154. package/test/test/assets/3675/chunk-stream0-00007.m4s +0 -0
  155. package/test/test/assets/3675/dash_0.mpd +30 -0
  156. package/test/test/assets/3675/dash_1.mpd +30 -0
  157. package/test/test/assets/3675/dash_2.mpd +30 -0
  158. package/test/test/assets/3675/dash_3.mpd +30 -0
  159. package/test/test/assets/3675/dash_4.mpd +30 -0
  160. package/test/test/assets/3675/dash_5.mpd +26 -0
  161. package/test/test/assets/3675/init-stream0.m4s +0 -0
  162. package/test/test/assets/chapters.vtt +2 -2
  163. package/test/test/assets/chapters2.vtt +10 -0
  164. package/test/test/util/dash_parser_util.js +4 -0
  165. package/test/test/util/fake_ad.js +7 -0
  166. package/test/test/util/fake_ad_manager.js +1 -1
  167. package/test/test/util/fake_drm_engine.js +9 -2
  168. package/test/test/util/manifest_generator.js +3 -2
  169. package/test/test/util/test_scheme.js +14 -1
  170. package/test/test/util/ttml_utils.js +81 -0
  171. package/test/text/mp4_ttml_parser_unit.js +11 -18
  172. package/test/text/ttml_text_parser_unit.js +552 -227
  173. package/test/text/ui_text_displayer_unit.js +29 -17
  174. package/test/ui/localization_unit.js +15 -14
  175. package/test/ui/text_displayer_layout_unit.js +13 -1
  176. package/test/ui/ui_unit.js +250 -0
  177. package/test/util/cmcd_manager_unit.js +291 -0
  178. package/test/util/stream_utils_unit.js +45 -4
  179. package/third_party/closure-uri/uri.js +21 -0
  180. package/ui/airplay_button.js +1 -0
  181. package/ui/audio_language_selection.js +7 -0
  182. package/ui/cast_button.js +3 -3
  183. package/ui/context_menu.js +109 -0
  184. package/ui/controls.js +45 -13
  185. package/ui/controls.less +1 -0
  186. package/ui/enums.js +4 -0
  187. package/ui/externs/ui.js +28 -1
  188. package/ui/fast_forward_button.js +14 -5
  189. package/ui/fullscreen_button.js +1 -0
  190. package/ui/less/buttons.less +0 -4
  191. package/ui/less/containers.less +77 -7
  192. package/ui/less/overflow_menu.less +0 -10
  193. package/ui/less/tooltip.less +97 -0
  194. package/ui/locales/en.json +1 -0
  195. package/ui/locales/ru.json +6 -6
  196. package/ui/locales/source.json +4 -0
  197. package/ui/localization.js +28 -51
  198. package/ui/loop_button.js +5 -0
  199. package/ui/mute_button.js +2 -1
  200. package/ui/overflow_menu.js +5 -25
  201. package/ui/pip_button.js +7 -3
  202. package/ui/play_button.js +2 -2
  203. package/ui/playback_rate_selection.js +8 -9
  204. package/ui/resolution_selection.js +7 -0
  205. package/ui/rewind_button.js +15 -6
  206. package/ui/seek_bar.js +4 -2
  207. package/ui/settings_menu.js +36 -4
  208. package/ui/small_play_button.js +1 -0
  209. package/ui/statistics_button.js +253 -0
  210. package/ui/text_selection.js +12 -4
  211. package/ui/ui.js +30 -0
  212. package/ui/volume_bar.js +1 -1
  213. package/externs/media_capabilities.js +0 -16
@@ -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,17 +151,14 @@ 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) {
@@ -176,9 +173,9 @@ shaka.ads.ClientSideAdManager = class {
176
173
  cuePoints.push(shakaCuePoint);
177
174
  }
178
175
 
179
- this.onEvent_(
180
- new shaka.util.FakeEvent(shaka.ads.AdManager.CUEPOINTS_CHANGED,
181
- {'cuepoints': cuePoints}));
176
+ this.onEvent_(new shaka.util.FakeEvent(
177
+ shaka.ads.AdManager.CUEPOINTS_CHANGED,
178
+ (new Map()).set('cuepoints', cuePoints)));
182
179
  }
183
180
 
184
181
  this.addImaEventListeners_();
@@ -228,6 +225,15 @@ shaka.ads.ClientSideAdManager = class {
228
225
  * @private
229
226
  */
230
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
+
231
237
  this.eventManager_.listen(this.imaAdsManager_,
232
238
  google.ima.AdErrorEvent.Type.AD_ERROR, (error) => {
233
239
  this.onAdError_(/** @type {!google.ima.AdErrorEvent} */ (error));
@@ -245,30 +251,22 @@ shaka.ads.ClientSideAdManager = class {
245
251
 
246
252
  this.eventManager_.listen(this.imaAdsManager_,
247
253
  google.ima.AdEvent.Type.FIRST_QUARTILE, (e) => {
248
- this.onEvent_(
249
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_FIRST_QUARTILE,
250
- {'originalEvent': e}));
254
+ convertEventAndSend(e, shaka.ads.AdManager.AD_FIRST_QUARTILE);
251
255
  });
252
256
 
253
257
  this.eventManager_.listen(this.imaAdsManager_,
254
258
  google.ima.AdEvent.Type.MIDPOINT, (e) => {
255
- this.onEvent_(
256
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_MIDPOINT,
257
- {'originalEvent': e}));
259
+ convertEventAndSend(e, shaka.ads.AdManager.AD_MIDPOINT);
258
260
  });
259
261
 
260
262
  this.eventManager_.listen(this.imaAdsManager_,
261
263
  google.ima.AdEvent.Type.THIRD_QUARTILE, (e) => {
262
- this.onEvent_(
263
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_THIRD_QUARTILE,
264
- {'originalEvent': e}));
264
+ convertEventAndSend(e, shaka.ads.AdManager.AD_THIRD_QUARTILE);
265
265
  });
266
266
 
267
267
  this.eventManager_.listen(this.imaAdsManager_,
268
268
  google.ima.AdEvent.Type.COMPLETE, (e) => {
269
- this.onEvent_(
270
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_COMPLETE,
271
- {'originalEvent': e}));
269
+ convertEventAndSend(e, shaka.ads.AdManager.AD_COMPLETE);
272
270
  });
273
271
 
274
272
  this.eventManager_.listen(this.imaAdsManager_,
@@ -283,140 +281,102 @@ shaka.ads.ClientSideAdManager = class {
283
281
 
284
282
  this.eventManager_.listen(this.imaAdsManager_,
285
283
  google.ima.AdEvent.Type.SKIPPED, (e) => {
286
- this.onEvent_(
287
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_SKIPPED,
288
- {'originalEvent': e}));
284
+ convertEventAndSend(e, shaka.ads.AdManager.AD_SKIPPED);
289
285
  });
290
286
 
291
287
  this.eventManager_.listen(this.imaAdsManager_,
292
288
  google.ima.AdEvent.Type.VOLUME_CHANGED, (e) => {
293
- this.onEvent_(
294
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_VOLUME_CHANGED,
295
- {'originalEvent': e}));
289
+ convertEventAndSend(e, shaka.ads.AdManager.AD_VOLUME_CHANGED);
296
290
  });
297
291
 
298
292
  this.eventManager_.listen(this.imaAdsManager_,
299
293
  google.ima.AdEvent.Type.VOLUME_MUTED, (e) => {
300
- this.onEvent_(
301
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_MUTED,
302
- {'originalEvent': e}));
294
+ convertEventAndSend(e, shaka.ads.AdManager.AD_MUTED);
303
295
  });
304
296
 
305
297
  this.eventManager_.listen(this.imaAdsManager_,
306
298
  google.ima.AdEvent.Type.PAUSED, (e) => {
307
299
  goog.asserts.assert(this.ad_ != null, 'Ad should not be null!');
308
300
  this.ad_.setPaused(true);
309
- this.onEvent_(
310
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_PAUSED,
311
- {'originalEvent': e}));
301
+ convertEventAndSend(e, shaka.ads.AdManager.AD_PAUSED);
312
302
  });
313
303
 
314
304
  this.eventManager_.listen(this.imaAdsManager_,
315
305
  google.ima.AdEvent.Type.RESUMED, (e) => {
316
306
  goog.asserts.assert(this.ad_ != null, 'Ad should not be null!');
317
307
  this.ad_.setPaused(false);
318
- this.onEvent_(
319
- new shaka.util.FakeEvent(shaka.ads.AdManager.AD_RESUMED,
320
- {'originalEvent': e}));
308
+ convertEventAndSend(e, shaka.ads.AdManager.AD_RESUMED);
321
309
  });
322
310
 
323
311
  this.eventManager_.listen(this.imaAdsManager_,
324
312
  google.ima.AdEvent.Type.SKIPPABLE_STATE_CHANGED, (e) => {
325
313
  goog.asserts.assert(this.ad_ != null, 'Ad should not be null!');
326
- this.onEvent_(new shaka.util.FakeEvent(
327
- shaka.ads.AdManager.AD_SKIP_STATE_CHANGED,
328
- {'originalEvent': e}));
314
+ convertEventAndSend(e, shaka.ads.AdManager.AD_SKIP_STATE_CHANGED);
329
315
  });
330
316
 
331
317
  this.eventManager_.listen(this.imaAdsManager_,
332
318
  google.ima.AdEvent.Type.CLICK, (e) => {
333
- this.onEvent_(new shaka.util.FakeEvent(
334
- shaka.ads.AdManager.AD_CLICKED,
335
- {'originalEvent': e}));
319
+ convertEventAndSend(e, shaka.ads.AdManager.AD_CLICKED);
336
320
  });
337
321
 
338
322
  this.eventManager_.listen(this.imaAdsManager_,
339
323
  google.ima.AdEvent.Type.AD_PROGRESS, (e) => {
340
- this.onEvent_(new shaka.util.FakeEvent(
341
- shaka.ads.AdManager.AD_PROGRESS,
342
- {'originalEvent': e}));
324
+ convertEventAndSend(e, shaka.ads.AdManager.AD_PROGRESS);
343
325
  });
344
326
 
345
327
  this.eventManager_.listen(this.imaAdsManager_,
346
328
  google.ima.AdEvent.Type.AD_BUFFERING, (e) => {
347
- this.onEvent_(new shaka.util.FakeEvent(
348
- shaka.ads.AdManager.AD_BUFFERING,
349
- {'originalEvent': e}));
329
+ convertEventAndSend(e, shaka.ads.AdManager.AD_BUFFERING);
350
330
  });
351
331
 
352
332
  this.eventManager_.listen(this.imaAdsManager_,
353
333
  google.ima.AdEvent.Type.IMPRESSION, (e) => {
354
- this.onEvent_(new shaka.util.FakeEvent(
355
- shaka.ads.AdManager.AD_IMPRESSION,
356
- {'originalEvent': e}));
334
+ convertEventAndSend(e, shaka.ads.AdManager.AD_IMPRESSION);
357
335
  });
358
336
 
359
337
  this.eventManager_.listen(this.imaAdsManager_,
360
338
  google.ima.AdEvent.Type.DURATION_CHANGE, (e) => {
361
- this.onEvent_(new shaka.util.FakeEvent(
362
- shaka.ads.AdManager.AD_DURATION_CHANGED,
363
- {'originalEvent': e}));
339
+ convertEventAndSend(e, shaka.ads.AdManager.AD_DURATION_CHANGED);
364
340
  });
365
341
 
366
342
  this.eventManager_.listen(this.imaAdsManager_,
367
343
  google.ima.AdEvent.Type.USER_CLOSE, (e) => {
368
- this.onEvent_(new shaka.util.FakeEvent(
369
- shaka.ads.AdManager.AD_CLOSED,
370
- {'originalEvent': e}));
344
+ convertEventAndSend(e, shaka.ads.AdManager.AD_CLOSED);
371
345
  });
372
346
 
373
347
  this.eventManager_.listen(this.imaAdsManager_,
374
348
  google.ima.AdEvent.Type.LOADED, (e) => {
375
- this.onEvent_(new shaka.util.FakeEvent(
376
- shaka.ads.AdManager.AD_LOADED,
377
- {'originalEvent': e}));
349
+ convertEventAndSend(e, shaka.ads.AdManager.AD_LOADED);
378
350
  });
379
351
 
380
352
  this.eventManager_.listen(this.imaAdsManager_,
381
353
  google.ima.AdEvent.Type.ALL_ADS_COMPLETED, (e) => {
382
- this.onEvent_(new shaka.util.FakeEvent(
383
- shaka.ads.AdManager.ALL_ADS_COMPLETED,
384
- {'originalEvent': e}));
354
+ convertEventAndSend(e, shaka.ads.AdManager.ALL_ADS_COMPLETED);
385
355
  });
386
356
 
387
357
  this.eventManager_.listen(this.imaAdsManager_,
388
358
  google.ima.AdEvent.Type.LINEAR_CHANGED, (e) => {
389
- this.onEvent_(new shaka.util.FakeEvent(
390
- shaka.ads.AdManager.AD_LINEAR_CHANGED,
391
- {'originalEvent': e}));
359
+ convertEventAndSend(e, shaka.ads.AdManager.AD_LINEAR_CHANGED);
392
360
  });
393
361
 
394
362
  this.eventManager_.listen(this.imaAdsManager_,
395
363
  google.ima.AdEvent.Type.AD_METADATA, (e) => {
396
- this.onEvent_(new shaka.util.FakeEvent(
397
- shaka.ads.AdManager.AD_METADATA,
398
- {'originalEvent': e}));
364
+ convertEventAndSend(e, shaka.ads.AdManager.AD_METADATA);
399
365
  });
400
366
 
401
367
  this.eventManager_.listen(this.imaAdsManager_,
402
368
  google.ima.AdEvent.Type.LOG, (e) => {
403
- this.onEvent_(new shaka.util.FakeEvent(
404
- shaka.ads.AdManager.AD_RECOVERABLE_ERROR,
405
- {'originalEvent': e}));
369
+ convertEventAndSend(e, shaka.ads.AdManager.AD_RECOVERABLE_ERROR);
406
370
  });
407
371
 
408
372
  this.eventManager_.listen(this.imaAdsManager_,
409
373
  google.ima.AdEvent.Type.AD_BREAK_READY, (e) => {
410
- this.onEvent_(new shaka.util.FakeEvent(
411
- shaka.ads.AdManager.AD_BREAK_READY,
412
- {'originalEvent': e}));
374
+ convertEventAndSend(e, shaka.ads.AdManager.AD_BREAK_READY);
413
375
  });
414
376
 
415
377
  this.eventManager_.listen(this.imaAdsManager_,
416
378
  google.ima.AdEvent.Type.INTERACTION, (e) => {
417
- this.onEvent_(new shaka.util.FakeEvent(
418
- shaka.ads.AdManager.AD_INTERACTION,
419
- {'originalEvent': e}));
379
+ convertEventAndSend(e, shaka.ads.AdManager.AD_INTERACTION);
420
380
  });
421
381
  }
422
382
 
@@ -430,14 +390,16 @@ shaka.ads.ClientSideAdManager = class {
430
390
 
431
391
  const imaAd = e.getAd();
432
392
  this.ad_ = new shaka.ads.ClientSideAd(imaAd, this.imaAdsManager_);
433
- this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.AD_STARTED,
434
- {
435
- 'ad': this.ad_,
436
- 'sdkAdObject': imaAd,
437
- 'originalEvent': e,
438
- }));
439
- this.adContainer_.setAttribute('ad-active', 'true');
440
- this.video_.pause();
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));
399
+ if (this.ad_.isLinear()) {
400
+ this.adContainer_.setAttribute('ad-active', 'true');
401
+ this.video_.pause();
402
+ }
441
403
  }
442
404
 
443
405
  /**
@@ -446,8 +408,10 @@ shaka.ads.ClientSideAdManager = class {
446
408
  */
447
409
  onAdComplete_(e) {
448
410
  this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.AD_STOPPED,
449
- {'originalEvent': e}));
450
- this.adContainer_.removeAttribute('ad-active');
451
- this.video_.play();
411
+ (new Map()).set('originalEvent', e)));
412
+ if (this.ad_.isLinear()) {
413
+ this.adContainer_.removeAttribute('ad-active');
414
+ this.video_.play();
415
+ }
452
416
  }
453
417
  };
@@ -152,6 +152,13 @@ shaka.ads.ServerSideAd = class {
152
152
  return this.video_.muted;
153
153
  }
154
154
 
155
+ /**
156
+ * @override
157
+ * @export
158
+ */
159
+ isLinear() {
160
+ return true;
161
+ }
155
162
 
156
163
  /**
157
164
  * @override
@@ -80,9 +80,7 @@ shaka.ads.ServerSideAdManager = class {
80
80
 
81
81
  this.onEvent_(new shaka.util.FakeEvent(
82
82
  shaka.ads.AdManager.IMA_STREAM_MANAGER_LOADED,
83
- {
84
- 'imaStreamManager': this.streamManager_,
85
- }));
83
+ (new Map()).set('imaStreamManager', this.streamManager_)));
86
84
 
87
85
  // Events
88
86
  this.eventManager_.listen(this.streamManager_,
@@ -309,7 +307,7 @@ shaka.ads.ServerSideAdManager = class {
309
307
  }
310
308
 
311
309
  this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.AD_STARTED,
312
- {'ad': this.ad_}));
310
+ (new Map()).set('ad', this.ad_)));
313
311
  this.adContainer_.setAttribute('ad-active', 'true');
314
312
  }
315
313
 
@@ -335,9 +333,8 @@ shaka.ads.ServerSideAdManager = class {
335
333
  onLoaded_(e) {
336
334
  const now = Date.now() / 1000;
337
335
  const loadTime = now - this.streamRequestStartTime_;
338
- this.onEvent_(
339
- new shaka.util.FakeEvent(shaka.ads.AdManager.ADS_LOADED,
340
- {'loadTime': loadTime}));
336
+ this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.ADS_LOADED,
337
+ (new Map()).set('loadTime', loadTime)));
341
338
 
342
339
  const streamData = e.getStreamData();
343
340
  const url = streamData.url;
@@ -403,8 +400,8 @@ shaka.ads.ServerSideAdManager = class {
403
400
 
404
401
  this.currentCuePoints_ = cuePoints;
405
402
 
406
- this.onEvent_(
407
- new shaka.util.FakeEvent(shaka.ads.AdManager.CUEPOINTS_CHANGED,
408
- {'cuepoints': cuePoints}));
403
+ this.onEvent_(new shaka.util.FakeEvent(
404
+ shaka.ads.AdManager.CUEPOINTS_CHANGED,
405
+ (new Map()).set('cuepoints', cuePoints)));
409
406
  }
410
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
 
@@ -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
@@ -388,6 +388,7 @@ shaka.cast.CastUtils.PlayerVoidMethods = [
388
388
  'selectVariantsByLabel',
389
389
  'setTextTrackVisibility',
390
390
  'trickPlay',
391
+ 'updateStartTime',
391
392
  'goToLive',
392
393
  ];
393
394