Don't blow up if the tech is disposed before player.ready(). For #88.
The HLS tech waits until `ready` before setting the source to be sure that Flash has time to finish loading. If a user changed the src and triggered a tech unload before that time, the ready handler would be invoked, throw an exception, and leave the tech in a transitionary state. Instead, double check that the object element is still alive before setting the src in the `ready` handler.
Showing
2 changed files
with
33 additions
and
0 deletions
... | @@ -211,6 +211,10 @@ var | ... | @@ -211,6 +211,10 @@ var |
211 | if (lastSeekedTime) { | 211 | if (lastSeekedTime) { |
212 | return lastSeekedTime; | 212 | return lastSeekedTime; |
213 | } | 213 | } |
214 | // currentTime is zero while the tech is initializing | ||
215 | if (!this.el() || !this.el().vjs_getProperty) { | ||
216 | return 0; | ||
217 | } | ||
214 | return this.el().vjs_getProperty('currentTime'); | 218 | return this.el().vjs_getProperty('currentTime'); |
215 | }; | 219 | }; |
216 | 220 | ||
... | @@ -640,6 +644,11 @@ videojs.Hls.prototype.src = function(src) { | ... | @@ -640,6 +644,11 @@ videojs.Hls.prototype.src = function(src) { |
640 | this.mediaSource = mediaSource; | 644 | this.mediaSource = mediaSource; |
641 | initSource(player, mediaSource, src); | 645 | initSource(player, mediaSource, src); |
642 | this.player().ready(function() { | 646 | this.player().ready(function() { |
647 | // do nothing if the tech has been disposed already | ||
648 | // this can occur if someone sets the src in player.ready(), for instance | ||
649 | if (!self.el()) { | ||
650 | return; | ||
651 | } | ||
643 | self.el().vjs_src(source.src); | 652 | self.el().vjs_src(source.src); |
644 | }); | 653 | }); |
645 | } | 654 | } | ... | ... |
... | @@ -1278,4 +1278,28 @@ test('re-emits mediachange events', function() { | ... | @@ -1278,4 +1278,28 @@ test('re-emits mediachange events', function() { |
1278 | strictEqual(mediaChanges, 1, 'fired mediachange'); | 1278 | strictEqual(mediaChanges, 1, 'fired mediachange'); |
1279 | }); | 1279 | }); |
1280 | 1280 | ||
1281 | test('can be disposed before finishing initialization', function() { | ||
1282 | var player = createPlayer(), readyHandlers = []; | ||
1283 | player.ready = function(callback) { | ||
1284 | readyHandlers.push(callback); | ||
1285 | }; | ||
1286 | player.src({ | ||
1287 | src: 'http://example.com/media.m3u8', | ||
1288 | type: 'application/vnd.apple.mpegurl' | ||
1289 | }); | ||
1290 | player.src({ | ||
1291 | src: 'http://example.com/media.mp4', | ||
1292 | type: 'video/mp4' | ||
1293 | }); | ||
1294 | ok(readyHandlers.length > 0, 'registered a ready handler'); | ||
1295 | try { | ||
1296 | while (readyHandlers.length) { | ||
1297 | readyHandlers.shift()(); | ||
1298 | } | ||
1299 | ok(true, 'did not throw an exception'); | ||
1300 | } catch (e) { | ||
1301 | ok(false, 'threw an exception'); | ||
1302 | } | ||
1303 | }); | ||
1304 | |||
1281 | })(window, window.videojs); | 1305 | })(window, window.videojs); | ... | ... |
-
Please register or sign in to post a comment