Skip to content

Commit 50fe5f6

Browse files
fix: Fix playback rate iteration if rates are not in the ascending order (videojs#7618)
1 parent f16d73b commit 50fe5f6

File tree

2 files changed

+56
-10
lines changed

2 files changed

+56
-10
lines changed

src/js/control-bar/playback-rate-menu/playback-rate-menu-button.js

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -115,17 +115,11 @@ class PlaybackRateMenuButton extends MenuButton {
115115
// select next rate option
116116
const currentRate = this.player().playbackRate();
117117
const rates = this.playbackRates();
118+
const currentIndex = rates.indexOf(currentRate);
119+
// this get the next rate and it will select first one if the last one currently selected
120+
const newIndex = (currentIndex + 1) % rates.length;
118121

119-
// this will select first one if the last one currently selected
120-
let newRate = rates[0];
121-
122-
for (let i = 0; i < rates.length; i++) {
123-
if (rates[i] > currentRate) {
124-
newRate = rates[i];
125-
break;
126-
}
127-
}
128-
this.player().playbackRate(newRate);
122+
this.player().playbackRate(rates[newIndex]);
129123
}
130124

131125
/**
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/* eslint-env qunit */
2+
import PlaybackRateMenuButton from '../../../../src/js/control-bar/playback-rate-menu/playback-rate-menu-button';
3+
import TestHelpers from '../../test-helpers.js';
4+
import * as Events from '../../../../src/js/utils/events.js';
5+
6+
QUnit.module('PlaybackRateMenuButton', {
7+
beforeEach(assert) {
8+
this.player = TestHelpers.makePlayer({
9+
playbackRates: [1, 2, 3]
10+
});
11+
},
12+
afterEach(assert) {
13+
this.player.dispose();
14+
}
15+
});
16+
17+
QUnit.test('playback rate default value', function(assert) {
18+
const currentRate = this.player.playbackRate();
19+
20+
assert.strictEqual(currentRate, 1, 'Playbackrate begins with value 1"');
21+
});
22+
23+
QUnit.test('clicking should move to the next available rate', function(assert) {
24+
const playbackRateMenu = new PlaybackRateMenuButton(this.player);
25+
26+
const el = playbackRateMenu.menuButton_.el();
27+
28+
Events.trigger(el, 'click');
29+
30+
const currentRate = this.player.playbackRate();
31+
32+
assert.strictEqual(currentRate, 2, 'Playbackrate changes to value 2"');
33+
});
34+
35+
QUnit.test('keep clicking should move to all possible rates in loop', function(assert) {
36+
const playbackRateMenu = new PlaybackRateMenuButton(this.player);
37+
38+
const el = playbackRateMenu.menuButton_.el();
39+
40+
Events.trigger(el, 'click');
41+
let currentRate = this.player.playbackRate();
42+
43+
assert.strictEqual(currentRate, 2, 'Playbackrate changes to value 2"');
44+
45+
Events.trigger(el, 'click');
46+
currentRate = this.player.playbackRate();
47+
assert.strictEqual(currentRate, 3, 'Playbackrate changes to value 3"');
48+
49+
Events.trigger(el, 'click');
50+
currentRate = this.player.playbackRate();
51+
assert.strictEqual(currentRate, 1, 'Playbackrate changes back to value 1"');
52+
});

0 commit comments

Comments
 (0)