mirror of
https://github.com/videojs/video.js.git
synced 2024-12-23 02:04:34 +02:00
b7116be725
* fix: replay button broken for native playback * remove debug logging * move fix to player * comment * add unit test * add native browser stubs * reset stubs and test currentTime
140 lines
4.4 KiB
JavaScript
140 lines
4.4 KiB
JavaScript
/* eslint-env qunit */
|
|
import sinon from 'sinon';
|
|
import {silencePromise} from '../../src/js/utils/promise';
|
|
import TestHelpers from './test-helpers';
|
|
import * as browser from '../../src/js/utils/browser.js';
|
|
|
|
QUnit.module('Player#play', {
|
|
|
|
beforeEach() {
|
|
this.clock = sinon.useFakeTimers();
|
|
this.player = TestHelpers.makePlayer({});
|
|
this.techPlayCallCount = 0;
|
|
this.techCurrentTimeCallCount = 0;
|
|
this.initTime = 0;
|
|
this.player.tech_.play = () => {
|
|
this.techPlayCallCount++;
|
|
};
|
|
this.player.tech_.setCurrentTime = (seconds) => {
|
|
this.techCurrentTimeCallCount++;
|
|
this.initTime = seconds;
|
|
};
|
|
},
|
|
|
|
afterEach() {
|
|
this.player.dispose();
|
|
this.clock.restore();
|
|
}
|
|
});
|
|
|
|
QUnit.test('tech not ready + no source = wait for ready, then loadstart', function(assert) {
|
|
|
|
// Mock the player/tech not being ready.
|
|
this.player.isReady_ = false;
|
|
|
|
// Attempt to play.
|
|
this.player.play();
|
|
this.clock.tick(100);
|
|
assert.strictEqual(this.techPlayCallCount, 0, 'tech_.play was not called because the tech was not ready');
|
|
|
|
// Ready the player.
|
|
this.player.triggerReady();
|
|
this.clock.tick(100);
|
|
assert.strictEqual(this.techPlayCallCount, 0, 'tech_.play was not called because there was no source');
|
|
|
|
// Add a source and trigger loadstart.
|
|
this.player.src('xyz.mp4');
|
|
this.clock.tick(100);
|
|
this.player.trigger('loadstart');
|
|
assert.strictEqual(this.techPlayCallCount, 1, 'tech_.play was called');
|
|
});
|
|
|
|
QUnit.test('tech not ready + has source = wait for ready', function(assert) {
|
|
|
|
// Mock the player/tech not being ready, but having a source.
|
|
this.player.isReady_ = false;
|
|
this.player.src('xyz.mp4');
|
|
this.clock.tick(100);
|
|
|
|
// Attempt to play.
|
|
this.player.play();
|
|
this.clock.tick(100);
|
|
assert.strictEqual(this.techPlayCallCount, 0, 'tech_.play was not called because the tech was not ready');
|
|
|
|
// Ready the player.
|
|
this.player.triggerReady();
|
|
this.clock.tick(100);
|
|
assert.strictEqual(this.techPlayCallCount, 1, 'tech_.play was called');
|
|
});
|
|
|
|
QUnit.test('tech ready + no source = wait for loadstart', function(assert) {
|
|
|
|
// Attempt to play.
|
|
this.player.play();
|
|
this.clock.tick(100);
|
|
assert.strictEqual(this.techPlayCallCount, 0, 'tech_.play was not called because the tech was not ready');
|
|
|
|
// Add a source and trigger loadstart.
|
|
this.player.src('xyz.mp4');
|
|
this.clock.tick(100);
|
|
this.player.trigger('loadstart');
|
|
assert.strictEqual(this.techPlayCallCount, 1, 'tech_.play was called');
|
|
});
|
|
|
|
QUnit.test('tech ready + has source = play immediately!', function(assert) {
|
|
|
|
// Mock the player having a source.
|
|
this.player.src('xyz.mp4');
|
|
this.clock.tick(100);
|
|
|
|
// Attempt to play, but silence the promise that might be returned.
|
|
silencePromise(this.player.play());
|
|
assert.strictEqual(this.techPlayCallCount, 1, 'tech_.play was called');
|
|
});
|
|
|
|
QUnit.test('tech ready + has source + changing source = wait for loadstart', function(assert) {
|
|
|
|
// Mock the player having a source and in the process of changing its source.
|
|
this.player.src('xyz.mp4');
|
|
this.clock.tick(100);
|
|
this.player.src('abc.mp4');
|
|
this.player.play();
|
|
this.clock.tick(100);
|
|
assert.strictEqual(this.techPlayCallCount, 0, 'tech_.play was not called because the source was changing');
|
|
|
|
this.player.trigger('loadstart');
|
|
assert.strictEqual(this.techPlayCallCount, 1, 'tech_.play was called');
|
|
});
|
|
|
|
QUnit.test('play call from native replay calls resetProgressBar_', function(assert) {
|
|
const origSafari = browser.IS_ANY_SAFARI;
|
|
const origIOS = browser.IS_IOS;
|
|
|
|
browser.stub_IS_ANY_SAFARI(true);
|
|
|
|
// Mock the player having a source.
|
|
this.player.src('xyz.mp4');
|
|
this.clock.tick(100);
|
|
|
|
// Attempt to play, but silence the promise that might be returned.
|
|
silencePromise(this.player.play());
|
|
assert.strictEqual(this.techPlayCallCount, 1, 'tech_.play was called');
|
|
|
|
// add vjs-ended for replay logic and play again.
|
|
this.player.addClass('vjs-ended');
|
|
|
|
silencePromise(this.player.play());
|
|
assert.strictEqual(this.techPlayCallCount, 2, 'tech_.play was called');
|
|
assert.strictEqual(this.techCurrentTimeCallCount, 1, 'tech_.currentTime was called');
|
|
|
|
// Reset safari stub and try replay in iOS.
|
|
browser.stub_IS_ANY_SAFARI(origSafari);
|
|
browser.stub_IS_IOS(true);
|
|
|
|
silencePromise(this.player.play());
|
|
assert.strictEqual(this.techPlayCallCount, 3, 'tech_.play was called');
|
|
assert.strictEqual(this.techCurrentTimeCallCount, 2, 'tech_.currentTime was called');
|
|
|
|
browser.stub_IS_IOS(origIOS);
|
|
});
|