From 837e0fba4267bd74fa26acdfdace4ba833fb659a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Velad=20Galv=C3=A1n?= Date: Mon, 28 Aug 2023 19:06:48 +0200 Subject: [PATCH] feat(Ads): Allow multiple calls to requestAds in CS (#5542) --- lib/ads/client_side_ad_manager.js | 13 ++++++++++++- test/ads/ad_manager_unit.js | 8 ++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/ads/client_side_ad_manager.js b/lib/ads/client_side_ad_manager.js index 92bec9176..6270608e1 100644 --- a/lib/ads/client_side_ad_manager.js +++ b/lib/ads/client_side_ad_manager.js @@ -80,7 +80,7 @@ shaka.ads.ClientSideAdManager = class { this.adsRenderingSettings_ = adsRenderingSettings || new google.ima.AdsRenderingSettings(); - this.eventManager_.listenOnce(this.adsLoader_, + this.eventManager_.listen(this.adsLoader_, google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, (e) => { this.onAdsManagerLoaded_( /** @type {!google.ima.AdsManagerLoadedEvent} */ (e)); @@ -119,6 +119,17 @@ shaka.ads.ClientSideAdManager = class { imaRequest.adTagUrl || imaRequest.adsResponse, 'The ad tag needs to be set up before requesting ads, ' + 'or adsResponse must be filled.'); + // Destroy the current AdsManager, in case the tag you requested previously + // contains post-rolls (don't play those now). + if (this.imaAdsManager_) { + this.imaAdsManager_.destroy(); + } + // Your AdsLoader will be set up on page-load. You should re-use the same + // AdsLoader for every request. + if (this.adsLoader_) { + // Reset the IMA SDK. + this.adsLoader_.contentComplete(); + } this.requestAdsStartTime_ = Date.now() / 1000; this.adsLoader_.requestAds(imaRequest); } diff --git a/test/ads/ad_manager_unit.js b/test/ads/ad_manager_unit.js index f226dcb65..253b260a3 100644 --- a/test/ads/ad_manager_unit.js +++ b/test/ads/ad_manager_unit.js @@ -88,6 +88,10 @@ describe('Ad manager', () => { requestAds(imaRequest) { numAdsRequested += 1; } + + contentComplete() { + // Nothing + } }; window['google'].ima.AdsLoader = mockAdsLoader; @@ -102,6 +106,10 @@ describe('Ad manager', () => { /** @type {!google.ima.AdsManager} */ (this); } + destroy() { + // Nothing + } + getCuePoints() { return []; }