Skip to content

Commit

Permalink
Do not execute multiple setCurrentTime via waitForReadyState to avoid…
Browse files Browse the repository at this point in the history
… race condition (#4279)
  • Loading branch information
dsilhavy committed Sep 12, 2023
1 parent e9f7778 commit b9b5159
Showing 1 changed file with 43 additions and 34 deletions.
77 changes: 43 additions & 34 deletions src/streaming/models/VideoModel.js
Expand Up @@ -49,6 +49,7 @@ function VideoModel() {
logger,
element,
_currentTime,
setCurrentTimeReadyStateFunction,
TTMLRenderingDiv,
vttRenderingDiv,
previousPlaybackRate,
Expand Down Expand Up @@ -94,8 +95,11 @@ function VideoModel() {
//TODO Move the DVR window calculations from MediaPlayer to Here.
function setCurrentTime(currentTime, stickToBuffered) {
if (element) {
if (setCurrentTimeReadyStateFunction && setCurrentTimeReadyStateFunction.func && setCurrentTimeReadyStateFunction.event) {
removeEventListener(setCurrentTimeReadyStateFunction.event, setCurrentTimeReadyStateFunction.func);
}
_currentTime = currentTime;
waitForReadyState(Constants.VIDEO_ELEMENT_READY_STATES.HAVE_METADATA, () => {
setCurrentTimeReadyStateFunction = waitForReadyState(Constants.VIDEO_ELEMENT_READY_STATES.HAVE_METADATA, () => {
if (!element) {
return;
}
Expand All @@ -114,7 +118,9 @@ function VideoModel() {
// setTimeout is used to workaround InvalidStateError in IE11
try {
_currentTime = stickToBuffered ? stickTimeToBuffered(_currentTime) : _currentTime;
element.currentTime = _currentTime;
if (!isNaN(_currentTime)) {
element.currentTime = _currentTime;
}
_currentTime = NaN;
} catch (e) {
if (element.readyState === 0 && e.code === e.INVALID_STATE_ERR) {
Expand Down Expand Up @@ -432,10 +438,11 @@ function VideoModel() {
if (targetReadyState === Constants.VIDEO_ELEMENT_READY_STATES.HAVE_NOTHING ||
getReadyState() >= targetReadyState) {
callback();
return null;
} else {
// wait for the appropriate callback before checking again
const event = READY_STATES_TO_EVENT_NAMES.get(targetReadyState);
_listenOnce(event, callback);
return _listenOnce(event, callback);
}
}

Expand All @@ -447,48 +454,50 @@ function VideoModel() {
callback(event);
};
addEventListener(event, func);

return { func, event }
}

instance = {
initialize,
setCurrentTime,
play,
isPaused,
pause,
isStalled,
isSeeking,
getTime,
addEventListener,
addTextTrack,
appendChild,
getBufferRange,
getClientHeight,
getClientWidth,
getElement,
getEnded,
getPlaybackQuality,
getPlaybackRate,
setPlaybackRate,
getPlayedRanges,
getEnded,
setStallState,
getElement,
setElement,
setSource,
getReadyState,
getSource,
getTTMLRenderingDiv,
setTTMLRenderingDiv,
getVttRenderingDiv,
setVttRenderingDiv,
getPlaybackQuality,
addEventListener,
removeEventListener,
getReadyState,
getBufferRange,
getClientWidth,
getClientHeight,
getTextTracks,
getTextTrack,
addTextTrack,
appendChild,
removeChild,
getVideoWidth,
getTextTracks,
getTime,
getVideoHeight,
getVideoRelativeOffsetTop,
getVideoRelativeOffsetLeft,
getVideoRelativeOffsetTop,
getVideoWidth,
getVttRenderingDiv,
initialize,
isPaused,
isSeeking,
isStalled,
pause,
play,
removeChild,
removeEventListener,
reset,
setCurrentTime,
setElement,
setPlaybackRate,
setSource,
setStallState,
setTTMLRenderingDiv,
setVttRenderingDiv,
waitForReadyState,
reset
};

setup();
Expand Down

0 comments on commit b9b5159

Please sign in to comment.