From 35fad1d45494b8b1de9e5b8feb49be58b814105a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <34163393+amtins@users.noreply.github.com> Date: Wed, 31 May 2023 16:41:44 +0200 Subject: [PATCH] fix(player): load method fails to reset the media element to its initial state when the VHS is used (#8274) --- src/js/player.js | 8 ++++++++ test/unit/player.test.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/js/player.js b/src/js/player.js index da7f57e828..20e6beb25f 100644 --- a/src/js/player.js +++ b/src/js/player.js @@ -3533,6 +3533,14 @@ class Player extends Component { * Begin loading the src data. */ load() { + // Workaround to use the load method with the VHS. + // Does not cover the case when the load method is called directly from the mediaElement. + if (this.tech_.vhs) { + this.src(this.currentSource()); + + return; + } + this.techCall_('load'); } diff --git a/test/unit/player.test.js b/test/unit/player.test.js index fa5875d3b6..a595646849 100644 --- a/test/unit/player.test.js +++ b/test/unit/player.test.js @@ -3231,6 +3231,34 @@ QUnit.test('turning on audioPosterMode when audioOnlyMode is already on will tur }); }); +QUnit.test('player#load resets the media element to its initial state', function(assert) { + const player = TestHelpers.makePlayer({}); + + player.src({ src: 'http://vjs.zencdn.net/v/oceans2.mp4', type: 'video/mp4' }); + + // Declaring spies here avoids spying on previous calls + const techGet_ = sinon.spy(player, 'techCall_'); + const src = sinon.spy(player, 'src'); + + player.load(); + + // Case when the VHS tech is not used + assert.ok(techGet_.calledOnce, 'techCall_ was called once'); + assert.ok(src.notCalled, 'src was not called'); + + // Simulate the VHS tech + player.tech_.vhs = true; + player.load(); + + // Case when the VHS tech is used + assert.ok(techGet_.calledOnce, 'techCall_ remains the same'); + assert.ok(src.calledOnce, 'src was called'); + + techGet_.restore(); + src.restore(); + player.dispose(); +}); + QUnit.test('crossOrigin value should be maintained after loadMedia is called', function(assert) { const fixture = document.getElementById('qunit-fixture');