diff --git a/src/js/player.js b/src/js/player.js index 81fa131951..f98aea2633 100644 --- a/src/js/player.js +++ b/src/js/player.js @@ -1155,7 +1155,8 @@ vjs.Player.prototype.src = function(source){ * @private */ vjs.Player.prototype.sourceList_ = function(sources){ - var sourceTech = this.selectSource(sources); + var sourceTech = this.selectSource(sources), + errorTimeout; if (sourceTech) { if (sourceTech.tech === this.techName) { @@ -1167,13 +1168,17 @@ vjs.Player.prototype.sourceList_ = function(sources){ } } else { // We need to wrap this in a timeout to give folks a chance to add error event handlers - setTimeout(vjs.bind(this, function() { + errorTimeout = setTimeout(vjs.bind(this, function() { this.error({ code: 4, message: this.localize(this.options()['notSupportedMessage']) }); }), 0); // we could not find an appropriate tech, but let's still notify the delegate that this is it // this needs a better comment about why this is needed this.triggerReady(); + + this.on('dispose', function() { + clearTimeout(errorTimeout); + }); } }; diff --git a/test/unit/mediafaker.js b/test/unit/mediafaker.js index 907bca62f9..8f422b0cf8 100644 --- a/test/unit/mediafaker.js +++ b/test/unit/mediafaker.js @@ -12,9 +12,9 @@ vjs.MediaFaker = vjs.MediaTechController.extend({ } }); -// Support everything +// Support everything except for "video/unsupported-format" vjs.MediaFaker.isSupported = function(){ return true; }; -vjs.MediaFaker.canPlaySource = function(srcObj){ return true; }; +vjs.MediaFaker.canPlaySource = function(srcObj){ return srcObj.type !== 'video/unsupported-format'; }; vjs.MediaFaker.prototype.createEl = function(){ var el = vjs.MediaTechController.prototype.createEl.call(this, 'div', { diff --git a/test/unit/player.js b/test/unit/player.js index 01d0f051bf..22d927e682 100644 --- a/test/unit/player.js +++ b/test/unit/player.js @@ -601,3 +601,20 @@ test('should honor disabled inactivity timeout', function() { clock.restore(); }); + +test('should clear pending errors on disposal', function() { + var clock = sinon.useFakeTimers(), player; + + player = PlayerTest.makePlayer(); + player.src({ + src: 'http://example.com/movie.unsupported-format', + type: 'video/unsupported-format' + }); + player.dispose(); + try { + clock.tick(5000); + } catch (e) { + return ok(!e, 'threw an error: ' + e.message); + } + ok(true, 'did not throw an error after disposal'); +});