shaka-player 4.9.13 → 4.10.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 (91) hide show
  1. package/README.md +4 -0
  2. package/dist/controls.css +2 -2
  3. package/dist/controls.css.map +1 -1
  4. package/dist/deps.js +24 -19
  5. package/dist/locales.js +46 -35
  6. package/dist/shaka-player.compiled.d.ts +291 -12
  7. package/dist/shaka-player.compiled.debug.d.ts +291 -12
  8. package/dist/shaka-player.compiled.debug.externs.js +443 -6
  9. package/dist/shaka-player.compiled.debug.js +651 -556
  10. package/dist/shaka-player.compiled.debug.map +4 -4
  11. package/dist/shaka-player.compiled.externs.js +443 -6
  12. package/dist/shaka-player.compiled.js +1325 -1270
  13. package/dist/shaka-player.compiled.map +4 -4
  14. package/dist/shaka-player.ui.d.ts +306 -13
  15. package/dist/shaka-player.ui.debug.d.ts +306 -13
  16. package/dist/shaka-player.ui.debug.externs.js +477 -18
  17. package/dist/shaka-player.ui.debug.js +799 -681
  18. package/dist/shaka-player.ui.debug.map +4 -4
  19. package/dist/shaka-player.ui.externs.js +477 -18
  20. package/dist/shaka-player.ui.js +1600 -1533
  21. package/dist/shaka-player.ui.map +4 -4
  22. package/externs/shaka/ads.js +21 -1
  23. package/externs/shaka/manifest.js +20 -1
  24. package/externs/shaka/manifest_parser.js +18 -1
  25. package/externs/shaka/player.js +164 -50
  26. package/lib/ads/ad_manager.js +225 -10
  27. package/lib/ads/ad_utils.js +323 -0
  28. package/lib/ads/ads_stats.js +24 -0
  29. package/lib/ads/client_side_ad_manager.js +42 -34
  30. package/lib/ads/interstitial_ad.js +292 -0
  31. package/lib/ads/interstitial_ad_manager.js +772 -0
  32. package/lib/ads/media_tailor_ad_manager.js +19 -22
  33. package/lib/ads/server_side_ad_manager.js +12 -15
  34. package/lib/cast/cast_utils.js +1 -0
  35. package/lib/cea/cea_utils.js +12 -0
  36. package/lib/cea/mp4_cea_parser.js +17 -0
  37. package/lib/dash/dash_parser.js +81 -28
  38. package/lib/dash/segment_base.js +3 -0
  39. package/lib/hls/hls_parser.js +429 -121
  40. package/lib/hls/manifest_text_parser.js +1 -0
  41. package/lib/media/adaptation_set_criteria.js +31 -1
  42. package/lib/media/drm_engine.js +16 -2
  43. package/lib/media/manifest_filterer.js +7 -5
  44. package/lib/media/preload_manager.js +8 -10
  45. package/lib/media/presentation_timeline.js +37 -5
  46. package/lib/media/quality_observer.js +68 -2
  47. package/lib/media/segment_reference.js +1 -1
  48. package/lib/media/segment_utils.js +33 -1
  49. package/lib/media/streaming_engine.js +120 -43
  50. package/lib/mss/mss_parser.js +13 -2
  51. package/lib/net/networking_engine.js +1 -0
  52. package/lib/offline/manifest_converter.js +3 -0
  53. package/lib/offline/offline_manifest_parser.js +5 -0
  54. package/lib/offline/storage.js +2 -0
  55. package/lib/player.js +498 -165
  56. package/lib/util/fake_event.js +1 -0
  57. package/lib/util/manifest_parser_utils.js +9 -2
  58. package/lib/util/mp4_box_parsers.js +32 -0
  59. package/lib/util/player_configuration.js +21 -9
  60. package/lib/util/stats.js +43 -0
  61. package/package.json +1 -1
  62. package/shaka-player.uncompiled.js +2 -0
  63. package/ui/ad_counter.js +3 -3
  64. package/ui/ad_position.js +3 -3
  65. package/ui/ad_statistics_button.js +237 -0
  66. package/ui/audio_language_selection.js +8 -4
  67. package/ui/controls.js +6 -3
  68. package/ui/element.js +3 -3
  69. package/ui/enums.js +1 -0
  70. package/ui/externs/ui.js +3 -0
  71. package/ui/language_utils.js +48 -3
  72. package/ui/less/containers.less +32 -0
  73. package/ui/less/thumbnails.less +13 -0
  74. package/ui/locales/en.json +2 -0
  75. package/ui/locales/es-419.json +2 -0
  76. package/ui/locales/es.json +3 -0
  77. package/ui/locales/fr.json +1 -0
  78. package/ui/locales/pl.json +1 -0
  79. package/ui/locales/pt-BR.json +1 -0
  80. package/ui/locales/pt-PT.json +1 -0
  81. package/ui/locales/source.json +8 -0
  82. package/ui/mute_button.js +4 -4
  83. package/ui/overflow_menu.js +3 -3
  84. package/ui/play_button.js +5 -7
  85. package/ui/presentation_time.js +3 -3
  86. package/ui/save_video_frame_button.js +196 -0
  87. package/ui/seek_bar.js +75 -20
  88. package/ui/skip_ad_button.js +4 -4
  89. package/ui/statistics_button.js +14 -2
  90. package/ui/ui.js +15 -0
  91. package/ui/volume_bar.js +4 -4
@@ -0,0 +1,323 @@
1
+ /*! @license
2
+ * Shaka Player
3
+ * Copyright 2016 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+
8
+ goog.provide('shaka.ads.Utils');
9
+
10
+
11
+ /**
12
+ * A class responsible for ad utils.
13
+ * @export
14
+ */
15
+ shaka.ads.Utils = class {
16
+
17
+ };
18
+
19
+ /**
20
+ * The event name for when a sequence of ads has been loaded.
21
+ *
22
+ * @const {string}
23
+ * @export
24
+ */
25
+ shaka.ads.Utils.ADS_LOADED = 'ads-loaded';
26
+
27
+ /**
28
+ * The event name for when an ad has started playing.
29
+ *
30
+ * @const {string}
31
+ * @export
32
+ */
33
+ shaka.ads.Utils.AD_STARTED = 'ad-started';
34
+
35
+
36
+ /**
37
+ * The event name for when an ad playhead crosses first quartile.
38
+ *
39
+ * @const {string}
40
+ * @export
41
+ */
42
+ shaka.ads.Utils.AD_FIRST_QUARTILE = 'ad-first-quartile';
43
+
44
+
45
+ /**
46
+ * The event name for when an ad playhead crosses midpoint.
47
+ *
48
+ * @const {string}
49
+ * @export
50
+ */
51
+ shaka.ads.Utils.AD_MIDPOINT = 'ad-midpoint';
52
+
53
+
54
+ /**
55
+ * The event name for when an ad playhead crosses third quartile.
56
+ *
57
+ * @const {string}
58
+ * @export
59
+ */
60
+ shaka.ads.Utils.AD_THIRD_QUARTILE = 'ad-third-quartile';
61
+
62
+
63
+ /**
64
+ * The event name for when an ad has completed playing.
65
+ *
66
+ * @const {string}
67
+ * @export
68
+ */
69
+ shaka.ads.Utils.AD_COMPLETE = 'ad-complete';
70
+
71
+
72
+ /**
73
+ * The event name for when an ad has finished playing
74
+ * (played all the way through, was skipped, or was unable to proceed
75
+ * due to an error).
76
+ *
77
+ * @const {string}
78
+ * @export
79
+ */
80
+ shaka.ads.Utils.AD_STOPPED = 'ad-stopped';
81
+
82
+
83
+ /**
84
+ * The event name for when an ad is skipped by the user..
85
+ *
86
+ * @const {string}
87
+ * @export
88
+ */
89
+ shaka.ads.Utils.AD_SKIPPED = 'ad-skipped';
90
+
91
+
92
+ /**
93
+ * The event name for when the ad volume has changed.
94
+ *
95
+ * @const {string}
96
+ * @export
97
+ */
98
+ shaka.ads.Utils.AD_VOLUME_CHANGED = 'ad-volume-changed';
99
+
100
+
101
+ /**
102
+ * The event name for when the ad was muted.
103
+ *
104
+ * @const {string}
105
+ * @export
106
+ */
107
+ shaka.ads.Utils.AD_MUTED = 'ad-muted';
108
+
109
+
110
+ /**
111
+ * The event name for when the ad was paused.
112
+ *
113
+ * @const {string}
114
+ * @export
115
+ */
116
+ shaka.ads.Utils.AD_PAUSED = 'ad-paused';
117
+
118
+
119
+ /**
120
+ * The event name for when the ad was resumed after a pause.
121
+ *
122
+ * @const {string}
123
+ * @export
124
+ */
125
+ shaka.ads.Utils.AD_RESUMED = 'ad-resumed';
126
+
127
+
128
+ /**
129
+ * The event name for when the ad's skip status changes
130
+ * (usually it becomes skippable when it wasn't before).
131
+ *
132
+ * @const {string}
133
+ * @export
134
+ */
135
+ shaka.ads.Utils.AD_SKIP_STATE_CHANGED = 'ad-skip-state-changed';
136
+
137
+
138
+ /**
139
+ * The event name for when the ad's cue points (start/end markers)
140
+ * have changed.
141
+ *
142
+ * @const {string}
143
+ * @export
144
+ */
145
+ shaka.ads.Utils.CUEPOINTS_CHANGED = 'ad-cue-points-changed';
146
+
147
+
148
+ /**
149
+ * The event name for when the native IMA ad manager object has
150
+ * loaded and become available.
151
+ *
152
+ * @const {string}
153
+ * @export
154
+ */
155
+ shaka.ads.Utils.IMA_AD_MANAGER_LOADED = 'ima-ad-manager-loaded';
156
+
157
+
158
+ /**
159
+ * The event name for when the native IMA stream manager object has
160
+ * loaded and become available.
161
+ *
162
+ * @const {string}
163
+ * @export
164
+ */
165
+ shaka.ads.Utils.IMA_STREAM_MANAGER_LOADED = 'ima-stream-manager-loaded';
166
+
167
+
168
+ /**
169
+ * The event name for when the ad was clicked.
170
+ *
171
+ * @const {string}
172
+ * @export
173
+ */
174
+ shaka.ads.Utils.AD_CLICKED = 'ad-clicked';
175
+
176
+
177
+ /**
178
+ * The event name for when there is an update to the current ad's progress.
179
+ *
180
+ * @const {string}
181
+ * @export
182
+ */
183
+ shaka.ads.Utils.AD_PROGRESS = 'ad-progress';
184
+
185
+
186
+ /**
187
+ * The event name for when the ad is buffering.
188
+ *
189
+ * @const {string}
190
+ * @export
191
+ */
192
+ shaka.ads.Utils.AD_BUFFERING = 'ad-buffering';
193
+
194
+
195
+ /**
196
+ * The event name for when the ad's URL was hit.
197
+ *
198
+ * @const {string}
199
+ * @export
200
+ */
201
+ shaka.ads.Utils.AD_IMPRESSION = 'ad-impression';
202
+
203
+
204
+ /**
205
+ * The event name for when the ad's duration changed.
206
+ *
207
+ * @const {string}
208
+ * @export
209
+ */
210
+ shaka.ads.Utils.AD_DURATION_CHANGED = 'ad-duration-changed';
211
+
212
+
213
+ /**
214
+ * The event name for when the ad was closed by the user.
215
+ *
216
+ * @const {string}
217
+ * @export
218
+ */
219
+ shaka.ads.Utils.AD_CLOSED = 'ad-closed';
220
+
221
+
222
+ /**
223
+ * The event name for when the ad data becomes available.
224
+ *
225
+ * @const {string}
226
+ * @export
227
+ */
228
+ shaka.ads.Utils.AD_LOADED = 'ad-loaded';
229
+
230
+
231
+ /**
232
+ * The event name for when all the ads were completed.
233
+ *
234
+ * @const {string}
235
+ * @export
236
+ */
237
+ shaka.ads.Utils.ALL_ADS_COMPLETED = 'all-ads-completed';
238
+
239
+
240
+ /**
241
+ * The event name for when the ad changes from or to linear.
242
+ *
243
+ * @const {string}
244
+ * @export
245
+ */
246
+ shaka.ads.Utils.AD_LINEAR_CHANGED = 'ad-linear-changed';
247
+
248
+
249
+ /**
250
+ * The event name for when the ad's metadata becomes available.
251
+ *
252
+ * @const {string}
253
+ * @export
254
+ */
255
+ shaka.ads.Utils.AD_METADATA = 'ad-metadata';
256
+
257
+
258
+ /**
259
+ * The event name for when the ad display encountered a recoverable
260
+ * error.
261
+ *
262
+ * @const {string}
263
+ * @export
264
+ */
265
+ shaka.ads.Utils.AD_RECOVERABLE_ERROR = 'ad-recoverable-error';
266
+
267
+ /**
268
+ * The event name for when the ad manager dispatch errors.
269
+ *
270
+ * @const {string}
271
+ * @export
272
+ */
273
+ shaka.ads.Utils.AD_ERROR = 'ad-error';
274
+
275
+ /**
276
+ * The event name for when the client side SDK signalled its readiness
277
+ * to play a VPAID ad or an ad rule.
278
+ *
279
+ * @const {string}
280
+ * @export
281
+ */
282
+ shaka.ads.Utils.AD_BREAK_READY = 'ad-break-ready';
283
+
284
+
285
+ /**
286
+ * The event name for when the interaction callback for the ad was
287
+ * triggered.
288
+ *
289
+ * @const {string}
290
+ * @export
291
+ */
292
+ shaka.ads.Utils.AD_INTERACTION = 'ad-interaction';
293
+
294
+
295
+ /**
296
+ * The name of the event for when an ad requires the main content to be paused.
297
+ * Fired when the platform does not support multiple media elements.
298
+ *
299
+ * @const {string}
300
+ * @export
301
+ */
302
+ shaka.ads.Utils.AD_CONTENT_PAUSE_REQUESTED = 'ad-content-pause-requested';
303
+
304
+
305
+ /**
306
+ * The name of the event for when an ad requires the main content to be resumed.
307
+ * Fired when the platform does not support multiple media elements.
308
+ *
309
+ * @const {string}
310
+ * @export
311
+ */
312
+ shaka.ads.Utils.AD_CONTENT_RESUME_REQUESTED = 'ad-content-resume-requested';
313
+
314
+
315
+ /**
316
+ * The name of the event for when an ad requires the video of the main content
317
+ * to be attached.
318
+ *
319
+ * @const {string}
320
+ * @export
321
+ */
322
+ shaka.ads.Utils.AD_CONTENT_ATTACH_REQUESTED = 'ad-content-attach-requested';
323
+
@@ -24,6 +24,8 @@ shaka.ads.AdsStats = class {
24
24
  this.playedCompletely_ = 0;
25
25
  /** @private {number} */
26
26
  this.skipped_ = 0;
27
+ /** @private {number} */
28
+ this.errors_ = 0;
27
29
  }
28
30
 
29
31
  /**
@@ -56,6 +58,26 @@ shaka.ads.AdsStats = class {
56
58
  this.skipped_++;
57
59
  }
58
60
 
61
+ /**
62
+ * Increase the number of ads with error by one.
63
+ */
64
+ incrementErrors() {
65
+ this.errors_++;
66
+ }
67
+
68
+ /**
69
+ * @return {number}
70
+ * @private
71
+ */
72
+ getAverageLoadTime_() {
73
+ if (!this.loadTimes_.length) {
74
+ return 0;
75
+ }
76
+ const sum = this.loadTimes_.reduce(
77
+ (accumulator, currentValue) => accumulator + currentValue, 0);
78
+ return sum / this.loadTimes_.length;
79
+ }
80
+
59
81
  /**
60
82
  * Create a stats blob that we can pass up to the app. This blob will not
61
83
  * reference any internal data.
@@ -65,9 +87,11 @@ shaka.ads.AdsStats = class {
65
87
  getBlob() {
66
88
  return {
67
89
  loadTimes: this.loadTimes_,
90
+ averageLoadTime: this.getAverageLoadTime_(),
68
91
  started: this.started_,
69
92
  playedCompletely: this.playedCompletely_,
70
93
  skipped: this.skipped_,
94
+ errors: this.errors_,
71
95
  };
72
96
  }
73
97
  };
@@ -4,15 +4,13 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- /**
8
- * @fileoverview
9
- * @suppress {missingRequire} TODO(b/152540451): this shouldn't be needed
10
- */
11
7
 
12
8
  goog.provide('shaka.ads.ClientSideAdManager');
13
9
 
14
10
  goog.require('goog.asserts');
11
+ goog.require('shaka.Player');
15
12
  goog.require('shaka.ads.ClientSideAd');
13
+ goog.require('shaka.ads.Utils');
16
14
  goog.require('shaka.log');
17
15
  goog.require('shaka.util.Dom');
18
16
  goog.require('shaka.util.EventManager');
@@ -190,12 +188,12 @@ shaka.ads.ClientSideAdManager = class {
190
188
  shaka.log.warning('Resuming playback.');
191
189
 
192
190
  const data = (new Map()).set('originalEvent', e);
193
- this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.AD_ERROR, data));
191
+ this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.AD_ERROR, data));
194
192
 
195
193
  this.onAdComplete_(/* adEvent= */ null);
196
194
  // Remove ad breaks from the timeline
197
195
  this.onEvent_(
198
- new shaka.util.FakeEvent(shaka.ads.AdManager.CUEPOINTS_CHANGED,
196
+ new shaka.util.FakeEvent(shaka.ads.Utils.CUEPOINTS_CHANGED,
199
197
  (new Map()).set('cuepoints', [])));
200
198
  }
201
199
 
@@ -209,7 +207,7 @@ shaka.ads.ClientSideAdManager = class {
209
207
 
210
208
  const now = Date.now() / 1000;
211
209
  const loadTime = now - this.requestAdsStartTime_;
212
- this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.ADS_LOADED,
210
+ this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.ADS_LOADED,
213
211
  (new Map()).set('loadTime', loadTime)));
214
212
 
215
213
  if (!this.config_.customPlayheadTracker) {
@@ -247,7 +245,7 @@ shaka.ads.ClientSideAdManager = class {
247
245
  }
248
246
 
249
247
  this.onEvent_(new shaka.util.FakeEvent(
250
- shaka.ads.AdManager.IMA_AD_MANAGER_LOADED,
248
+ shaka.ads.Utils.IMA_AD_MANAGER_LOADED,
251
249
  (new Map()).set('imaAdManager', this.imaAdsManager_)));
252
250
 
253
251
  const cuePointStarts = this.imaAdsManager_.getCuePoints();
@@ -264,7 +262,7 @@ shaka.ads.ClientSideAdManager = class {
264
262
  }
265
263
 
266
264
  this.onEvent_(new shaka.util.FakeEvent(
267
- shaka.ads.AdManager.CUEPOINTS_CHANGED,
265
+ shaka.ads.Utils.CUEPOINTS_CHANGED,
268
266
  (new Map()).set('cuepoints', cuePoints)));
269
267
  }
270
268
 
@@ -374,22 +372,22 @@ shaka.ads.ClientSideAdManager = class {
374
372
 
375
373
  this.eventManager_.listen(this.imaAdsManager_,
376
374
  google.ima.AdEvent.Type.FIRST_QUARTILE, (e) => {
377
- convertEventAndSend(e, shaka.ads.AdManager.AD_FIRST_QUARTILE);
375
+ convertEventAndSend(e, shaka.ads.Utils.AD_FIRST_QUARTILE);
378
376
  });
379
377
 
380
378
  this.eventManager_.listen(this.imaAdsManager_,
381
379
  google.ima.AdEvent.Type.MIDPOINT, (e) => {
382
- convertEventAndSend(e, shaka.ads.AdManager.AD_MIDPOINT);
380
+ convertEventAndSend(e, shaka.ads.Utils.AD_MIDPOINT);
383
381
  });
384
382
 
385
383
  this.eventManager_.listen(this.imaAdsManager_,
386
384
  google.ima.AdEvent.Type.THIRD_QUARTILE, (e) => {
387
- convertEventAndSend(e, shaka.ads.AdManager.AD_THIRD_QUARTILE);
385
+ convertEventAndSend(e, shaka.ads.Utils.AD_THIRD_QUARTILE);
388
386
  });
389
387
 
390
388
  this.eventManager_.listen(this.imaAdsManager_,
391
389
  google.ima.AdEvent.Type.COMPLETE, (e) => {
392
- convertEventAndSend(e, shaka.ads.AdManager.AD_COMPLETE);
390
+ convertEventAndSend(e, shaka.ads.Utils.AD_COMPLETE);
393
391
  });
394
392
 
395
393
  this.eventManager_.listen(this.imaAdsManager_,
@@ -404,24 +402,24 @@ shaka.ads.ClientSideAdManager = class {
404
402
 
405
403
  this.eventManager_.listen(this.imaAdsManager_,
406
404
  google.ima.AdEvent.Type.SKIPPED, (e) => {
407
- convertEventAndSend(e, shaka.ads.AdManager.AD_SKIPPED);
405
+ convertEventAndSend(e, shaka.ads.Utils.AD_SKIPPED);
408
406
  });
409
407
 
410
408
  this.eventManager_.listen(this.imaAdsManager_,
411
409
  google.ima.AdEvent.Type.VOLUME_CHANGED, (e) => {
412
- convertEventAndSend(e, shaka.ads.AdManager.AD_VOLUME_CHANGED);
410
+ convertEventAndSend(e, shaka.ads.Utils.AD_VOLUME_CHANGED);
413
411
  });
414
412
 
415
413
  this.eventManager_.listen(this.imaAdsManager_,
416
414
  google.ima.AdEvent.Type.VOLUME_MUTED, (e) => {
417
- convertEventAndSend(e, shaka.ads.AdManager.AD_MUTED);
415
+ convertEventAndSend(e, shaka.ads.Utils.AD_MUTED);
418
416
  });
419
417
 
420
418
  this.eventManager_.listen(this.imaAdsManager_,
421
419
  google.ima.AdEvent.Type.PAUSED, (e) => {
422
420
  if (this.ad_) {
423
421
  this.ad_.setPaused(true);
424
- convertEventAndSend(e, shaka.ads.AdManager.AD_PAUSED);
422
+ convertEventAndSend(e, shaka.ads.Utils.AD_PAUSED);
425
423
  }
426
424
  });
427
425
 
@@ -429,80 +427,80 @@ shaka.ads.ClientSideAdManager = class {
429
427
  google.ima.AdEvent.Type.RESUMED, (e) => {
430
428
  if (this.ad_) {
431
429
  this.ad_.setPaused(false);
432
- convertEventAndSend(e, shaka.ads.AdManager.AD_RESUMED);
430
+ convertEventAndSend(e, shaka.ads.Utils.AD_RESUMED);
433
431
  }
434
432
  });
435
433
 
436
434
  this.eventManager_.listen(this.imaAdsManager_,
437
435
  google.ima.AdEvent.Type.SKIPPABLE_STATE_CHANGED, (e) => {
438
436
  if (this.ad_) {
439
- convertEventAndSend(e, shaka.ads.AdManager.AD_SKIP_STATE_CHANGED);
437
+ convertEventAndSend(e, shaka.ads.Utils.AD_SKIP_STATE_CHANGED);
440
438
  }
441
439
  });
442
440
 
443
441
  this.eventManager_.listen(this.imaAdsManager_,
444
442
  google.ima.AdEvent.Type.CLICK, (e) => {
445
- convertEventAndSend(e, shaka.ads.AdManager.AD_CLICKED);
443
+ convertEventAndSend(e, shaka.ads.Utils.AD_CLICKED);
446
444
  });
447
445
 
448
446
  this.eventManager_.listen(this.imaAdsManager_,
449
447
  google.ima.AdEvent.Type.AD_PROGRESS, (e) => {
450
- convertEventAndSend(e, shaka.ads.AdManager.AD_PROGRESS);
448
+ convertEventAndSend(e, shaka.ads.Utils.AD_PROGRESS);
451
449
  });
452
450
 
453
451
  this.eventManager_.listen(this.imaAdsManager_,
454
452
  google.ima.AdEvent.Type.AD_BUFFERING, (e) => {
455
- convertEventAndSend(e, shaka.ads.AdManager.AD_BUFFERING);
453
+ convertEventAndSend(e, shaka.ads.Utils.AD_BUFFERING);
456
454
  });
457
455
 
458
456
  this.eventManager_.listen(this.imaAdsManager_,
459
457
  google.ima.AdEvent.Type.IMPRESSION, (e) => {
460
- convertEventAndSend(e, shaka.ads.AdManager.AD_IMPRESSION);
458
+ convertEventAndSend(e, shaka.ads.Utils.AD_IMPRESSION);
461
459
  });
462
460
 
463
461
  this.eventManager_.listen(this.imaAdsManager_,
464
462
  google.ima.AdEvent.Type.DURATION_CHANGE, (e) => {
465
- convertEventAndSend(e, shaka.ads.AdManager.AD_DURATION_CHANGED);
463
+ convertEventAndSend(e, shaka.ads.Utils.AD_DURATION_CHANGED);
466
464
  });
467
465
 
468
466
  this.eventManager_.listen(this.imaAdsManager_,
469
467
  google.ima.AdEvent.Type.USER_CLOSE, (e) => {
470
- convertEventAndSend(e, shaka.ads.AdManager.AD_CLOSED);
468
+ convertEventAndSend(e, shaka.ads.Utils.AD_CLOSED);
471
469
  });
472
470
 
473
471
  this.eventManager_.listen(this.imaAdsManager_,
474
472
  google.ima.AdEvent.Type.LOADED, (e) => {
475
- convertEventAndSend(e, shaka.ads.AdManager.AD_LOADED);
473
+ convertEventAndSend(e, shaka.ads.Utils.AD_LOADED);
476
474
  });
477
475
 
478
476
  this.eventManager_.listen(this.imaAdsManager_,
479
477
  google.ima.AdEvent.Type.ALL_ADS_COMPLETED, (e) => {
480
- convertEventAndSend(e, shaka.ads.AdManager.ALL_ADS_COMPLETED);
478
+ convertEventAndSend(e, shaka.ads.Utils.ALL_ADS_COMPLETED);
481
479
  });
482
480
 
483
481
  this.eventManager_.listen(this.imaAdsManager_,
484
482
  google.ima.AdEvent.Type.LINEAR_CHANGED, (e) => {
485
- convertEventAndSend(e, shaka.ads.AdManager.AD_LINEAR_CHANGED);
483
+ convertEventAndSend(e, shaka.ads.Utils.AD_LINEAR_CHANGED);
486
484
  });
487
485
 
488
486
  this.eventManager_.listen(this.imaAdsManager_,
489
487
  google.ima.AdEvent.Type.AD_METADATA, (e) => {
490
- convertEventAndSend(e, shaka.ads.AdManager.AD_METADATA);
488
+ convertEventAndSend(e, shaka.ads.Utils.AD_METADATA);
491
489
  });
492
490
 
493
491
  this.eventManager_.listen(this.imaAdsManager_,
494
492
  google.ima.AdEvent.Type.LOG, (e) => {
495
- convertEventAndSend(e, shaka.ads.AdManager.AD_RECOVERABLE_ERROR);
493
+ convertEventAndSend(e, shaka.ads.Utils.AD_RECOVERABLE_ERROR);
496
494
  });
497
495
 
498
496
  this.eventManager_.listen(this.imaAdsManager_,
499
497
  google.ima.AdEvent.Type.AD_BREAK_READY, (e) => {
500
- convertEventAndSend(e, shaka.ads.AdManager.AD_BREAK_READY);
498
+ convertEventAndSend(e, shaka.ads.Utils.AD_BREAK_READY);
501
499
  });
502
500
 
503
501
  this.eventManager_.listen(this.imaAdsManager_,
504
502
  google.ima.AdEvent.Type.INTERACTION, (e) => {
505
- convertEventAndSend(e, shaka.ads.AdManager.AD_INTERACTION);
503
+ convertEventAndSend(e, shaka.ads.Utils.AD_INTERACTION);
506
504
  });
507
505
  }
508
506
 
@@ -527,12 +525,17 @@ shaka.ads.ClientSideAdManager = class {
527
525
 
528
526
  this.ad_ = new shaka.ads.ClientSideAd(imaAd,
529
527
  this.imaAdsManager_, this.video_);
528
+ if (e.type == google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED &&
529
+ !this.config_.supportsMultipleMediaElements ) {
530
+ this.onEvent_(new shaka.util.FakeEvent(
531
+ shaka.ads.Utils.AD_CONTENT_PAUSE_REQUESTED));
532
+ }
530
533
  const data = new Map()
531
534
  .set('ad', this.ad_)
532
535
  .set('sdkAdObject', imaAd)
533
536
  .set('originalEvent', e);
534
537
  this.onEvent_(new shaka.util.FakeEvent(
535
- shaka.ads.AdManager.AD_STARTED, data));
538
+ shaka.ads.Utils.AD_STARTED, data));
536
539
  if (this.ad_.isLinear()) {
537
540
  this.adContainer_.setAttribute('ad-active', 'true');
538
541
  if (!this.config_.customPlayheadTracker) {
@@ -551,7 +554,12 @@ shaka.ads.ClientSideAdManager = class {
551
554
  * @private
552
555
  */
553
556
  onAdComplete_(e) {
554
- this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.AD_STOPPED,
557
+ if (e && e.type == google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED &&
558
+ !this.config_.supportsMultipleMediaElements) {
559
+ this.onEvent_(new shaka.util.FakeEvent(
560
+ shaka.ads.Utils.AD_CONTENT_RESUME_REQUESTED));
561
+ }
562
+ this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.AD_STOPPED,
555
563
  (new Map()).set('originalEvent', e)));
556
564
  if (this.ad_ && this.ad_.isLinear()) {
557
565
  this.adContainer_.removeAttribute('ad-active');