mirror of
https://github.com/videojs/video.js.git
synced 2024-12-25 02:42:10 +02:00
@incompl clear currentSource_ after subsequent loadstarts. closes #3285
This commit is contained in:
parent
6296ca8538
commit
249532ad45
@ -8,6 +8,7 @@ CHANGELOG
|
||||
* @gkatsev updated text track documentation and crossorigin warning. Fixes #1888, #1958, #2628, #3202 ([view](https://github.com/videojs/video.js/pull/3256))
|
||||
* @BrandonOCasey added audio and video track support ([view](https://github.com/videojs/video.js/pull/3173))
|
||||
* @OwenEdwards added language attribute in HTML files for accessibility ([view](https://github.com/videojs/video.js/pull/3257))
|
||||
* @incompl clear currentSource_ after subsequent loadstarts ([view](https://github.com/videojs/video.js/pull/3285))
|
||||
|
||||
--------------------
|
||||
|
||||
|
@ -11,7 +11,7 @@ EventTarget.prototype.on = function(type, fn) {
|
||||
// Remove the addEventListener alias before calling Events.on
|
||||
// so we don't get into an infinite type loop
|
||||
let ael = this.addEventListener;
|
||||
this.addEventListener = Function.prototype;
|
||||
this.addEventListener = () => {};
|
||||
Events.on(this, type, fn);
|
||||
this.addEventListener = ael;
|
||||
};
|
||||
@ -23,7 +23,12 @@ EventTarget.prototype.off = function(type, fn) {
|
||||
EventTarget.prototype.removeEventListener = EventTarget.prototype.off;
|
||||
|
||||
EventTarget.prototype.one = function(type, fn) {
|
||||
// Remove the addEventListener alias before calling Events.on
|
||||
// so we don't get into an infinite type loop
|
||||
let ael = this.addEventListener;
|
||||
this.addEventListener = () => {};
|
||||
Events.one(this, type, fn);
|
||||
this.addEventListener = ael;
|
||||
};
|
||||
|
||||
EventTarget.prototype.trigger = function(event) {
|
||||
|
@ -1148,7 +1148,6 @@ Html5.prototype['featuresNativeVideoTracks'] = Html5.supportsNativeVideoTracks()
|
||||
*/
|
||||
Html5.prototype['featuresNativeAudioTracks'] = Html5.supportsNativeAudioTracks();
|
||||
|
||||
|
||||
// HTML5 Feature detection and Device Fixes --------------------------------- //
|
||||
let canPlayType;
|
||||
const mpegurlRE = /^application\/(?:x-|vnd\.apple\.)mpegurl/i;
|
||||
|
@ -814,18 +814,44 @@ Tech.withSourceHandlers = function(_Tech){
|
||||
if (this.currentSource_) {
|
||||
this.clearTracks(['audio', 'video']);
|
||||
}
|
||||
this.currentSource_ = source;
|
||||
|
||||
if (sh !== _Tech.nativeSourceHandler) {
|
||||
|
||||
this.currentSource_ = source;
|
||||
|
||||
// Catch if someone replaced the src without calling setSource.
|
||||
// If they do, set currentSource_ to null and dispose our source handler.
|
||||
this.off(this.el_, 'loadstart', _Tech.prototype.firstLoadStartListener_);
|
||||
this.off(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_);
|
||||
this.one(this.el_, 'loadstart', _Tech.prototype.firstLoadStartListener_);
|
||||
|
||||
}
|
||||
|
||||
this.sourceHandler_ = sh.handleSource(source, this, this.options_);
|
||||
this.on('dispose', this.disposeSourceHandler);
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/*
|
||||
* Clean up any existing source handler
|
||||
*/
|
||||
_Tech.prototype.disposeSourceHandler = function(){
|
||||
// On the first loadstart after setSource
|
||||
_Tech.prototype.firstLoadStartListener_ = function() {
|
||||
this.one(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_);
|
||||
};
|
||||
|
||||
// On successive loadstarts when setSource has not been called again
|
||||
_Tech.prototype.successiveLoadStartListener_ = function() {
|
||||
this.currentSource_ = null;
|
||||
this.disposeSourceHandler();
|
||||
this.one(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_);
|
||||
};
|
||||
|
||||
/*
|
||||
* Clean up any existing source handler
|
||||
*/
|
||||
_Tech.prototype.disposeSourceHandler = function() {
|
||||
if (this.sourceHandler_ && this.sourceHandler_.dispose) {
|
||||
this.off(this.el_, 'loadstart', _Tech.prototype.firstLoadStartListener_);
|
||||
this.off(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_);
|
||||
this.sourceHandler_.dispose();
|
||||
}
|
||||
};
|
||||
|
@ -14,7 +14,6 @@ import AudioTrackList from '../../../src/js/tracks/audio-track-list';
|
||||
import VideoTrackList from '../../../src/js/tracks/video-track-list';
|
||||
import TextTrackList from '../../../src/js/tracks/text-track-list';
|
||||
|
||||
|
||||
q.module('Media Tech', {
|
||||
'setup': function() {
|
||||
this.noop = function() {};
|
||||
@ -370,3 +369,47 @@ test('Tech.isTech returns correct answers for techs and components', function()
|
||||
ok(!isTech(new Button({}, {})), 'A Button instance is not a Tech');
|
||||
ok(!isTech(isTech), 'A function is not a Tech');
|
||||
});
|
||||
|
||||
test('Tech#setSource clears currentSource_ after repeated loadstart', function() {
|
||||
let disposed = false;
|
||||
let MyTech = extendFn(Tech);
|
||||
|
||||
Tech.withSourceHandlers(MyTech);
|
||||
let tech = new MyTech();
|
||||
|
||||
var sourceHandler = {
|
||||
canPlayType: function(type) {
|
||||
return true;
|
||||
},
|
||||
canHandleSource: function(source) {
|
||||
return true;
|
||||
},
|
||||
handleSource: function(source, tech, options) {
|
||||
return {
|
||||
dispose: function() {
|
||||
disposed = true;
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// Test registering source handlers
|
||||
MyTech.registerSourceHandler(sourceHandler);
|
||||
|
||||
// First loadstart
|
||||
tech.setSource('test');
|
||||
tech.currentSource_ = 'test';
|
||||
tech.trigger('loadstart');
|
||||
equal(tech.currentSource_, 'test', 'Current source is test');
|
||||
|
||||
// Second loadstart
|
||||
tech.trigger('loadstart');
|
||||
equal(tech.currentSource_, null, 'Current source is null');
|
||||
equal(disposed, true, 'disposed is true');
|
||||
|
||||
// Third loadstart
|
||||
tech.currentSource_ = 'test';
|
||||
tech.trigger('loadstart');
|
||||
equal(tech.currentSource_, null, 'Current source is still null');
|
||||
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user