Skip to content

Commit

Permalink
add option to disable seeking while scrubbing on mobile
Browse files Browse the repository at this point in the history
  • Loading branch information
alex-barstow committed Oct 23, 2024
1 parent d2b9d5c commit 7c84f7a
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 13 deletions.
10 changes: 8 additions & 2 deletions src/css/components/_progress.scss
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@

// This increases the size of the progress holder so there is an increased
// hit area for clicks/touches.
.video-js .vjs-progress-control:hover .vjs-progress-holder {
.video-js .vjs-progress-control:hover .vjs-progress-holder,
.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-progress-holder {
font-size: 1.666666666666666666em;
}

Expand Down Expand Up @@ -143,7 +144,8 @@
}

.video-js .vjs-progress-control:hover .vjs-time-tooltip,
.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip {
.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip,
.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-time-tooltip {
display: block;

// Ensure that we maintain a font-size of ~10px.
Expand Down Expand Up @@ -172,6 +174,10 @@
display: block;
}

.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-mouse-display {
display: block;
}

.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display {
visibility: hidden;
opacity: 0;
Expand Down
4 changes: 2 additions & 2 deletions src/js/control-bar/progress-control/progress-control.js
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ class ProgressControl extends Component {
}

this.off(['mousedown', 'touchstart'], this.handleMouseDownHandler_);
this.off(this.el_, 'mousemove', this.handleMouseMove);
this.off(this.el_, ['mousemove', 'touchmove'], this.handleMouseMove);

this.removeListenersAddedOnMousedownAndTouchstart();

Expand Down Expand Up @@ -172,7 +172,7 @@ class ProgressControl extends Component {
}

this.on(['mousedown', 'touchstart'], this.handleMouseDownHandler_);
this.on(this.el_, 'mousemove', this.handleMouseMove);
this.on(this.el_, ['mousemove', 'touchmove'], this.handleMouseMove);
this.removeClass('disabled');

this.enabled_ = true;
Expand Down
47 changes: 39 additions & 8 deletions src/js/control-bar/progress-control/seek-bar.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import * as Dom from '../../utils/dom.js';
import * as Fn from '../../utils/fn.js';
import {formatTime} from '../../utils/time.js';
import {silencePromise} from '../../utils/promise';
import {merge} from '../../utils/obj';
import document from 'global/document';

/** @import Player from '../../player' */
Expand Down Expand Up @@ -40,7 +41,20 @@ class SeekBar extends Slider {
* The key/value store of player options.
*/
constructor(player, options) {
options = merge(SeekBar.prototype.options_, options);

const shouldDisableSeekWhileScrubbingOnMobile = options.playerOptions.disableSeekWhileScrubbingOnMobile && (IS_IOS || IS_ANDROID);

// Add the TimeTooltip as a child if we are on desktop, or on mobile with `disableSeekWhileScrubbingOnMobile: true`
if ((!IS_IOS && !IS_ANDROID) || shouldDisableSeekWhileScrubbingOnMobile) {
options.children.splice(1, 0, 'mouseTimeDisplay');
}

super(player, options);

this.shouldDisableSeekWhileScrubbingOnMobile_ = shouldDisableSeekWhileScrubbingOnMobile;
this.pendingSeekTime_ = null;

this.setEventHandlers_();
}

Expand Down Expand Up @@ -225,6 +239,12 @@ class SeekBar extends Slider {
* The percentage of media played so far (0 to 1).
*/
getPercent() {
// If we have a pending seek time, we are scrubbing on mobile and should set the slider percent
// to reflect where the user is scrubbing.
if (this.pendingSeekTime_) {
return this.pendingSeekTime_ / this.player_.duration();
}

const currentTime = this.getCurrentTime_();
let percent;
const liveTracker = this.player_.liveTracker;
Expand Down Expand Up @@ -260,7 +280,12 @@ class SeekBar extends Slider {
event.stopPropagation();

this.videoWasPlaying = !this.player_.paused();
this.player_.pause();

// Don't pause if we are on mobile and `disableSeekWhileScrubbingOnMobile: true`.
// In that case, playback should continue while the player scrubs to a new location.
if (!this.shouldDisableSeekWhileScrubbingOnMobile_) {
this.player_.pause();
}

super.handleMouseDown(event);
}
Expand Down Expand Up @@ -324,8 +349,12 @@ class SeekBar extends Slider {
}
}

// Set new time (tell player to seek to new time)
this.userSeek_(newTime);
// if on mobile and `disableSeekWhileScrubbingOnMobile: true`, keep track of the desired seek point but we won't initiate the seek until 'touchend'
if (this.shouldDisableSeekWhileScrubbingOnMobile_) {
this.pendingSeekTime_ = newTime;
} else {
this.userSeek_(newTime);
}

if (this.player_.options_.enableSmoothSeeking) {
this.update();
Expand Down Expand Up @@ -371,6 +400,13 @@ class SeekBar extends Slider {
}
this.player_.scrubbing(false);

// If we have a pending seek time, then we have finished scrubbing on mobile and should initiate a seek.
if (this.pendingSeekTime_) {
this.userSeek_(this.pendingSeekTime_);

this.pendingSeekTime_ = null;
}

/**
* Trigger timeupdate because we're done seeking and the time has changed.
* This is particularly useful for if the player is paused to time the time displays.
Expand Down Expand Up @@ -513,10 +549,5 @@ SeekBar.prototype.options_ = {
barName: 'playProgressBar'
};

// MouseTimeDisplay tooltips should not be added to a player on mobile devices
if (!IS_IOS && !IS_ANDROID) {
SeekBar.prototype.options_.children.splice(1, 0, 'mouseTimeDisplay');
}

Component.registerComponent('SeekBar', SeekBar);
export default SeekBar;
3 changes: 2 additions & 1 deletion src/js/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -5567,7 +5567,8 @@ Player.prototype.options_ = {
horizontalSeek: false
},
// Default smooth seeking to false
enableSmoothSeeking: false
enableSmoothSeeking: false,
disableSeekWhileScrubbingOnMobile: false
};

TECH_EVENTS_RETRIGGER.forEach(function(event) {
Expand Down

0 comments on commit 7c84f7a

Please sign in to comment.