Skip to content

Commit

Permalink
Merge pull request #264 from ooyala/PLAYER-3777
Browse files Browse the repository at this point in the history
Player 3777
  • Loading branch information
aeng7 authored Jun 21, 2018
2 parents 2e08990 + 2bad9a3 commit 473cbec
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 21 deletions.
69 changes: 55 additions & 14 deletions js/ooyala_ssai.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ OO.Ads.manager(function(_, $)
var requestUrl = "";

this.adIdDictionary = {};
this.currentId3Object = null;

// The expected query parameters in an ID3 Metadata String
var ID3_QUERY_PARAMETERS =
Expand Down Expand Up @@ -158,6 +159,7 @@ OO.Ads.manager(function(_, $)
// Listeners for tracking events
amc.addPlayerListener(amc.EVENTS.FULLSCREEN_CHANGED, _.bind(this.onFullscreenChanged, this));
amc.addPlayerListener(amc.EVENTS.AD_VOLUME_CHANGED, _.bind(this.onAdVolumeChanged, this));
amc.addPlayerListener(amc.EVENTS.MUTE_STATE_CHANGED, _.bind(this.onMuteStateChanged, this));
};

/**
Expand Down Expand Up @@ -328,8 +330,11 @@ OO.Ads.manager(function(_, $)
this.pauseAd = function(ad)
{
//Removing the ad timeout since ad was paused
if (ad && ad.ad && ad.ad.data && this.adIdDictionary[ad.ad.data.id]) {
clearTimeout(this.adIdDictionary[ad.ad.data.id].adTimer);
if (adMode) {
_handleTrackingUrls(this.currentAd, ["pause"]);
if (ad && ad.ad && ad.ad.data && this.adIdDictionary[ad.ad.data.id]) {
clearTimeout(this.adIdDictionary[ad.ad.data.id].adTimer);
}
}
};

Expand All @@ -342,12 +347,15 @@ OO.Ads.manager(function(_, $)
*/
this.resumeAd = function(ad)
{
if (ad && ad.ad && ad.ad.data && this.adIdDictionary[ad.ad.data.id] && currentId3Object) {
//Setting the ad callback again since ad was resumed
this.adIdDictionary[ad.ad.data.id].adTimer = _.delay(
_adEndedCallback(null, ad.ad.data.id),
currentId3Object.duration * 1000
);
if (adMode) {
_handleTrackingUrls(this.currentAd, ["resume"]);
if (ad && ad.ad && ad.ad.data && this.adIdDictionary[ad.ad.data.id] && _.isFinite(ad.duration)) {
//Setting the ad callback again since ad was resumed
this.adIdDictionary[ad.ad.data.id].adTimer = _.delay(
_adEndedCallback(null, ad.ad.data.id),
ad.duration * 1000
);
}
}
};

Expand Down Expand Up @@ -694,19 +702,51 @@ OO.Ads.manager(function(_, $)
*/
this.onAdVolumeChanged = function(eventName, volume)
{
var url = [];
if (volume === 0 && volume !== lastVolume)
{
lastVolume = volume;
url = ["mute"];
}
else if (volume > 0 && lastVolume === 0)
{
lastVolume = volume;
url = ["unmute"];
}

if (adMode)
{
if (volume === 0 && volume !== lastVolume)
_handleTrackingUrls(this.currentAd, url);
}
};

/**
* Callback for Ad Manager Controller. Handles mute state changes.
* @public
* @method OoyalaSsai#onMuteStateChanged
* @param {string} eventName The name of the event for which this callback is called
* @param {boolean} muteState True if ad was muted, false if ad was unmuted
*/
this.onMuteStateChanged = function(eventName, muteState)
{
var url = []

// If volume is zero mute events are not relevant
if ( lastVolume !== 0) {
if (!isMuted && muteState === true)
{
isMuted = true;
lastVolume = volume;
_handleTrackingUrls(this.currentAd, ["mute"]);
url = ["mute"];
}
else if (isMuted && volume !== lastVolume)
else if (isMuted && muteState === false)
{
isMuted = false;
lastVolume = volume;
_handleTrackingUrls(this.currentAd, ["unmute"]);
url = ["unmute"];
}

if (adMode)
{
_handleTrackingUrls(this.currentAd, url);
}
}
};
Expand Down Expand Up @@ -1422,6 +1462,7 @@ OO.Ads.manager(function(_, $)
amc.removePlayerListener(amc.EVENTS.CONTENT_URL_CHANGED, _.bind(this.onContentUrlChanged, this));
amc.removePlayerListener(amc.EVENTS.FULLSCREEN_CHANGED, _.bind(this.onFullscreenChanged, this));
amc.removePlayerListener(amc.EVENTS.AD_VOLUME_CHANGED, _.bind(this.onAdVolumeChanged, this));
amc.removePlayerListener(amc.EVENTS.MUTE_STATE_CHANGED, _.bind(this.onMuteStateChanged, this));
amc.addPlayerListener(amc.EVENTS.PLAYHEAD_TIME_CHANGED , _.bind(this.onPlayheadTimeChanged, this));
amc.addPlayerListener(amc.EVENTS.REPLAY_REQUESTED, _.bind(this.onReplay, this));
}
Expand Down
2 changes: 2 additions & 0 deletions test/unit-test-helpers/mock_responses/ssai.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
<Tracking event="thirdQuartile">thirdQuartileUrl2</Tracking>
<Tracking event="complete">completeUrl</Tracking>
<Tracking event="complete">completeUrl2</Tracking>
<Tracking event="pause">pauseUrl</Tracking>
<Tracking event="resume">resumeUrl</Tracking>
<Tracking event="mute">muteUrl</Tracking>
<Tracking event="unmute">unmuteUrl</Tracking>
<Tracking event="fullscreen">fullscreenUrl</Tracking>
Expand Down
93 changes: 86 additions & 7 deletions test/unit-tests/ooyala_ssai_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@ describe('ad_manager_ooyala_ssai', function()
"adManager": adManager,
"adType": adType,
"ad": ad,
"duration": 15,
"streams":streams,
"position": -1 //we want it to play immediately
};
Expand All @@ -275,7 +276,7 @@ describe('ad_manager_ooyala_ssai', function()

OoyalaSsai.initialize(amc);

OoyalaSsai.currentId3Object =
var currentId3Object =
{
adId: "11de5230-ff5c-4d36-ad77-c0c7644d28e9",
t: 0,
Expand All @@ -292,22 +293,100 @@ describe('ad_manager_ooyala_ssai', function()
ad: {}
};

OoyalaSsai.onResponse(OoyalaSsai.currentId3Object, ssaiXml);
OoyalaSsai.onResponse(currentId3Object, ssaiXml);

var ad = adQueue[0];

// impression, and start tracking events
OoyalaSsai.playAd(ad);
expect(trackingUrlsPinged.startUrl).to.be(1);
expect(trackingUrlsPinged.startUrl2).to.be(1);
expect(trackingUrlsPinged.impressionUrl).to.be(1);
expect(trackingUrlsPinged.impressionUrl2).to.be(1);

// pause and resume events
OoyalaSsai.pauseAd(ad);
expect(trackingUrlsPinged.pauseUrl).to.be(1);
OoyalaSsai.resumeAd(ad);
expect(trackingUrlsPinged.resumeUrl).to.be(1);

// mute and unmute events
OoyalaSsai.onMuteStateChanged("muteStateChanged", true);
expect(trackingUrlsPinged.muteUrl).to.be(1);
OoyalaSsai.onMuteStateChanged("muteStateChanged", false);
expect(trackingUrlsPinged.unmuteUrl).to.be(1);

// volume change events should also trigger mute / unmute urls
OoyalaSsai.onAdVolumeChanged("adVolumeChanged", 0);
expect(trackingUrlsPinged.muteUrl).to.be(2);
OoyalaSsai.onAdVolumeChanged("adVolumeChanged", 50);
expect(trackingUrlsPinged.unmuteUrl).to.be(2);

// fullscreen events
OoyalaSsai.onFullscreenChanged("fullscreenChanged", true);
expect(trackingUrlsPinged.fullscreenUrl).to.be(1);


// clickthrough tracking events
OoyalaSsai.playerClicked(ad);
expect(trackingUrlsPinged.linearClickTrackingUrl).to.be(1);
});

it('Linear Creative Tracking Events mute/unmute urls should be pinged only once if multiple events received', function()
{
var adQueue = [];
amc.forceAdToPlay = function(adManager, ad, adType, streams)
{
var adData = {
"adManager": adManager,
"adType": adType,
"ad": ad,
"duration": 15,
"streams":streams,
"position": -1 //we want it to play immediately
};
var newAd = new amc.Ad(adData);
adQueue.push(newAd);
};

OoyalaSsai.initialize(amc);

var currentId3Object =
{
adId: "11de5230-ff5c-4d36-ad77-c0c7644d28e9",
t: 0,
d: 15
};

OoyalaSsai.adIdDictionary =
{
"11de5230-ff5c-4d36-ad77-c0c7644d28e9": true
};

OoyalaSsai.onResponse(currentId3Object, ssaiXml);

var ad = adQueue[0];
// impression, and start tracking events
OoyalaSsai.playAd(ad);
// mute and unmute events
OoyalaSsai.onMuteStateChanged("muteStateChanged", true);
OoyalaSsai.onMuteStateChanged("muteStateChanged", true);
expect(trackingUrlsPinged.muteUrl).to.be(1);
OoyalaSsai.onMuteStateChanged("muteStateChanged", false);
OoyalaSsai.onMuteStateChanged("muteStateChanged", false);
expect(trackingUrlsPinged.unmuteUrl).to.be(1);

// volume change events should also trigger mute / unmute urls
OoyalaSsai.onAdVolumeChanged("adVolumeChanged", 0);
OoyalaSsai.onAdVolumeChanged("adVolumeChanged", 0);
OoyalaSsai.onMuteStateChanged("muteStateChanged", false);
expect(trackingUrlsPinged.muteUrl).to.be(2);
OoyalaSsai.onAdVolumeChanged("adVolumeChanged", 50);
OoyalaSsai.onAdVolumeChanged("adVolumeChanged", 10);
OoyalaSsai.onAdVolumeChanged("adVolumeChanged", 100);
OoyalaSsai.onMuteStateChanged("muteStateChanged", true);
expect(trackingUrlsPinged.unmuteUrl).to.be(2);
});

it('Correct clickthrough URL should be opened', function()
{
var adQueue = [];
Expand All @@ -332,7 +411,7 @@ describe('ad_manager_ooyala_ssai', function()

OoyalaSsai.initialize(amc);

OoyalaSsai.currentId3Object =
var currentId3Object =
{
adId: "11de5230-ff5c-4d36-ad77-c0c7644d28e9",
t: 0,
Expand All @@ -349,7 +428,7 @@ describe('ad_manager_ooyala_ssai', function()
ad: {}
};

OoyalaSsai.onResponse(OoyalaSsai.currentId3Object, ssaiXml);
OoyalaSsai.onResponse(currentId3Object, ssaiXml);

var ad = adQueue[0];

Expand All @@ -376,7 +455,7 @@ describe('ad_manager_ooyala_ssai', function()

OoyalaSsai.initialize(amc);

OoyalaSsai.currentId3Object =
var currentId3Object =
{
adId: "11de5230-ff5c-4d36-ad77-c0c7644d28e9",
t: 0,
Expand All @@ -393,7 +472,7 @@ describe('ad_manager_ooyala_ssai', function()
ad: {}
};

OoyalaSsai.onResponse(OoyalaSsai.currentId3Object, ssaiXml);
OoyalaSsai.onResponse(currentId3Object, ssaiXml);

var ad = adQueue[0];

Expand Down

0 comments on commit 473cbec

Please sign in to comment.