Skip to content

Commit

Permalink
Close GH-878: Moved player exports to externs.
Browse files Browse the repository at this point in the history
  • Loading branch information
heff committed Dec 10, 2013
1 parent 81e49d4 commit 166cc9c
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 32 deletions.
2 changes: 1 addition & 1 deletion src/js/control-bar/fullscreen-toggle.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ vjs.FullscreenToggle.prototype.buildCSSClass = function(){
};

vjs.FullscreenToggle.prototype.onClick = function(){
if (!this.player_.isFullScreen) {
if (!this.player_.isFullScreen()) {
this.player_.requestFullScreen();
this.el_.children[0].children[0].innerHTML = 'Non-Fullscreen'; // change the button text to "Non-Fullscreen"
} else {
Expand Down
11 changes: 2 additions & 9 deletions src/js/exports.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,15 +59,8 @@ goog.exportProperty(vjs.Component.prototype, 'ready', vjs.Component.prototype.re
goog.exportProperty(vjs.Component.prototype, 'addClass', vjs.Component.prototype.addClass);
goog.exportProperty(vjs.Component.prototype, 'removeClass', vjs.Component.prototype.removeClass);

goog.exportSymbol('videojs.Player', vjs.Player);
goog.exportProperty(vjs.Player.prototype, 'dispose', vjs.Player.prototype.dispose);
goog.exportProperty(vjs.Player.prototype, 'requestFullScreen', vjs.Player.prototype.requestFullScreen);
goog.exportProperty(vjs.Player.prototype, 'cancelFullScreen', vjs.Player.prototype.cancelFullScreen);
goog.exportProperty(vjs.Player.prototype, 'bufferedPercent', vjs.Player.prototype.bufferedPercent);
goog.exportProperty(vjs.Player.prototype, 'textTracks', vjs.Player.prototype.textTracks);
goog.exportProperty(vjs.Player.prototype, 'usingNativeControls', vjs.Player.prototype.usingNativeControls);
goog.exportProperty(vjs.Player.prototype, 'reportUserActivity', vjs.Player.prototype.reportUserActivity);
goog.exportProperty(vjs.Player.prototype, 'userActive', vjs.Player.prototype.userActive);
// Need to export ended to ensure it's not removed by CC, since it's not used internally
goog.exportProperty(vjs.Player.prototype, 'ended', vjs.Player.prototype.ended);

goog.exportSymbol('videojs.MediaLoader', vjs.MediaLoader);
goog.exportSymbol('videojs.TextTrackDisplay', vjs.TextTrackDisplay);
Expand Down
66 changes: 65 additions & 1 deletion src/js/player.externs.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,78 @@
* compiler shouldn't obfuscate.
*/

/**
* @constructor
* @extends {videojs.Component}
*/
videojs.Player = function(){};

/**
* Native HTML5 video properties
* Most likely covered by the default closure compiler externs
* Copied list from http://code.google.com/p/closure-compiler/source/browse/externs/html5.js?spec=svne2e531de906d9ccccf23516bd2dd6152a93f6468&r=e2e531de906d9ccccf23516bd2dd6152a93f6468
* May not all be available on a videojs player yet
*/
videojs.Player.prototype.error = function(){};
videojs.Player.prototype.src = function(){};
videojs.Player.prototype.currentSrc = function(){};
videojs.Player.prototype.networkState = function(){};
videojs.Player.prototype.buffered = function(){};
videojs.Player.prototype.load = function(){};
videojs.Player.prototype.canPlayType = function(){};
videojs.Player.prototype.readyState = function(){};
videojs.Player.prototype.seeking = function(){};
videojs.Player.prototype.currentTime = function(){};
videojs.Player.prototype.startTime = function(){};
videojs.Player.prototype.duration = function(){};
videojs.Player.prototype.paused = function(){};
videojs.Player.prototype.defaultPlaybackRate = function(){};
videojs.Player.prototype.playbackRate = function(){};
videojs.Player.prototype.played = function(){};
videojs.Player.prototype.seekable = function(){};
videojs.Player.prototype.ended = function(){};
videojs.Player.prototype.autoplay = function(){};
videojs.Player.prototype.loop = function(){};
videojs.Player.prototype.play = function() {};
videojs.Player.prototype.pause = function() {};
videojs.Player.prototype.controls = function(){};
videojs.Player.prototype.volume = function(){};
videojs.Player.prototype.muted = function(){};
videojs.Player.prototype.width = function(){};
videojs.Player.prototype.height = function(){};
videojs.Player.prototype.videoWidth = function(){};
videojs.Player.prototype.videoHeight = function(){};
videojs.Player.prototype.poster = function(){};

/**
* Fullscreen functionality
*/
videojs.Player.prototype.isFullScreen = undefined;
videojs.Player.prototype.isFullScreen = function(){};
videojs.Player.prototype.requestFullScreen = function(){};
videojs.Player.prototype.cancelFullScreen = function(){};

/**
* Text tracks
*/
videojs.Player.prototype.textTracks = function(){};

/**
* Component functions
*/
videojs.Player.prototype.dispose = function(){};

/**
* Buffered percent
*/
videojs.Player.prototype.bufferedPercent = function(){};

/**
* User activity functions
*/
videojs.Player.prototype.reportUserActivity = function(){};
videojs.Player.prototype.userActive = function(){};

/**
* Native controls
*/
videojs.Player.prototype.usingNativeControls = function(){};
51 changes: 43 additions & 8 deletions src/js/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -516,7 +516,7 @@ vjs.Player.prototype.onVolumeChange;
* @event fullscreenchange
*/
vjs.Player.prototype.onFullscreenChange = function() {
if (this.isFullScreen) {
if (this.isFullScreen()) {
this.addClass('vjs-fullscreen');
} else {
this.removeClass('vjs-fullscreen');
Expand Down Expand Up @@ -802,8 +802,43 @@ vjs.Player.prototype.muted = function(muted){
return this.techGet('muted') || false; // Default to false
};

// Check if current tech can support native fullscreen (e.g. with built in controls lik iOS, so not our flash swf)
vjs.Player.prototype.supportsFullScreen = function(){ return this.techGet('supportsFullScreen') || false; };
// Check if current tech can support native fullscreen
// (e.g. with built in controls lik iOS, so not our flash swf)
vjs.Player.prototype.supportsFullScreen = function(){
return this.techGet('supportsFullScreen') || false;
};

/**
* is the player in fullscreen
* @type {Boolean}
* @private
*/
vjs.Player.prototype.isFullScreen_ = false;

/**
* Check if the player is in fullscreen mode
*
* // get
* var fullscreenOrNot = myPlayer.isFullScreen();
*
* // set
* myPlayer.isFullScreen(true); // tell the player it's in fullscreen
*
* NOTE: As of the latest HTML5 spec, isFullScreen is no longer an official
* property and instead document.fullscreenElement is used. But isFullScreen is
* still a valuable property for internal player workings.
*
* @param {Boolean=} isFS Update the player's fullscreen state
* @return {Boolean} true if fullscreen, false if not
* @return {vjs.Player} self, when setting
*/
vjs.Player.prototype.isFullScreen = function(isFS){
if (isFS !== undefined) {
this.isFullScreen_ = isFS;
return this;
}
return this.isFullScreen_;
};

/**
* Increase the size of the video to full screen
Expand All @@ -821,7 +856,7 @@ vjs.Player.prototype.supportsFullScreen = function(){ return this.techGet('suppo
*/
vjs.Player.prototype.requestFullScreen = function(){
var requestFullScreen = vjs.support.requestFullScreen;
this.isFullScreen = true;
this.isFullScreen(true);

if (requestFullScreen) {
// the browser supports going fullscreen at the element level so we can
Expand All @@ -833,10 +868,10 @@ vjs.Player.prototype.requestFullScreen = function(){
// players on a page, they would all be reacting to the same fullscreen
// events
vjs.on(document, requestFullScreen.eventName, vjs.bind(this, function(e){
this.isFullScreen = document[requestFullScreen.isFullScreen];
this.isFullScreen(document[requestFullScreen.isFullScreen]);

// If cancelling fullscreen, remove event listener.
if (this.isFullScreen === false) {
if (this.isFullScreen() === false) {
vjs.off(document, requestFullScreen.eventName, arguments.callee);
}

Expand Down Expand Up @@ -868,7 +903,7 @@ vjs.Player.prototype.requestFullScreen = function(){
*/
vjs.Player.prototype.cancelFullScreen = function(){
var requestFullScreen = vjs.support.requestFullScreen;
this.isFullScreen = false;
this.isFullScreen(false);

// Check for browser element fullscreen support
if (requestFullScreen) {
Expand Down Expand Up @@ -903,7 +938,7 @@ vjs.Player.prototype.enterFullWindow = function(){
};
vjs.Player.prototype.fullWindowOnEscKey = function(event){
if (event.keyCode === 27) {
if (this.isFullScreen === true) {
if (this.isFullScreen() === true) {
this.cancelFullScreen();
} else {
this.exitFullWindow();
Expand Down
2 changes: 1 addition & 1 deletion src/js/tracks.js
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ vjs.TextTrack.prototype.mode = function(){
* and restore it to its normal size when not in fullscreen mode.
*/
vjs.TextTrack.prototype.adjustFontSize = function(){
if (this.player_.isFullScreen) {
if (this.player_.isFullScreen()) {
// Scale the font by the same factor as increasing the video width to the full screen window width.
// Additionally, multiply that factor by 1.4, which is the default font size for
// the caption track (from the CSS)
Expand Down
54 changes: 43 additions & 11 deletions test/unit/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,58 @@ test('should be able to access expected player API methods', function() {
var player = PlayerTest.makePlayer();

// Native HTML5 Methods
ok(player.play, 'play exists');
ok(player.pause, 'pause exists');
ok(player.paused, 'paused exists');
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.buffered, 'buffered 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.cancelFullScreen, 'cancelFullScreen exists');

// Added player methods
// Unsupported Native HTML5 Methods
// ok(player.canPlayType, 'canPlayType exists');
// ok(player.readyState, 'readyState exists');
// ok(player.networkState, 'networkState 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');

// Component methods
ok(player.ready, 'ready exists');
ok(player.on, 'on exists');
ok(player.off, 'off exists');
ok(player.one, 'one exists');
ok(player.bufferedPercent, 'bufferedPercent exists');
ok(player.dimensions, 'dimensions exists');
ok(player.addClass, 'addClass exists');
ok(player.removeClass, 'removeClass exists');
ok(player.usingNativeControls, 'usingNativeControls exists');
ok(player.dispose, 'dispose exists');

player.dispose();
});
Expand Down Expand Up @@ -110,7 +138,7 @@ test('videojs.players should be available after minification', function() {
// NOTE: This test could be removed after we've landed on a permanent
// externs/exports strategy. See comment on videojs/video.js#853
test('fullscreenToggle does not depend on minified player methods', function(){
var noop, player, fullscreen, requestFullScreen, cancelFullScreen;
var noop, player, fullscreen, requestFullScreen, cancelFullScreen, isFullScreen_;
noop = function(){};
requestFullScreen = false;
cancelFullScreen = false;
Expand All @@ -124,16 +152,20 @@ test('fullscreenToggle does not depend on minified player methods', function(){
requestFullScreen = true;
};
player['cancelFullScreen'] = function(){
cancelFullScreen = true;
cancelFullScreen = true;
};

isFullScreen_ = false;
player['isFullScreen'] = function(){
return isFullScreen_;
};
player['isFullScreen'] = false;

fullscreen = new videojs.FullscreenToggle(player);
fullscreen.trigger('click');

ok(requestFullScreen, 'requestFullScreen called');

player.isFullScreen = true;
isFullScreen_ = true;
fullscreen.trigger('click');

ok(cancelFullScreen, 'cancelFullScreen called');
Expand Down
2 changes: 1 addition & 1 deletion test/unit/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ test('should set controls and trigger events', function() {
// var player = PlayerTest.makePlayer();
// player.on('fullscreenchange', function(){
// ok(true, 'fullscreenchange event fired');
// ok(this.isFullScreen === true, 'isFullScreen is true');
// ok(this.isFullScreen() === true, 'isFullScreen is true');
// ok(this.el().className.indexOf('vjs-fullscreen') !== -1, 'vjs-fullscreen class added');

// player.dispose();
Expand Down

0 comments on commit 166cc9c

Please sign in to comment.