mirror of
https://github.com/videojs/video.js.git
synced 2024-12-25 02:42:10 +02:00
a8ff970d4a
Broke out bind, guid, and element data functions from Lib Separated out more dom functions in to dom.js Broke out URL functions into url.js Removed setLocalStorage since it wasn't being used Moved browser tests out of lib Moved log functions into their own file Removed trim() since it wasn't being used Moved formatTime into its own file Moved round into its own file and renamed roundFloat() Moved capitalize into its own file and renamed as toTitleCase() Moved createTimeRange into its own file Removed Lib.arr.forEach infavor of the native forEach Removed Lib.obj.create in favor of native Object.create (ES6-sham) Removed obj.each in favor of native Object.getOwnPropertyNames().forEach() Removed obj.merge and copy. Using lodash.assign instead. Replaced Lib.obj.isPlain with lodash.isPlainObject Removed Lib.obj.isArray in favor of the native Array.isArray Also removed the lib.js tests file as all tests have been moved or removed. Removed Lib.isEmpty in favor of !Object.getOwnPropertyNames().length Switched Util.mergeOptions and deepMerge to use new mergeOptions() Moved Lib.TEST_VID to Html5.TEST_VID Removed Lib references everywhere. Woo! Attempting to fix sourcemap test errors by setting grunt-browserify version Switched to object.assign from lodash.assign Removed unused 'inherits' dependency Reorganzied test files and added '.test' to file names Combined js/core.js and js/video.js Moved events.js into the utils directory
281 lines
11 KiB
JavaScript
281 lines
11 KiB
JavaScript
/**
|
|
* These tests run on the minified, window.videojs and ensure the needed
|
|
* APIs still exist
|
|
*/
|
|
|
|
(function(){
|
|
|
|
q.module('Player API');
|
|
|
|
test('videojs should exist on the window', function() {
|
|
ok(window.videojs, 'videojs exists on the window');
|
|
});
|
|
|
|
test('should be able to access expected player API methods', function() {
|
|
var player = videojs.getComponent('Player').prototype;
|
|
|
|
// Native HTML5 Methods
|
|
ok(player.error, 'error exists');
|
|
ok(player.src, 'src exists');
|
|
ok(player.currentSrc, 'currentSrc exists');
|
|
ok(player.buffered, 'buffered exists');
|
|
ok(player.load, 'load exists');
|
|
ok(player.seeking, 'seeking exists');
|
|
ok(player.currentTime, 'currentTime exists');
|
|
ok(player.duration, 'duration exists');
|
|
ok(player.paused, 'paused exists');
|
|
ok(player.ended, 'ended exists');
|
|
ok(player.autoplay, 'autoplay exists');
|
|
ok(player.loop, 'loop exists');
|
|
ok(player.play , 'play exists');
|
|
ok(player.pause , 'pause exists');
|
|
ok(player.controls, 'controls exists');
|
|
ok(player.volume, 'volume exists');
|
|
ok(player.muted, 'muted exists');
|
|
ok(player.width, 'width exists');
|
|
ok(player.height, 'height exists');
|
|
ok(player.poster, 'poster exists');
|
|
ok(player.textTracks, 'textTracks exists');
|
|
ok(player.requestFullscreen, 'requestFullscreen exists');
|
|
ok(player.exitFullscreen, 'exitFullscreen exists');
|
|
ok(player.playbackRate, 'playbackRate exists');
|
|
ok(player.networkState, 'networkState exists');
|
|
ok(player.readyState, 'readyState exists');
|
|
|
|
// Unsupported Native HTML5 Methods
|
|
// ok(player.canPlayType, 'canPlayType exists');
|
|
// ok(player.startTime, 'startTime exists');
|
|
// ok(player.defaultPlaybackRate, 'defaultPlaybackRate exists');
|
|
// ok(player.playbackRate, 'playbackRate exists');
|
|
// ok(player.played, 'played exists');
|
|
// ok(player.seekable, 'seekable exists');
|
|
// ok(player.videoWidth, 'videoWidth exists');
|
|
// ok(player.videoHeight, 'videoHeight exists');
|
|
|
|
// Additional player methods
|
|
ok(player.bufferedPercent, 'bufferedPercent exists');
|
|
ok(player.reportUserActivity, 'reportUserActivity exists');
|
|
ok(player.userActive, 'userActive exists');
|
|
ok(player.usingNativeControls, 'usingNativeControls exists');
|
|
ok(player.isFullscreen, 'isFullscreen exists');
|
|
|
|
// TextTrack methods
|
|
ok(player.textTracks, 'textTracks exists');
|
|
ok(player.remoteTextTracks, 'remoteTextTracks exists');
|
|
ok(player.addTextTrack, 'addTextTrack exists');
|
|
ok(player.addRemoteTextTrack, 'addRemoteTextTrack exists');
|
|
ok(player.removeRemoteTextTrack, 'removeRemoteTextTrack exists');
|
|
|
|
// Deprecated methods that should still exist
|
|
ok(player.requestFullScreen, 'requestFullScreen exists');
|
|
ok(player.isFullScreen, 'isFullScreen exists');
|
|
ok(player.cancelFullScreen, 'cancelFullScreen exists');
|
|
});
|
|
|
|
test('should be able to access expected component API methods', function() {
|
|
var Component = videojs.getComponent('Component');
|
|
var comp = new Component({ id: function(){ return 1; }, reportUserActivity: function(){} });
|
|
|
|
// Component methods
|
|
ok(comp.player, 'player exists');
|
|
ok(comp.options, 'options exists');
|
|
ok(comp.init, 'init exists');
|
|
ok(comp.dispose, 'dispose exists');
|
|
ok(comp.createEl, 'createEl exists');
|
|
ok(comp.contentEl, 'contentEl exists');
|
|
ok(comp.el, 'el exists');
|
|
ok(comp.addChild, 'addChild exists');
|
|
ok(comp.getChild, 'getChild exists');
|
|
ok(comp.getChildById, 'getChildById exists');
|
|
ok(comp.children, 'children exists');
|
|
ok(comp.initChildren, 'initChildren exists');
|
|
ok(comp.removeChild, 'removeChild exists');
|
|
ok(comp.on, 'on exists');
|
|
ok(comp.off, 'off exists');
|
|
ok(comp.one, 'one exists');
|
|
ok(comp.trigger, 'trigger exists');
|
|
ok(comp.triggerReady, 'triggerReady exists');
|
|
ok(comp.show, 'show exists');
|
|
ok(comp.hide, 'hide exists');
|
|
ok(comp.width, 'width exists');
|
|
ok(comp.height, 'height exists');
|
|
ok(comp.dimensions, 'dimensions exists');
|
|
ok(comp.ready, 'ready exists');
|
|
ok(comp.addClass, 'addClass exists');
|
|
ok(comp.removeClass, 'removeClass exists');
|
|
ok(comp.buildCSSClass, 'buildCSSClass exists');
|
|
ok(comp.setInterval, 'setInterval exists');
|
|
ok(comp.clearInterval, 'clearInterval exists');
|
|
ok(comp.setTimeout, 'setTimeout exists');
|
|
ok(comp.clearTimeout, 'clearTimeout exists');
|
|
});
|
|
|
|
test('should be able to access expected MediaTech API methods', function() {
|
|
var media = videojs.getComponent('Tech');
|
|
var mediaProto = media.prototype;
|
|
var html5 = videojs.getComponent('Html5');
|
|
var html5Proto = html5.prototype;
|
|
var flash = videojs.getComponent('Flash');
|
|
var flashProto = flash.prototype;
|
|
|
|
ok(mediaProto.setPoster, 'setPoster should exist on the Media tech');
|
|
ok(html5Proto.setPoster, 'setPoster should exist on the HTML5 tech');
|
|
ok(flashProto.setPoster, 'setPoster should exist on the Flash tech');
|
|
|
|
ok(html5.patchCanPlayType, 'patchCanPlayType should exist for HTML5');
|
|
ok(html5.unpatchCanPlayType, 'unpatchCanPlayType should exist for HTML5');
|
|
|
|
// Source Handler Functions
|
|
ok(media.withSourceHandlers, 'withSourceHandlers should exist for Media Tech');
|
|
|
|
ok(html5.canPlaySource, 'canPlaySource should exist for HTML5');
|
|
ok(html5.registerSourceHandler, 'registerSourceHandler should exist for Html5');
|
|
ok(html5.selectSourceHandler, 'selectSourceHandler should exist for Html5');
|
|
ok(html5.prototype.setSource, 'setSource should exist for Html5');
|
|
ok(html5.prototype.disposeSourceHandler, 'disposeSourceHandler should exist for Html5');
|
|
|
|
ok(flash.canPlaySource, 'canPlaySource should exist for Flash');
|
|
ok(flash.registerSourceHandler, 'registerSourceHandler should exist for Flash');
|
|
ok(flash.selectSourceHandler, 'selectSourceHandler should exist for Flash');
|
|
ok(flash.prototype.setSource, 'setSource should exist for Flash');
|
|
ok(flash.prototype.disposeSourceHandler, 'disposeSourceHandler should exist for Flash');
|
|
});
|
|
|
|
test('should export ready api call to public', function() {
|
|
var videoTag = testHelperMakeTag();
|
|
|
|
var fixture = document.getElementById('qunit-fixture');
|
|
fixture.appendChild(videoTag);
|
|
|
|
var player = videojs('example_1');
|
|
ok(player.ready !== undefined, 'ready callback is defined');
|
|
player.dispose();
|
|
});
|
|
|
|
test('should export useful components to the public', function () {
|
|
ok(videojs.TOUCH_ENABLED !== undefined, 'Touch detection should be public');
|
|
ok(videojs.getComponent('ControlBar'), 'ControlBar should be public');
|
|
ok(videojs.getComponent('Button'), 'Button should be public');
|
|
ok(videojs.getComponent('PlayToggle'), 'PlayToggle should be public');
|
|
ok(videojs.getComponent('FullscreenToggle'), 'FullscreenToggle should be public');
|
|
ok(videojs.getComponent('BigPlayButton'), 'BigPlayButton should be public');
|
|
ok(videojs.getComponent('LoadingSpinner'), 'LoadingSpinner should be public');
|
|
ok(videojs.getComponent('CurrentTimeDisplay'), 'CurrentTimeDisplay should be public');
|
|
ok(videojs.getComponent('DurationDisplay'), 'DurationDisplay should be public');
|
|
ok(videojs.getComponent('TimeDivider'), 'TimeDivider should be public');
|
|
ok(videojs.getComponent('RemainingTimeDisplay'), 'RemainingTimeDisplay should be public');
|
|
ok(videojs.getComponent('Slider'), 'Slider should be public');
|
|
ok(videojs.getComponent('ProgressControl'), 'ProgressControl should be public');
|
|
ok(videojs.getComponent('SeekBar'), 'SeekBar should be public');
|
|
ok(videojs.getComponent('LoadProgressBar'), 'LoadProgressBar should be public');
|
|
ok(videojs.getComponent('PlayProgressBar'), 'PlayProgressBar should be public');
|
|
ok(videojs.getComponent('SeekHandle'), 'SeekHandle should be public');
|
|
ok(videojs.getComponent('VolumeControl'), 'VolumeControl should be public');
|
|
ok(videojs.getComponent('VolumeBar'), 'VolumeBar should be public');
|
|
ok(videojs.getComponent('VolumeLevel'), 'VolumeLevel should be public');
|
|
ok(videojs.getComponent('VolumeMenuButton'), 'VolumeMenuButton should be public');
|
|
ok(videojs.getComponent('VolumeHandle'), 'VolumeHandle should be public');
|
|
ok(videojs.getComponent('MuteToggle'), 'MuteToggle should be public');
|
|
ok(videojs.getComponent('PosterImage'), 'PosterImage should be public');
|
|
ok(videojs.getComponent('Menu'), 'Menu should be public');
|
|
ok(videojs.getComponent('MenuItem'), 'MenuItem should be public');
|
|
ok(videojs.getComponent('MenuButton'), 'MenuButton should be public');
|
|
ok(videojs.getComponent('PlaybackRateMenuButton'), 'PlaybackRateMenuButton should be public');
|
|
|
|
ok(videojs.getComponent('CaptionSettingsMenuItem'), 'CaptionSettingsMenuItem should be public');
|
|
ok(videojs.getComponent('OffTextTrackMenuItem'), 'OffTextTrackMenuItem should be public');
|
|
ok(videojs.getComponent('TextTrackMenuItem'), 'TextTrackMenuItem should be public');
|
|
ok(videojs.getComponent('TextTrackDisplay'), 'TextTrackDisplay should be public');
|
|
ok(videojs.getComponent('TextTrackButton'), 'TextTrackButton should be public');
|
|
ok(videojs.getComponent('CaptionsButton'), 'CaptionsButton should be public');
|
|
ok(videojs.getComponent('SubtitlesButton'), 'SubtitlesButton should be public');
|
|
ok(videojs.getComponent('ChaptersButton'), 'ChaptersButton should be public');
|
|
ok(videojs.getComponent('ChaptersTrackMenuItem'), 'ChaptersTrackMenuItem should be public');
|
|
|
|
ok(videojs.mergeOptions, 'mergeOptions should be public');
|
|
});
|
|
|
|
test('should be able to initialize player twice on the same tag using string reference', function() {
|
|
var videoTag = testHelperMakeTag();
|
|
var id = videoTag.id;
|
|
|
|
var fixture = document.getElementById('qunit-fixture');
|
|
fixture.appendChild(videoTag);
|
|
|
|
var player = videojs('example_1');
|
|
player.dispose();
|
|
ok(!document.getElementById(id), 'element is removed');
|
|
|
|
videoTag = testHelperMakeTag();
|
|
fixture.appendChild(videoTag);
|
|
|
|
player = videojs('example_1');
|
|
player.dispose();
|
|
});
|
|
|
|
test('videojs.players should be available after minification', function() {
|
|
var videoTag = testHelperMakeTag();
|
|
var id = videoTag.id;
|
|
|
|
var fixture = document.getElementById('qunit-fixture');
|
|
fixture.appendChild(videoTag);
|
|
|
|
var player = videojs(id);
|
|
ok(videojs.players[id] === player, 'videojs.players is available');
|
|
|
|
player.dispose();
|
|
});
|
|
|
|
test('component can be subclassed externally', function(){
|
|
var Component = videojs.getComponent('Component');
|
|
var ControlBar = videojs.getComponent('ControlBar');
|
|
|
|
var player = new (Component.extend({
|
|
languages: function(){},
|
|
reportUserActivity: function(){},
|
|
language: function(){},
|
|
textTracks: function(){ return {
|
|
addEventListener: Function.prototype,
|
|
removeEventListener: Function.prototype
|
|
};
|
|
}
|
|
}))({
|
|
id: function(){},
|
|
reportUserActivity: function(){}
|
|
});
|
|
|
|
ok(new ControlBar(player), 'created a control bar without throwing');
|
|
});
|
|
|
|
function testHelperMakeTag(){
|
|
var videoTag = document.createElement('video');
|
|
videoTag.id = 'example_1';
|
|
videoTag.className = 'video-js vjs-default-skin';
|
|
return videoTag;
|
|
}
|
|
|
|
test('should extend Component', function(){
|
|
var Component = videojs.getComponent('Component');
|
|
var MyComponent = videojs.extends(Component, {
|
|
constructor: function() {
|
|
this.bar = true;
|
|
},
|
|
foo: function() {
|
|
return true;
|
|
}
|
|
});
|
|
|
|
var myComponent = new MyComponent();
|
|
ok(myComponent instanceof Component, 'creates an instance of Component');
|
|
ok(myComponent instanceof MyComponent, 'creates an instance of MyComponent');
|
|
ok(myComponent.bar, 'the constructor function is used');
|
|
ok(myComponent.foo(), 'instance methods are applied');
|
|
|
|
var NoMethods = videojs.extends(Component);
|
|
var noMethods = new NoMethods({});
|
|
ok(noMethods.on, 'should extend component with no methods or constructor');
|
|
});
|
|
|
|
|
|
})();
|