Fix for null manager race condition

This commit is contained in:
Sam Potts 2018-03-11 18:23:47 +11:00
parent b3365a7373
commit 9981c349be
9 changed files with 57 additions and 59 deletions

14
dist/plyr.js vendored
View File

@ -4432,7 +4432,7 @@ var Ads = function () {
if (this.enabled) { if (this.enabled) {
// Check if the Google IMA3 SDK is loaded or load it ourselves // Check if the Google IMA3 SDK is loaded or load it ourselves
if (!utils.is.object(window.google)) { if (!utils.is.object(window.google) || !utils.is.object(window.google.ima)) {
utils.loadScript(this.player.config.urls.googleIMA.api).then(function () { utils.loadScript(this.player.config.urls.googleIMA.api).then(function () {
_this2.ready(); _this2.ready();
}).catch(function () { }).catch(function () {
@ -4544,8 +4544,6 @@ var Ads = function () {
request.forceNonLinearFullSlot = false; request.forceNonLinearFullSlot = false;
this.loader.requestAds(request); this.loader.requestAds(request);
this.trigger('loaded');
} catch (e) { } catch (e) {
this.onAdError(e); this.onAdError(e);
} }
@ -4585,7 +4583,7 @@ var Ads = function () {
}, { }, {
key: 'onAdsManagerLoaded', key: 'onAdsManagerLoaded',
value: function onAdsManagerLoaded(adsManagerLoadedEvent) { value: function onAdsManagerLoaded(event) {
var _this6 = this; var _this6 = this;
// Get the ads manager // Get the ads manager
@ -4597,7 +4595,7 @@ var Ads = function () {
// The SDK is polling currentTime on the contentPlayback. And needs a duration // The SDK is polling currentTime on the contentPlayback. And needs a duration
// so it can determine when to start the mid- and post-roll // so it can determine when to start the mid- and post-roll
this.manager = adsManagerLoadedEvent.getAdsManager(this.player, settings); this.manager = event.getAdsManager(this.player, settings);
// Get the cue points for any mid-rolls by filtering out the pre- and post-roll // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
this.cuePoints = this.manager.getCuePoints(); this.cuePoints = this.manager.getCuePoints();
@ -4840,7 +4838,7 @@ var Ads = function () {
if (!this.managerPromise) { if (!this.managerPromise) {
return; this.resumeContent();
} }
// Play the requested advertisement whenever the adsManager is ready // Play the requested advertisement whenever the adsManager is ready
@ -4864,7 +4862,7 @@ var Ads = function () {
// VAST response // VAST response
_this9.onAdError(adError); _this9.onAdError(adError);
} }
}); }).catch(function () {});
} }
/** /**
@ -4949,7 +4947,7 @@ var Ads = function () {
// Now request some new advertisements // Now request some new advertisements
_this10.requestAds(); _this10.requestAds();
}); }).catch(function () {});
} }
/** /**

2
dist/plyr.js.map vendored

File diff suppressed because one or more lines are too long

2
dist/plyr.min.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -10340,7 +10340,7 @@ var Ads = function () {
if (this.enabled) { if (this.enabled) {
// Check if the Google IMA3 SDK is loaded or load it ourselves // Check if the Google IMA3 SDK is loaded or load it ourselves
if (!utils.is.object(window.google)) { if (!utils.is.object(window.google) || !utils.is.object(window.google.ima)) {
utils.loadScript(this.player.config.urls.googleIMA.api).then(function () { utils.loadScript(this.player.config.urls.googleIMA.api).then(function () {
_this2.ready(); _this2.ready();
}).catch(function () { }).catch(function () {
@ -10452,8 +10452,6 @@ var Ads = function () {
request.forceNonLinearFullSlot = false; request.forceNonLinearFullSlot = false;
this.loader.requestAds(request); this.loader.requestAds(request);
this.trigger('loaded');
} catch (e) { } catch (e) {
this.onAdError(e); this.onAdError(e);
} }
@ -10493,7 +10491,7 @@ var Ads = function () {
}, { }, {
key: 'onAdsManagerLoaded', key: 'onAdsManagerLoaded',
value: function onAdsManagerLoaded(adsManagerLoadedEvent) { value: function onAdsManagerLoaded(event) {
var _this6 = this; var _this6 = this;
// Get the ads manager // Get the ads manager
@ -10505,7 +10503,7 @@ var Ads = function () {
// The SDK is polling currentTime on the contentPlayback. And needs a duration // The SDK is polling currentTime on the contentPlayback. And needs a duration
// so it can determine when to start the mid- and post-roll // so it can determine when to start the mid- and post-roll
this.manager = adsManagerLoadedEvent.getAdsManager(this.player, settings); this.manager = event.getAdsManager(this.player, settings);
// Get the cue points for any mid-rolls by filtering out the pre- and post-roll // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
this.cuePoints = this.manager.getCuePoints(); this.cuePoints = this.manager.getCuePoints();
@ -10748,7 +10746,7 @@ var Ads = function () {
if (!this.managerPromise) { if (!this.managerPromise) {
return; this.resumeContent();
} }
// Play the requested advertisement whenever the adsManager is ready // Play the requested advertisement whenever the adsManager is ready
@ -10772,7 +10770,7 @@ var Ads = function () {
// VAST response // VAST response
_this9.onAdError(adError); _this9.onAdError(adError);
} }
}); }).catch(function () {});
} }
/** /**
@ -10857,7 +10855,7 @@ var Ads = function () {
// Now request some new advertisements // Now request some new advertisements
_this10.requestAds(); _this10.requestAds();
}); }).catch(function () {});
} }
/** /**

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -49,7 +49,7 @@ class Ads {
load() { load() {
if (this.enabled) { if (this.enabled) {
// Check if the Google IMA3 SDK is loaded or load it ourselves // Check if the Google IMA3 SDK is loaded or load it ourselves
if (!utils.is.object(window.google)) { if (!utils.is.object(window.google) || !utils.is.object(window.google.ima)) {
utils utils
.loadScript(this.player.config.urls.googleIMA.api) .loadScript(this.player.config.urls.googleIMA.api)
.then(() => { .then(() => {
@ -160,8 +160,6 @@ class Ads {
request.forceNonLinearFullSlot = false; request.forceNonLinearFullSlot = false;
this.loader.requestAds(request); this.loader.requestAds(request);
this.trigger('loaded');
} catch (e) { } catch (e) {
this.onAdError(e); this.onAdError(e);
} }
@ -191,7 +189,7 @@ class Ads {
* This method is called whenever the ads are ready inside the AdDisplayContainer * This method is called whenever the ads are ready inside the AdDisplayContainer
* @param {Event} adsManagerLoadedEvent * @param {Event} adsManagerLoadedEvent
*/ */
onAdsManagerLoaded(adsManagerLoadedEvent) { onAdsManagerLoaded(event) {
// Get the ads manager // Get the ads manager
const settings = new google.ima.AdsRenderingSettings(); const settings = new google.ima.AdsRenderingSettings();
@ -201,7 +199,7 @@ class Ads {
// The SDK is polling currentTime on the contentPlayback. And needs a duration // The SDK is polling currentTime on the contentPlayback. And needs a duration
// so it can determine when to start the mid- and post-roll // so it can determine when to start the mid- and post-roll
this.manager = adsManagerLoadedEvent.getAdsManager(this.player, settings); this.manager = event.getAdsManager(this.player, settings);
// Get the cue points for any mid-rolls by filtering out the pre- and post-roll // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
this.cuePoints = this.manager.getCuePoints(); this.cuePoints = this.manager.getCuePoints();
@ -419,31 +417,33 @@ class Ads {
const { container } = this.player.elements; const { container } = this.player.elements;
if (!this.managerPromise) { if (!this.managerPromise) {
return; this.resumeContent();
} }
// Play the requested advertisement whenever the adsManager is ready // Play the requested advertisement whenever the adsManager is ready
this.managerPromise.then(() => { this.managerPromise
// Initialize the container. Must be done via a user action on mobile devices .then(() => {
this.elements.displayContainer.initialize(); // Initialize the container. Must be done via a user action on mobile devices
this.elements.displayContainer.initialize();
try { try {
if (!this.initialized) { if (!this.initialized) {
// Initialize the ads manager. Ad rules playlist will start at this time // Initialize the ads manager. Ad rules playlist will start at this time
this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
// Call play to start showing the ad. Single video and overlay ads will // Call play to start showing the ad. Single video and overlay ads will
// start at this time; the call will be ignored for ad rules // start at this time; the call will be ignored for ad rules
this.manager.start(); this.manager.start();
}
this.initialized = true;
} catch (adError) {
// An error may be thrown if there was a problem with the
// VAST response
this.onAdError(adError);
} }
})
this.initialized = true; .catch(() => {});
} catch (adError) {
// An error may be thrown if there was a problem with the
// VAST response
this.onAdError(adError);
}
});
} }
/** /**
@ -500,21 +500,23 @@ class Ads {
*/ */
loadAds() { loadAds() {
// Tell our adsManager to go bye bye // Tell our adsManager to go bye bye
this.managerPromise.then(() => { this.managerPromise
// Destroy our adsManager .then(() => {
if (this.manager) { // Destroy our adsManager
this.manager.destroy(); if (this.manager) {
} this.manager.destroy();
}
// Re-set our adsManager promises // Re-set our adsManager promises
this.managerPromise = new Promise(resolve => { this.managerPromise = new Promise(resolve => {
this.on('loaded', resolve); this.on('loaded', resolve);
this.player.debug.log(this.manager); this.player.debug.log(this.manager);
}); });
// Now request some new advertisements // Now request some new advertisements
this.requestAds(); this.requestAds();
}); })
.catch(() => {});
} }
/** /**