Skip to content

Commit 175f773

Browse files
reecksetgkatsev
authored andcommitted
feat: reset player ui on Player#reset (videojs#5684)
Fixes videojs#4683
1 parent dd63cf9 commit 175f773

File tree

4 files changed

+94
-1
lines changed

4 files changed

+94
-1
lines changed

src/js/control-bar/time-controls/remaining-time-display.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class RemainingTimeDisplay extends TimeDisplay {
6060
* @listens Player#durationchange
6161
*/
6262
updateContent(event) {
63-
if (!this.player_.duration()) {
63+
if (typeof this.player_.duration() !== 'number') {
6464
return;
6565
}
6666

src/js/player.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2996,11 +2996,47 @@ class Player extends Component {
29962996
this.poster('');
29972997
this.loadTech_(this.options_.techOrder[0], null);
29982998
this.techCall_('reset');
2999+
this.resetControlBarUI_();
29993000
if (isEvented(this)) {
30003001
this.trigger('playerreset');
30013002
}
30023003
}
30033004

3005+
/**
3006+
* Reset Control Bar's UI by calling sub-methods that reset
3007+
* all of Control Bar's components
3008+
*/
3009+
resetControlBarUI_() {
3010+
this.resetProgressBar_();
3011+
this.resetPlaybackRate_();
3012+
this.resetVolumeBar_();
3013+
}
3014+
3015+
/**
3016+
* Reset tech's progress so progress bar is reset in the UI
3017+
*/
3018+
resetProgressBar_() {
3019+
this.currentTime(0);
3020+
this.controlBar.durationDisplay.updateContent();
3021+
this.controlBar.remainingTimeDisplay.updateContent();
3022+
}
3023+
3024+
/**
3025+
* Reset Playback ratio
3026+
*/
3027+
resetPlaybackRate_() {
3028+
this.playbackRate(this.defaultPlaybackRate());
3029+
this.handleTechRateChange_();
3030+
}
3031+
3032+
/**
3033+
* Reset Volume bar
3034+
*/
3035+
resetVolumeBar_() {
3036+
this.volume(1.0);
3037+
this.trigger('volumechange');
3038+
}
3039+
30043040
/**
30053041
* Returns all of the current source objects.
30063042
*

test/unit/player.test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,6 +1444,7 @@ QUnit.test('player#reset loads the Html5 tech and then techCalls reset', functio
14441444
techCall_(method) {
14451445
techCallMethod = method;
14461446
},
1447+
resetControlBarUI_() {},
14471448
poster() {}
14481449
};
14491450

@@ -1471,6 +1472,7 @@ QUnit.test('player#reset loads the first item in the techOrder and then techCall
14711472
techCall_(method) {
14721473
techCallMethod = method;
14731474
},
1475+
resetControlBarUI_() {},
14741476
poster() {}
14751477
};
14761478

test/unit/reset-ui.test.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/* eslint-env qunit */
2+
import TestHelpers from './test-helpers.js';
3+
QUnit.module('player reset-ui');
4+
5+
QUnit.test('Calling resetProgressBar player method should place progress bar at 0% width', function(assert) {
6+
const player = TestHelpers.makePlayer();
7+
8+
player.currentTime(20);
9+
player.trigger('timeupdate');
10+
player.resetProgressBar_();
11+
assert.equal(
12+
player.controlBar.progressControl.seekBar.playProgressBar.el().offsetWidth, 0,
13+
'progress bar is reset to width 0%'
14+
);
15+
assert.equal(
16+
player.currentTime(), 0,
17+
'player current time is 0'
18+
);
19+
player.dispose();
20+
});
21+
22+
QUnit.test('Calling resetPlaybackRate player method should place play rate at 1x', function(assert) {
23+
const player = TestHelpers.makePlayer({techOrder: ['html5']});
24+
25+
player.playbackRate(2);
26+
player.handleTechRateChange_();
27+
player.resetPlaybackRate_();
28+
const defaultRate = player.defaultPlaybackRate();
29+
30+
assert.equal(
31+
player.controlBar.playbackRateMenuButton.labelEl_.textContent, defaultRate + 'x',
32+
'Playback rate is the default one on the UI'
33+
);
34+
assert.equal(
35+
player.playbackRate(), defaultRate,
36+
'Playback rate is the default one on the player object'
37+
);
38+
player.dispose();
39+
});
40+
41+
QUnit.test('Calling resetVolumeBar player method should reset volume bar', function(assert) {
42+
const player = TestHelpers.makePlayer({ techOrder: ['html5'] });
43+
44+
player.volume(0.5);
45+
46+
player.trigger('volumechange');
47+
48+
assert.equal(player.controlBar.volumePanel.volumeControl.volumeBar.el_.getAttribute('aria-valuenow'), 50, 'UI value of VolumeBar is 50');
49+
50+
player.resetVolumeBar_();
51+
52+
assert.equal(player.controlBar.volumePanel.volumeControl.volumeBar.el_.getAttribute('aria-valuenow'), 100, 'UI value of VolumeBar is 100');
53+
54+
player.dispose();
55+
});

0 commit comments

Comments
 (0)