1
0
mirror of https://github.com/videojs/video.js.git synced 2025-01-02 06:32:07 +02:00

fix(player): cache_.currentTime is not updated when the current time is set (#8285)

Updating cache_.currentTime as soon as the currentTime is set avoids having to wait for the timeupdate event, which results in:

- making cache_.currentTime more reliable
- updating the progress bar on mouse up after dragging when the media is paused.

See also: #6232, #6234, #6370, #6372
This commit is contained in:
André 2023-06-01 14:50:29 +02:00 committed by GitHub
parent 7e8532433e
commit b782cb09f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 20 deletions

View File

@ -2462,29 +2462,34 @@ class Player extends Component {
* - Nothing when setting
*/
currentTime(seconds) {
if (typeof seconds !== 'undefined') {
if (seconds < 0) {
seconds = 0;
}
if (!this.isReady_ || this.changingSrc_ || !this.tech_ || !this.tech_.isReady_) {
this.cache_.initTime = seconds;
this.off('canplay', this.boundApplyInitTime_);
this.one('canplay', this.boundApplyInitTime_);
return;
}
this.techCall_('setCurrentTime', seconds);
this.cache_.initTime = 0;
if (seconds === undefined) {
// cache last currentTime and return. default to 0 seconds
//
// Caching the currentTime is meant to prevent a massive amount of reads on the tech's
// currentTime when scrubbing, but may not provide much performance benefit after all.
// Should be tested. Also something has to read the actual current time or the cache will
// never get updated.
this.cache_.currentTime = (this.techGet_('currentTime') || 0);
return this.cache_.currentTime;
}
if (seconds < 0) {
seconds = 0;
}
if (!this.isReady_ || this.changingSrc_ || !this.tech_ || !this.tech_.isReady_) {
this.cache_.initTime = seconds;
this.off('canplay', this.boundApplyInitTime_);
this.one('canplay', this.boundApplyInitTime_);
return;
}
// cache last currentTime and return. default to 0 seconds
//
// Caching the currentTime is meant to prevent a massive amount of reads on the tech's
// currentTime when scrubbing, but may not provide much performance benefit after all.
// Should be tested. Also something has to read the actual current time or the cache will
// never get updated.
this.cache_.currentTime = (this.techGet_('currentTime') || 0);
return this.cache_.currentTime;
this.techCall_('setCurrentTime', seconds);
this.cache_.initTime = 0;
if (isFinite(seconds)) {
this.cache_.currentTime = Number(seconds);
}
}
/**

View File

@ -2699,6 +2699,20 @@ QUnit.test('Should accept multiple calls to currentTime after player initializat
assert.equal(player.currentTime(), 800, 'The last value passed is stored as the currentTime value');
});
QUnit.test('Should be able to set the cache currentTime after player initialization as soon the canplay event is fired', function(assert) {
const player = TestHelpers.makePlayer({});
player.src('xyz.mp4');
player.currentTime(500);
assert.strictEqual(player.getCache().currentTime, 0, 'cache currentTime value was not changed');
this.clock.tick(100);
player.trigger('canplay');
assert.strictEqual(player.getCache().currentTime, 500, 'cache currentTime value is the one passed after initialization');
});
QUnit.test('Should fire debugon event when debug mode is enabled', function(assert) {
const player = TestHelpers.makePlayer({});
const debugOnSpy = sinon.spy();