Skip to content

Commit 5cf9610

Browse files
committed
Merge pull request #35 from videojs/hotfix/snapshot-scope
Handle snapshots directly before and after ad playback
2 parents d53ff7a + cc924fd commit 5cf9610

File tree

3 files changed

+49
-18
lines changed

3 files changed

+49
-18
lines changed

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
{
22
"name": "videojs-contrib-ads",
3+
"description": "A framework that provides common functionality needed by video advertisement libraries working with video.js.",
4+
"repository": {
5+
"type": "git",
6+
"url": "https://github.com/videojs/videojs-contrib-ads.git"
7+
},
38
"version": "0.2.1",
49
"author": {
510
"name": "Brightcove"

src/videojs.ads.js

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,6 @@ var
296296
},
297297
'play': function() {
298298
this.state = 'ads-ready?';
299-
this.snapshot = getPlayerSnapshot(player);
300299
cancelContentPlay(player);
301300

302301
// remove the poster so it doesn't flash between videos
@@ -314,13 +313,6 @@ var
314313
},
315314
'preroll?': {
316315
enter: function() {
317-
318-
// capture current player state snapshot (playing, currentTime, src)
319-
this.snapshot = getPlayerSnapshot(player);
320-
321-
// remove the poster so it doesn't flash between videos
322-
removeNativePoster(player);
323-
324316
// change class to show that we're waiting on ads
325317
player.el().className += ' vjs-ad-loading';
326318

@@ -379,9 +371,6 @@ var
379371
}
380372
},
381373
'ad-timeout-playback': {
382-
enter: function() {
383-
restorePlayerSnapshot(player, this.snapshot);
384-
},
385374
events: {
386375
'adsready': function() {
387376
if (player.paused()) {
@@ -400,19 +389,27 @@ var
400389
}
401390
},
402391
'ad-playback': {
392+
enter: function() {
393+
// capture current player state snapshot (playing, currentTime, src)
394+
this.snapshot = getPlayerSnapshot(player);
395+
396+
// remove the poster so it doesn't flash between videos
397+
removeNativePoster(player);
398+
},
399+
leave: function() {
400+
removeClass(player.el(), 'vjs-ad-playing');
401+
restorePlayerSnapshot(player, this.snapshot);
402+
},
403403
events: {
404404
'adend': function() {
405405
this.state = 'content-playback';
406-
removeClass(player.el(), 'vjs-ad-playing');
407-
restorePlayerSnapshot(player, this.snapshot);
408406
}
409407
}
410408
},
411409
'content-playback': {
412410
events: {
413411
'adstart': function() {
414412
this.state = 'ad-playback';
415-
this.snapshot = getPlayerSnapshot(player);
416413
player.el().className += ' vjs-ad-playing';
417414

418415
// remove the poster so it doesn't flash between videos

test/videojs.ads.test.js

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ test('removes the poster attribute so it does not flash between videos', functio
238238

239239
player.trigger('adsready');
240240
player.trigger('play');
241+
player.trigger('adstart');
241242

242243
equal(video.poster, '', 'poster is removed');
243244
});
@@ -455,8 +456,10 @@ test('only restores the player snapshot if the src changed', function() {
455456
}
456457
srcModified = true;
457458
};
458-
player.currentTime = function() {
459-
currentTimeModified = true;
459+
player.currentTime = function(time) {
460+
if (time !== undefined) {
461+
currentTimeModified = true;
462+
}
460463
};
461464

462465
// with a separate video display or server-side ad insertion, ads play but
@@ -582,15 +585,41 @@ test('snapshot does not resume after multiple post-rolls', function() {
582585
player.trigger('ended');
583586
//trigger a lots o post-rolls
584587
player.trigger('adstart');
585-
player.src('//exampe.com/ad1.mp4');
588+
player.src('http://example.com/ad1.mp4');
586589
player.trigger('loadstart');
587590
player.trigger('adend');
588591
player.trigger('adstart');
589-
player.src('//exampe.com/ad2.mp4');
592+
player.src('http://example.com/ad2.mp4');
590593
player.trigger('loadstart');
591594
player.trigger('adend');
592595

593596
equal(player.ads.state, 'content-playback', 'Player should be in content-playback state after a post-roll');
594597
ok(!playCalled, 'content playback should not resume');
595598

596599
});
600+
601+
test('changing the source and then timing out does not restore a snapshot', function() {
602+
player.paused = function() {
603+
return false;
604+
};
605+
// load and play the initial video
606+
player.src('http://example.com/movie.mp4');
607+
player.trigger('loadstart');
608+
player.trigger('play');
609+
player.trigger('adsready');
610+
// preroll
611+
player.trigger('adstart');
612+
player.trigger('adend');
613+
614+
// change the content and timeout the new ad response
615+
player.src('http://example.com/movie2.mp4');
616+
player.trigger('loadstart');
617+
player.trigger('adtimeout');
618+
619+
equal(player.ads.state,
620+
'ad-timeout-playback',
621+
'playing the new content video after the ad timeout');
622+
equal('http://example.com/movie2.mp4',
623+
player.currentSrc(),
624+
'playing the second video');
625+
});

0 commit comments

Comments
 (0)