mirror of
				https://github.com/videojs/video.js.git
				synced 2025-10-31 00:08:01 +02:00 
			
		
		
		
	feat: support fastSeek during scrubbing if available (#6525)
This will allow us to use iframe playlists on HLS on Safari browsers and eventually, add support in VHS.
This commit is contained in:
		| @@ -2432,6 +2432,7 @@ class Player extends Component { | ||||
|       return this.scrubbing_; | ||||
|     } | ||||
|     this.scrubbing_ = !!isScrubbing; | ||||
|     this.techCall_('setScrubbing', this.scrubbing_); | ||||
|  | ||||
|     if (isScrubbing) { | ||||
|       this.addClass('vjs-scrubbing'); | ||||
|   | ||||
| @@ -520,6 +520,10 @@ class Html5 extends Tech { | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   setScrubbing(isScrubbing) { | ||||
|     this.isScrubbing_ = isScrubbing; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Set current time for the `HTML5` tech. | ||||
|    * | ||||
| @@ -528,7 +532,11 @@ class Html5 extends Tech { | ||||
|    */ | ||||
|   setCurrentTime(seconds) { | ||||
|     try { | ||||
|       this.el_.currentTime = seconds; | ||||
|       if (this.isScrubbing_ && this.el_.fastSeek) { | ||||
|         this.el_.fastSeek(seconds); | ||||
|       } else { | ||||
|         this.el_.currentTime = seconds; | ||||
|       } | ||||
|     } catch (e) { | ||||
|       log(e, 'Video is not ready. (Video.js)'); | ||||
|       // this.warning(VideoJS.warnings.videoNotReady); | ||||
|   | ||||
| @@ -1241,6 +1241,23 @@ QUnit.test('should add an audio player region if an audio el is used', function( | ||||
|   player.dispose(); | ||||
| }); | ||||
|  | ||||
| QUnit.test('should setScrubbing when seeking or not seeking', function(assert) { | ||||
|   const player = TestHelpers.makePlayer(); | ||||
|   let isScrubbing; | ||||
|  | ||||
|   player.tech_.setScrubbing = (_isScrubbing) => { | ||||
|     isScrubbing = _isScrubbing; | ||||
|   }; | ||||
|  | ||||
|   assert.equal(player.scrubbing(), false, 'player is not scrubbing'); | ||||
|  | ||||
|   player.scrubbing(true); | ||||
|   assert.ok(isScrubbing, "tech's setScrubbing was called with true"); | ||||
|  | ||||
|   player.scrubbing(false); | ||||
|   assert.notOk(isScrubbing, "tech's setScrubbing was called with false"); | ||||
| }); | ||||
|  | ||||
| QUnit.test('should not be scrubbing while not seeking', function(assert) { | ||||
|   const player = TestHelpers.makePlayer(); | ||||
|  | ||||
|   | ||||
| @@ -5,6 +5,7 @@ let tech; | ||||
| import Html5 from '../../../src/js/tech/html5.js'; | ||||
| import * as browser from '../../../src/js/utils/browser.js'; | ||||
| import document from 'global/document'; | ||||
| import sinon from 'sinon'; | ||||
|  | ||||
| QUnit.module('HTML5', { | ||||
|   beforeEach(assert) { | ||||
| @@ -50,6 +51,38 @@ QUnit.module('HTML5', { | ||||
|   } | ||||
| }); | ||||
|  | ||||
| QUnit.test('if setScrubbing is true and fastSeek is available, use it', function(assert) { | ||||
|   Object.defineProperty(tech.el(), 'currentTime', { | ||||
|     get: () => {}, | ||||
|     set: () => {}, | ||||
|  | ||||
|     writeable: true, | ||||
|     enumerable: false, | ||||
|     configurable: true | ||||
|   }); | ||||
|  | ||||
|   const currentTimeSpy = sinon.spy(tech.el(), 'currentTime', ['set']); | ||||
|  | ||||
|   tech.setCurrentTime(5); | ||||
|   assert.ok(currentTimeSpy.set.called, 'currentTime setter was called'); | ||||
|   assert.ok(currentTimeSpy.set.calledWith(5), 'currentTime setter was called with 5'); | ||||
|  | ||||
|   tech.setScrubbing(true); | ||||
|  | ||||
|   // when scrubbing is set but fastSeek isn't available, currentTime should still be called | ||||
|   tech.el().fastSeek = null; | ||||
|   tech.setCurrentTime(10); | ||||
|   assert.ok(currentTimeSpy.set.called, 'currentTime setter was called'); | ||||
|   assert.ok(currentTimeSpy.set.calledWith(10), 'currentTime setter was called with 10'); | ||||
|  | ||||
|   const fastSeekSpy = tech.el().fastSeek = sinon.spy(); | ||||
|  | ||||
|   tech.setCurrentTime(15); | ||||
|   assert.ok(currentTimeSpy.set.calledTwice, 'currentTime setter was only called twice and not a 3rd time for fastSeek'); | ||||
|   assert.ok(fastSeekSpy.called, 'fastSeek called'); | ||||
|   assert.ok(fastSeekSpy.calledWith(15), 'fastSeek called with 15'); | ||||
| }); | ||||
|  | ||||
| QUnit.test('should be able to set playsinline attribute', function(assert) { | ||||
|   assert.expect(2); | ||||
|  | ||||
|   | ||||
| @@ -97,6 +97,7 @@ class TechFaker extends Tech { | ||||
|   seeking() { | ||||
|     return false; | ||||
|   } | ||||
|   setScrubbing() {} | ||||
|   fakeSourceset() { | ||||
|     this.el_.src = this.options_.sourceset; | ||||
|     this.el_.setAttribute('src', this.options_.sourceset); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user