diff --git a/common/lib/xmodule/xmodule/js/spec/video/video_caption_spec.js b/common/lib/xmodule/xmodule/js/spec/video/video_caption_spec.js index 9458b483da..eaf21b10fd 100644 --- a/common/lib/xmodule/xmodule/js/spec/video/video_caption_spec.js +++ b/common/lib/xmodule/xmodule/js/spec/video/video_caption_spec.js @@ -126,6 +126,22 @@ expect(videoCaption.rendered).toBeFalsy(); }); }); + + describe('when no captions file was specified', function () { + beforeEach(function () { + loadFixtures('video_all.html'); + + // Unspecify the captions file. + $('#example').find('#video_id').data('sub', ''); + + state = new Video('#example'); + videoCaption = state.videoCaption; + }); + + it('captions panel is not shown', function () { + expect(videoCaption.hideSubtitlesEl.css('display')).toBe('none'); + }); + }); }); describe('mouse movement', function() { diff --git a/common/lib/xmodule/xmodule/js/src/video/01_initialize.js b/common/lib/xmodule/xmodule/js/src/video/01_initialize.js index 79bc16dbda..1efb1a1871 100644 --- a/common/lib/xmodule/xmodule/js/src/video/01_initialize.js +++ b/common/lib/xmodule/xmodule/js/src/video/01_initialize.js @@ -25,7 +25,9 @@ function (VideoPlayer) { * * Initialize module exports this function. * - * @param {Object} state A place for all properties, and methods of Video. + * @param {object} state The object containg the state of the video player. + * All other modules, their parameters, public variables, etc. are + * available via this object. * @param {DOM element} element Container of the entire Video DOM element. */ return function (state, element) { @@ -40,10 +42,12 @@ function (VideoPlayer) { /** * @function _makeFunctionsPublic * - * Functions which will be accessible via 'state' object. When called, these functions will get the 'state' + * Functions which will be accessible via 'state' object. When called, + * these functions will get the 'state' * object as a context. * - * @param {Object} state A place for all properties, and methods of Video. + * @param {object} state The object containg the state (properties, + * methods, modules) of the Video player. */ function _makeFunctionsPublic(state) { state.setSpeed = _.bind(setSpeed, state); diff --git a/common/lib/xmodule/xmodule/js/src/video/09_video_caption.js b/common/lib/xmodule/xmodule/js/src/video/09_video_caption.js index d313a7f485..69ec14d4ff 100644 --- a/common/lib/xmodule/xmodule/js/src/video/09_video_caption.js +++ b/common/lib/xmodule/xmodule/js/src/video/09_video_caption.js @@ -6,7 +6,20 @@ define( [], function () { - // VideoCaption() function - what this module "exports". + /** + * @desc VideoCaption module exports a function. + * + * @type {function} + * @access public + * + * @param {object} state - The object containg the state of the video + * player. All other modules, their parameters, public variables, etc. + * are available via this object. + * + * @this {object} The global window object. + * + * @returns {undefined} + */ return function (state) { state.videoCaption = {}; @@ -64,11 +77,25 @@ function () { // The magic private function that makes them available and sets up their context is makeFunctionsPublic(). // *************************************************************** - // function renderElements() - // - // Create any necessary DOM elements, attach them, and set their initial configuration. Also - // make the created DOM elements available via the 'state' object. Much easier to work this - // way - you don't have to do repeated jQuery element selects. + /** + * @desc Create any necessary DOM elements, attach them, and set their + * initial configuration. Also make the created DOM elements available + * via the 'state' object. Much easier to work this way - you don't + * have to do repeated jQuery element selects. + * + * @type {function} + * @access public + * + * @this {object} - The object containg the state of the video + * player. All other modules, their parameters, public variables, etc. + * are available via this object. + * + * @returns {boolean} + * true: The function fethched captions successfully, and compltely + * rendered everything related to captions. + * false: The captions were not fetched. Nothing will be rendered, + * and the CC button will be hidden. + */ function renderElements() { this.videoCaption.loaded = false; @@ -79,12 +106,10 @@ function () { this.el.find('.video-controls .secondary-controls').append(this.videoCaption.hideSubtitlesEl); // Fetch the captions file. If no file was specified, then we hide - // the "CC" button, and exit from this module. No further caption - // initialization will happen. + // the "CC" button, and return. if (!this.videoCaption.fetchCaption()) { this.videoCaption.hideSubtitlesEl.hide(); - // Abandon all further operations with captions panel. return false; } @@ -136,6 +161,25 @@ function () { } } + /** + * @desc Fetch the caption file specified by the user. Upn successful + * receival of the file, the captions will be rendered. + * + * @type {function} + * @access public + * + * @this {object} - The object containg the state of the video + * player. All other modules, their parameters, public variables, etc. + * are available via this object. + * + * @returns {boolean} + * true: The user specified a caption file. NOTE: if an error happens + * while the specified file is being retrieved (for example the + * file is missing on the server), this function will still return + * true. + * false: No caption file was specified, or an empty string was + * specified. + */ function fetchCaption() { var _this = this;