From e826eb8eec207dd2ebd4d4ee1e44510ebff22b71 Mon Sep 17 00:00:00 2001 From: theodab Date: Wed, 21 Sep 2022 13:17:54 -0700 Subject: [PATCH] feat(ads): Ignore ad events with no associated ad (#4488) Issue #4481 --- externs/ima.js | 2 +- lib/ads/client_side_ad_manager.js | 29 +++++++++++++++++++++-------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/externs/ima.js b/externs/ima.js index fa71e52d00..0b0d09d238 100644 --- a/externs/ima.js +++ b/externs/ima.js @@ -143,7 +143,7 @@ google.ima.AdsManagerLoadedEvent.Type = { /** @const */ google.ima.AdEvent = class extends Event { - /** @return {!google.ima.Ad } */ + /** @return {?google.ima.Ad} */ getAd() {} }; diff --git a/lib/ads/client_side_ad_manager.js b/lib/ads/client_side_ad_manager.js index 612ae97d26..f5a23d3251 100644 --- a/lib/ads/client_side_ad_manager.js +++ b/lib/ads/client_side_ad_manager.js @@ -313,22 +313,25 @@ shaka.ads.ClientSideAdManager = class { this.eventManager_.listen(this.imaAdsManager_, google.ima.AdEvent.Type.PAUSED, (e) => { - goog.asserts.assert(this.ad_ != null, 'Ad should not be null!'); - this.ad_.setPaused(true); - convertEventAndSend(e, shaka.ads.AdManager.AD_PAUSED); + if (this.ad_) { + this.ad_.setPaused(true); + convertEventAndSend(e, shaka.ads.AdManager.AD_PAUSED); + } }); this.eventManager_.listen(this.imaAdsManager_, google.ima.AdEvent.Type.RESUMED, (e) => { - goog.asserts.assert(this.ad_ != null, 'Ad should not be null!'); - this.ad_.setPaused(false); - convertEventAndSend(e, shaka.ads.AdManager.AD_RESUMED); + if (this.ad_) { + this.ad_.setPaused(false); + convertEventAndSend(e, shaka.ads.AdManager.AD_RESUMED); + } }); this.eventManager_.listen(this.imaAdsManager_, google.ima.AdEvent.Type.SKIPPABLE_STATE_CHANGED, (e) => { - goog.asserts.assert(this.ad_ != null, 'Ad should not be null!'); - convertEventAndSend(e, shaka.ads.AdManager.AD_SKIP_STATE_CHANGED); + if (this.ad_) { + convertEventAndSend(e, shaka.ads.AdManager.AD_SKIP_STATE_CHANGED); + } }); this.eventManager_.listen(this.imaAdsManager_, @@ -406,6 +409,16 @@ shaka.ads.ClientSideAdManager = class { 'Should have an ads manager at this point!'); const imaAd = e.getAd(); + if (!imaAd) { + // Sometimes the IMA SDK will fire a CONTENT_PAUSE_REQUESTED or STARTED + // event with no associated ad object. + // We can't really play an ad in that situation, so just ignore the event. + shaka.log.alwaysWarn( + 'The IMA SDK fired a ' + e.type + ' event with no associated ad. ' + + 'Unable to play ad!'); + return; + } + this.ad_ = new shaka.ads.ClientSideAd(imaAd, this.imaAdsManager_, this.video_); const data = new Map()