Skip to content

Commit 13b42ad

Browse files
brandonocaseygkatsev
authored andcommitted
test: verify null-checks with player and control bar children set to false (videojs#5670)
1 parent 70a71ae commit 13b42ad

File tree

8 files changed

+211
-233
lines changed

8 files changed

+211
-233
lines changed

package-lock.json

Lines changed: 120 additions & 219 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/js/control-bar/progress-control/load-progress-bar.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class LoadProgressBar extends Component {
5656
update(event) {
5757
const liveTracker = this.player_.liveTracker;
5858
const buffered = this.player_.buffered();
59-
const duration = liveTracker.isLive() ? liveTracker.seekableEnd() : this.player_.duration();
59+
const duration = (liveTracker && liveTracker.isLive()) ? liveTracker.seekableEnd() : this.player_.duration();
6060
const bufferedEnd = this.player_.bufferedEnd();
6161
const children = this.partEls_;
6262
const controlTextPercentage = this.$('.vjs-control-text-loaded-percentage');

src/js/control-bar/progress-control/seek-bar.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ class SeekBar extends Slider {
5252
this.on(this.player_, 'timeupdate', this.update);
5353
this.on(this.player_, 'ended', this.handleEnded);
5454
this.on(this.player_, 'durationchange', this.update);
55-
this.on(this.player_.liveTracker, 'liveedgechange', this.update);
55+
if (this.player_.liveTracker) {
56+
this.on(this.player_.liveTracker, 'liveedgechange', this.update);
57+
}
5658

5759
// when playing, let's ensure we smoothly update the play progress bar
5860
// via an interval
@@ -69,7 +71,7 @@ class SeekBar extends Slider {
6971
});
7072

7173
this.on(this.player_, ['ended', 'pause', 'waiting'], (e) => {
72-
if (this.player_.liveTracker.isLive() && e.type !== 'ended') {
74+
if (this.player_.liveTracker && this.player_.liveTracker.isLive() && e.type !== 'ended') {
7375
return;
7476
}
7577

@@ -109,11 +111,11 @@ class SeekBar extends Slider {
109111
const liveTracker = this.player_.liveTracker;
110112
let duration = this.player_.duration();
111113

112-
if (liveTracker.isLive()) {
114+
if (liveTracker && liveTracker.isLive()) {
113115
duration = this.player_.liveTracker.liveCurrentTime();
114116
}
115117

116-
if (liveTracker.seekableEnd() === Infinity) {
118+
if (liveTracker && liveTracker.seekableEnd() === Infinity) {
117119
this.disable();
118120
} else {
119121
this.enable();
@@ -194,7 +196,7 @@ class SeekBar extends Slider {
194196
let percent;
195197
const liveTracker = this.player_.liveTracker;
196198

197-
if (liveTracker.isLive()) {
199+
if (liveTracker && liveTracker.isLive()) {
198200
percent = (currentTime - liveTracker.seekableStart()) / liveTracker.liveWindow();
199201

200202
// prevent the percent from changing at the live edge
@@ -247,7 +249,7 @@ class SeekBar extends Slider {
247249
const distance = this.calculateDistance(event);
248250
const liveTracker = this.player_.liveTracker;
249251

250-
if (!liveTracker.isLive()) {
252+
if (!liveTracker || !liveTracker.isLive()) {
251253
newTime = distance * this.player_.duration();
252254

253255
// Don't let video end while scrubbing.

src/js/control-bar/progress-control/time-tooltip.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class TimeTooltip extends Component {
112112
let content;
113113
const duration = this.player_.duration();
114114

115-
if (this.player_.liveTracker.isLive()) {
115+
if (this.player_.liveTracker && this.player_.liveTracker.isLive()) {
116116
const liveWindow = this.player_.liveTracker.liveWindow();
117117
const secondsBehind = liveWindow - (seekBarPoint * liveWindow);
118118

src/js/control-bar/seek-to-live.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ class SeekToLive extends Button {
2525
super(player, options);
2626

2727
this.updateLiveEdgeStatus();
28-
this.on(this.player_.liveTracker, 'liveedgechange', this.updateLiveEdgeStatus);
28+
29+
if (this.player_.liveTracker) {
30+
this.on(this.player_.liveTracker, 'liveedgechange', this.updateLiveEdgeStatus);
31+
}
2932
}
3033

3134
/**
@@ -60,10 +63,11 @@ class SeekToLive extends Button {
6063
* or not
6164
*/
6265
updateLiveEdgeStatus(e) {
63-
if (this.player_.liveTracker.behindLiveEdge()) {
64-
this.removeClass('vjs-at-live-edge');
65-
} else {
66+
// default to live edge
67+
if (!this.player_.liveTracker || this.player_.liveTracker.atLiveEdge()) {
6668
this.addClass('vjs-at-live-edge');
69+
} else {
70+
this.removeClass('vjs-at-live-edge');
6771
}
6872
}
6973

@@ -80,7 +84,9 @@ class SeekToLive extends Button {
8084
* Dispose of the element and stop tracking
8185
*/
8286
dispose() {
83-
this.off(this.player_.liveTracker, 'liveedgechange', this.updateLiveEdgeStatus);
87+
if (this.player_.liveTracker) {
88+
this.off(this.player_.liveTracker, 'liveedgechange', this.updateLiveEdgeStatus);
89+
}
8490
this.contentEl_ = null;
8591
this.circleEl_ = null;
8692

src/js/player.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2289,7 +2289,7 @@ class Player extends Component {
22892289

22902290
if (seconds === Infinity) {
22912291
this.addClass('vjs-live');
2292-
if (this.options_.liveui) {
2292+
if (this.options_.liveui && this.player_.liveTracker) {
22932293
this.addClass('vjs-liveui');
22942294
}
22952295
} else {

test/unit/controls.test.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import PlayToggle from '../../src/js/control-bar/play-toggle.js';
66
import PlaybackRateMenuButton from '../../src/js/control-bar/playback-rate-menu/playback-rate-menu-button.js';
77
import Slider from '../../src/js/slider/slider.js';
88
import FullscreenToggle from '../../src/js/control-bar/fullscreen-toggle.js';
9+
import ControlBar from '../../src/js/control-bar/control-bar.js';
910
import TestHelpers from './test-helpers.js';
1011
import document from 'global/document';
1112
import sinon from 'sinon';
@@ -256,3 +257,36 @@ QUnit.test('Muting with MuteToggle should set ARIA value of VolumeBar to 0', fun
256257

257258
player.dispose();
258259
});
260+
261+
QUnit.test('controlbar children to false individually, does not cause an assertion', function(assert) {
262+
const defaultChildren = ControlBar.prototype.options_.children;
263+
264+
defaultChildren.forEach((childName) => {
265+
const options = {controlBar: {}};
266+
267+
options.controlBar[childName] = false;
268+
269+
const player = TestHelpers.makePlayer(options);
270+
271+
this.clock.tick(1000);
272+
player.triggerReady();
273+
player.dispose();
274+
assert.ok(true, `${childName}: false. did not cause an assertion`);
275+
});
276+
});
277+
278+
QUnit.test('all controlbar children to false, does not cause an assertion', function(assert) {
279+
const defaultChildren = ControlBar.prototype.options_.children;
280+
const options = {controlBar: {}};
281+
282+
defaultChildren.forEach((childName) => {
283+
options.controlBar[childName] = false;
284+
});
285+
286+
const player = TestHelpers.makePlayer(options);
287+
288+
this.clock.tick(1000);
289+
player.triggerReady();
290+
player.dispose();
291+
assert.ok(true, 'did not cause an assertion');
292+
});

test/unit/player.test.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1991,3 +1991,38 @@ QUnit.test('source options are retained', function(assert) {
19911991

19921992
assert.equal(player.currentSource().sourceOption, 'someOption', 'source option retained');
19931993
});
1994+
1995+
QUnit.test('setting children to false individually, does not cause an assertion', function(assert) {
1996+
const defaultChildren = Player.prototype.options_.children;
1997+
1998+
defaultChildren.forEach((childName) => {
1999+
const options = {};
2000+
2001+
options[childName] = false;
2002+
2003+
const player = TestHelpers.makePlayer(options);
2004+
2005+
this.clock.tick(1000);
2006+
2007+
player.triggerReady();
2008+
player.dispose();
2009+
assert.ok(true, `${childName}: false. did not cause an assertion`);
2010+
});
2011+
});
2012+
2013+
QUnit.test('setting all children to false, does not cause an assertion', function(assert) {
2014+
const defaultChildren = Player.prototype.options_.children;
2015+
const options = {};
2016+
2017+
defaultChildren.forEach((childName) => {
2018+
options[childName] = false;
2019+
});
2020+
2021+
const player = TestHelpers.makePlayer(options);
2022+
2023+
this.clock.tick(1000);
2024+
player.triggerReady();
2025+
2026+
player.dispose();
2027+
assert.ok(true, 'did not cause an assertion');
2028+
});

0 commit comments

Comments
 (0)