diff --git a/src/streaming/MediaManager.js b/src/streaming/MediaManager.js index aa12691c05..2700ae737c 100644 --- a/src/streaming/MediaManager.js +++ b/src/streaming/MediaManager.js @@ -108,7 +108,7 @@ function MediaManager() { function prebufferAlternativeContent(playerId, alternativeMpdUrl) { try { if (prebufferedPlayers.has(playerId)) { - return; // Already prebuffered + return; } logger.info(`Starting prebuffering for player ${playerId}`); @@ -150,10 +150,6 @@ function MediaManager() { prebufferedPlayer.player.off(Events.ERROR); prebufferedPlayer.player.reset(); - if (prebufferedPlayer.videoElement && prebufferedPlayer.videoElement?.parentNode) { - prebufferedPlayer.videoElement.parentNode?.removeChild(prebufferedPlayer.videoElement); - } - prebufferedPlayers.delete(playerId); } logger.debug(`Cleaned up prebuffered content for ${playerId}`); @@ -231,6 +227,11 @@ function MediaManager() { logger.debug('Switch already in progress - ignoring request'); return }; + + if (!altPlayer) { + logger.warn('No alternative player to switch back from'); + return; + } logger.info('Switching back to main content'); isSwitching = true; diff --git a/test/unit/mocks/VideoModelMock.js b/test/unit/mocks/VideoModelMock.js index a1f64c0ec1..2ff7095355 100644 --- a/test/unit/mocks/VideoModelMock.js +++ b/test/unit/mocks/VideoModelMock.js @@ -111,9 +111,14 @@ class VideoModelMock { } pause() { + this.isplaying = false; this.ispaused = true; } + isPlaying() { + return this.isplaying; + } + isPaused() { return this.ispaused; } diff --git a/test/unit/test/streaming/streaming.MediaManager.js b/test/unit/test/streaming/streaming.MediaManager.js index b4be56eec2..4fb1062304 100644 --- a/test/unit/test/streaming/streaming.MediaManager.js +++ b/test/unit/test/streaming/streaming.MediaManager.js @@ -5,16 +5,18 @@ import DebugMock from '../../mocks/DebugMock.js'; import { expect } from 'chai'; describe('MediaManager', function () { - const mediaManager = MediaManager().getInstance(); + let mediaManager; let videoModelMock; + let mockVideoElement; let playbackControllerMock; let debugMock; beforeEach(function () { + mediaManager = MediaManager().getInstance(); videoModelMock = new VideoModelMock(); + videoModelMock.play(); playbackControllerMock = new PlaybackControllerMock(); debugMock = new DebugMock(); - mediaManager.setConfig({ videoModel: videoModelMock, playbackController: playbackControllerMock, @@ -32,9 +34,9 @@ describe('MediaManager', function () { } }); - describe('setAlternativeVideoElement', function () { + describe('set the alternative video element', function () { it('should not throw error when setting alternative video element', function () { - const mockVideoElement = videoModelMock.getElement(); + mockVideoElement = document.createElement('video'); expect(() => { mediaManager.setAlternativeVideoElement(mockVideoElement); @@ -42,20 +44,22 @@ describe('MediaManager', function () { }); }); - describe('prebufferAlternativeContent', function () { + describe('prebuffer the alternative content', function () { it('should start prebuffering alternative content and log the action', function () { const testUrl = 'http://test.mpd'; const testPlayerId = 'testPlayer'; - mediaManager.prebufferAlternativeContent(testPlayerId, testUrl); + expect(() => { + mediaManager.prebufferAlternativeContent(testPlayerId, testUrl); + }).to.not.throw(); expect(debugMock.log.info).to.equal(`Starting prebuffering for player ${testPlayerId}`); }); }); - describe('switchToAlternativeContent', function () { + describe('switch to the alternative content', function () { beforeEach(function () { - const mockVideoElement = videoModelMock.getElement(); + mockVideoElement = document.createElement('video'); mediaManager.setAlternativeVideoElement(mockVideoElement); }); @@ -66,6 +70,9 @@ describe('MediaManager', function () { mediaManager.switchToAlternativeContent(testPlayerId, testUrl); expect(debugMock.log.info).to.equal(`Alternative content playback started for player ${testPlayerId}`); + expect(videoModelMock.isPaused()).to.be.true; + expect(mockVideoElement.style.display).to.be.equal('block'); + expect(videoModelMock.getElement().style.display).to.be.equal('none'); }); it('should switch to alternative content with prebuffered content', function () { @@ -73,10 +80,12 @@ describe('MediaManager', function () { const testPlayerId = 'testPlayer'; mediaManager.prebufferAlternativeContent(testPlayerId, testUrl); - expect(debugMock.log.info).to.equal(`Starting prebuffering for player ${testPlayerId}`); - mediaManager.switchToAlternativeContent(testPlayerId, testUrl); + expect(debugMock.log.info).to.equal(`Alternative content playback started for player ${testPlayerId}`); + expect(videoModelMock.isPaused()).to.be.true; + expect(mockVideoElement.style.display).to.be.equal('block'); + expect(videoModelMock.getElement().style.display).to.be.equal('none'); }); it('should switch to alternative content and seek to a given time', function () { @@ -88,18 +97,21 @@ describe('MediaManager', function () { expect(debugMock.log.debug).to.equal(`Seeking alternative content to time: ${testTime}`); expect(debugMock.log.info).to.equal(`Alternative content playback started for player ${testPlayerId}`); + expect(videoModelMock.isPaused()).to.be.true; + expect(mockVideoElement.style.display).to.be.equal('block'); + expect(videoModelMock.getElement().style.display).to.be.equal('none'); }); }); - describe('getAlternativePlayer', function () { + describe('get alternative player', function () { beforeEach(function () { - const mockVideoElement = videoModelMock.getElement(); + mockVideoElement = document.createElement('video'); mediaManager.setAlternativeVideoElement(mockVideoElement); }); it('should return null when no alternative player is set', function () { const result = mediaManager.getAlternativePlayer(); - expect(result).to.be.null; + expect(result).to.be.undefined; }); it('should return the alternative player when it is set', function () { @@ -113,4 +125,30 @@ describe('MediaManager', function () { expect(result).to.be.an('object'); }); }); + + describe('switch back to the main content', function () { + beforeEach(function () { + mockVideoElement = document.createElement('video'); + mediaManager.setAlternativeVideoElement(mockVideoElement); + }); + + it('should warn when no alternative player is set', function () { + mediaManager.switchBackToMainContent(10); + + expect(debugMock.log.warn).to.equal('No alternative player to switch back from'); + }); + + it('should switch back to main content', function () { + const testUrl = 'http://test.mpd'; + const testPlayerId = 'testPlayer'; + const seekTime = 20; + + mediaManager.switchToAlternativeContent(testPlayerId, testUrl, 0); + mediaManager.switchBackToMainContent(seekTime); + + expect(debugMock.log.info).to.equal('Main content playback resumed'); + expect(mediaManager.getAlternativePlayer()).to.be.null; + expect(videoModelMock.isPlaying()).to.be.true; + }); + }); }); \ No newline at end of file