Commit e363e5a7 by David Baumgold

Merge pull request #1337 from edx/db/fix-video-requirejs

fix video module issue with require.js
parents 637b6619 d408d7ad
...@@ -22,7 +22,7 @@ requirejs.config({ ...@@ -22,7 +22,7 @@ requirejs.config({
"underscore.string": "xmodule_js/common_static/js/vendor/underscore.string.min", "underscore.string": "xmodule_js/common_static/js/vendor/underscore.string.min",
"backbone": "xmodule_js/common_static/js/vendor/backbone-min", "backbone": "xmodule_js/common_static/js/vendor/backbone-min",
"backbone.associations": "xmodule_js/common_static/js/vendor/backbone-associations-min", "backbone.associations": "xmodule_js/common_static/js/vendor/backbone-associations-min",
"youtube": "xmodule_js/common_static/js/load_youtube", "youtube": "//www.youtube.com/player_api?noext",
"tinymce": "xmodule_js/common_static/js/vendor/tiny_mce/tiny_mce", "tinymce": "xmodule_js/common_static/js/vendor/tiny_mce/tiny_mce",
"jquery.tinymce": "xmodule_js/common_static/js/vendor/tiny_mce/jquery.tinymce", "jquery.tinymce": "xmodule_js/common_static/js/vendor/tiny_mce/jquery.tinymce",
"mathjax": "https://edx-static.s3.amazonaws.com/mathjax-MathJax-727332c/MathJax.js?config=TeX-MML-AM_HTMLorMML-full", "mathjax": "https://edx-static.s3.amazonaws.com/mathjax-MathJax-727332c/MathJax.js?config=TeX-MML-AM_HTMLorMML-full",
...@@ -102,6 +102,9 @@ requirejs.config({ ...@@ -102,6 +102,9 @@ requirejs.config({
deps: ["backbone"], deps: ["backbone"],
exports: "Backbone.Associations" exports: "Backbone.Associations"
}, },
"youtube": {
exports: "YT"
},
"codemirror": { "codemirror": {
exports: "CodeMirror" exports: "CodeMirror"
}, },
......
...@@ -22,7 +22,7 @@ requirejs.config({ ...@@ -22,7 +22,7 @@ requirejs.config({
"underscore.string": "xmodule_js/common_static/js/vendor/underscore.string.min", "underscore.string": "xmodule_js/common_static/js/vendor/underscore.string.min",
"backbone": "xmodule_js/common_static/js/vendor/backbone-min", "backbone": "xmodule_js/common_static/js/vendor/backbone-min",
"backbone.associations": "xmodule_js/common_static/js/vendor/backbone-associations-min", "backbone.associations": "xmodule_js/common_static/js/vendor/backbone-associations-min",
"youtube": "xmodule_js/common_static/js/load_youtube", "youtube": "//www.youtube.com/player_api?noext",
"tinymce": "xmodule_js/common_static/js/vendor/tiny_mce/tiny_mce", "tinymce": "xmodule_js/common_static/js/vendor/tiny_mce/tiny_mce",
"jquery.tinymce": "xmodule_js/common_static/js/vendor/tiny_mce/jquery.tinymce", "jquery.tinymce": "xmodule_js/common_static/js/vendor/tiny_mce/jquery.tinymce",
"mathjax": "https://edx-static.s3.amazonaws.com/mathjax-MathJax-727332c/MathJax.js?config=TeX-MML-AM_HTMLorMML-full", "mathjax": "https://edx-static.s3.amazonaws.com/mathjax-MathJax-727332c/MathJax.js?config=TeX-MML-AM_HTMLorMML-full",
...@@ -100,6 +100,9 @@ requirejs.config({ ...@@ -100,6 +100,9 @@ requirejs.config({
deps: ["backbone"], deps: ["backbone"],
exports: "Backbone.Associations" exports: "Backbone.Associations"
}, },
"youtube": {
exports: "YT"
},
"codemirror": { "codemirror": {
exports: "CodeMirror" exports: "CodeMirror"
}, },
......
...@@ -61,13 +61,18 @@ var require = { ...@@ -61,13 +61,18 @@ var require = {
"underscore.string": "js/vendor/underscore.string.min", "underscore.string": "js/vendor/underscore.string.min",
"backbone": "js/vendor/backbone-min", "backbone": "js/vendor/backbone-min",
"backbone.associations": "js/vendor/backbone-associations-min", "backbone.associations": "js/vendor/backbone-associations-min",
"youtube": "js/load_youtube",
"tinymce": "js/vendor/tiny_mce/tiny_mce", "tinymce": "js/vendor/tiny_mce/tiny_mce",
"jquery.tinymce": "js/vendor/tiny_mce/jquery.tinymce", "jquery.tinymce": "js/vendor/tiny_mce/jquery.tinymce",
"mathjax": "https://edx-static.s3.amazonaws.com/mathjax-MathJax-727332c/MathJax.js?config=TeX-MML-AM_HTMLorMML-full",
"xmodule": "/xmodule/xmodule", "xmodule": "/xmodule/xmodule",
"utility": "js/src/utility", "utility": "js/src/utility",
"draggabilly": "js/vendor/draggabilly.pkgd" "draggabilly": "js/vendor/draggabilly.pkgd",
// externally hosted files
"mathjax": "//edx-static.s3.amazonaws.com/mathjax-MathJax-727332c/MathJax.js?config=TeX-MML-AM_HTMLorMML-full",
// youtube URL does not end in ".js". We add "?noext" to the path so
// that require.js adds the ".js" to the query component of the URL,
// and leaves the path component intact.
"youtube": "//www.youtube.com/player_api?noext"
}, },
shim: { shim: {
"gettext": { "gettext": {
...@@ -138,6 +143,9 @@ var require = { ...@@ -138,6 +143,9 @@ var require = {
deps: ["backbone"], deps: ["backbone"],
exports: "Backbone.Associations" exports: "Backbone.Associations"
}, },
"youtube": {
exports: "YT"
},
"codemirror": { "codemirror": {
exports: "CodeMirror" exports: "CodeMirror"
}, },
......
# Stub Youtube API # Stub Youtube API
window.YT = window.YT =
Player: ->
PlayerState: PlayerState:
UNSTARTED: -1 UNSTARTED: -1
ENDED: 0 ENDED: 0
...@@ -7,6 +8,7 @@ window.YT = ...@@ -7,6 +8,7 @@ window.YT =
PAUSED: 2 PAUSED: 2
BUFFERING: 3 BUFFERING: 3
CUED: 5 CUED: 5
ready: (f) -> f()
window.STATUS = window.YT.PlayerState window.STATUS = window.YT.PlayerState
......
...@@ -11,8 +11,6 @@ ...@@ -11,8 +11,6 @@
afterEach(function () { afterEach(function () {
window.OldVideoPlayer = undefined; window.OldVideoPlayer = undefined;
window.onYouTubePlayerAPIReady = undefined;
window.onHTML5PlayerAPIReady = undefined;
$('source').remove(); $('source').remove();
}); });
...@@ -214,14 +212,23 @@ ...@@ -214,14 +212,23 @@
// Total ajax calls made. // Total ajax calls made.
numAjaxCalls = $.ajax.calls.length; numAjaxCalls = $.ajax.calls.length;
// Subtract ajax calls to get captions. // Subtract ajax calls to get captions via
// state.videoCaption.fetchCaption() function.
numAjaxCalls -= $.ajaxWithPrefix.calls.length; numAjaxCalls -= $.ajaxWithPrefix.calls.length;
// Subtract ajax calls to get metadata for each video. // Subtract ajax calls to get metadata for each video via
// state.getVideoMetadata() function.
numAjaxCalls -= 3;
// Subtract ajax calls to log event 'pause_video' via
// state.videoPlayer.log() function.
numAjaxCalls -= 3; numAjaxCalls -= 3;
// This should leave just one call. It was made to check // This should leave just one call. It was made to check
// for YT availability. // for YT availability. This is done in state.initialize()
// function. SPecifically, with the statement
//
// this.youtubeXhr = this.getVideoMetadata();
expect(numAjaxCalls).toBe(1); expect(numAjaxCalls).toBe(1);
}); });
}); });
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
spyOn(player, 'callStateChangeCallback').andCallThrough(); spyOn(player, 'callStateChangeCallback').andCallThrough();
}); });
describe('click', function () { describe('[click]', function () {
describe('when player is paused', function () { describe('when player is paused', function () {
beforeEach(function () { beforeEach(function () {
spyOn(player.video, 'play').andCallThrough(); spyOn(player.video, 'play').andCallThrough();
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
}); });
}); });
describe('when player is playing', function () { describe('[player is playing]', function () {
beforeEach(function () { beforeEach(function () {
spyOn(player.video, 'pause').andCallThrough(); spyOn(player.video, 'pause').andCallThrough();
player.playerState = STATUS.PLAYING; player.playerState = STATUS.PLAYING;
...@@ -94,7 +94,7 @@ ...@@ -94,7 +94,7 @@
}); });
}); });
describe('play', function () { describe('[play]', function () {
beforeEach(function () { beforeEach(function () {
spyOn(player.video, 'play').andCallThrough(); spyOn(player.video, 'play').andCallThrough();
player.playerState = STATUS.PAUSED; player.playerState = STATUS.PAUSED;
...@@ -126,7 +126,7 @@ ...@@ -126,7 +126,7 @@
}); });
}); });
describe('pause', function () { describe('[pause]', function () {
beforeEach(function () { beforeEach(function () {
spyOn(player.video, 'pause').andCallThrough(); spyOn(player.video, 'pause').andCallThrough();
player.playerState = STATUS.UNSTARTED; player.playerState = STATUS.UNSTARTED;
...@@ -161,7 +161,7 @@ ...@@ -161,7 +161,7 @@
}); });
}); });
describe('canplay', function () { describe('[canplay]', function () {
beforeEach(function () { beforeEach(function () {
waitsFor(function () { waitsFor(function () {
return player.getPlayerState() !== STATUS.UNSTARTED; return player.getPlayerState() !== STATUS.UNSTARTED;
...@@ -193,7 +193,7 @@ ...@@ -193,7 +193,7 @@
}); });
}); });
describe('ended', function () { describe('[ended]', function () {
beforeEach(function () { beforeEach(function () {
waitsFor(function () { waitsFor(function () {
return player.getPlayerState() !== STATUS.UNSTARTED; return player.getPlayerState() !== STATUS.UNSTARTED;
......
...@@ -83,7 +83,8 @@ ...@@ -83,7 +83,8 @@
window.YT = { window.YT = {
Player: function () { }, Player: function () { },
PlayerState: oldYT.PlayerState PlayerState: oldYT.PlayerState,
ready: function(f){f();}
}; };
spyOn(window.YT, 'Player'); spyOn(window.YT, 'Player');
......
...@@ -20,17 +20,38 @@ ...@@ -20,17 +20,38 @@
}); });
describe('constructor', function() { describe('constructor', function() {
var oldYT = window.YT;
beforeEach(function() { beforeEach(function() {
window.YT = {
Player: function () { },
PlayerState: oldYT.PlayerState,
ready: function(f){f();}
};
initialize(); initialize();
}); });
// Disabled when ARIA markup was added to the anchor afterEach(function () {
xit('render the quality control', function() { window.YT = oldYT;
expect(videoControl.secondaryControlsEl.html()).toContain("<a href=\"#\" class=\"quality_control\" title=\"HD\">"); });
it('render the quality control', function() {
expect(videoControl.secondaryControlsEl.html())
.toContain(
'<a ' +
'href="#" ' +
'class="quality_control" ' +
'title="HD" ' +
'role="button" ' +
'aria-disabled="false"' +
'>HD</a>'
);
}); });
it('bind the quality control', function() { it('bind the quality control', function() {
expect($('.quality_control')).toHandleWith('click', videoQualityControl.toggleQuality); expect($('.quality_control'))
.toHandleWith('click', videoQualityControl.toggleQuality);
}); });
}); });
}); });
......
...@@ -92,23 +92,12 @@ function (VideoPlayer) { ...@@ -92,23 +92,12 @@ function (VideoPlayer) {
// Require JS. At the time when we reach this code, the stand alone // Require JS. At the time when we reach this code, the stand alone
// HTML5 player is already loaded, so no further testing in that case // HTML5 player is already loaded, so no further testing in that case
// is required. // is required.
var onPlayerReadyFunc; if(state.videoType === 'youtube') {
if ( YT.ready(function() {
( VideoPlayer(state);
(state.videoType === 'youtube') && })
(window.YT) &&
(window.YT.Player)
) ||
(state.videoType === 'html5')
) {
VideoPlayer(state);
} else { } else {
if (state.videoType === 'youtube') { VideoPlayer(state);
onPlayerReadyFunc = 'onYouTubePlayerAPIReady';
} else {
onPlayerReadyFunc = 'onHTML5PlayerAPIReady';
}
window[onPlayerReadyFunc] = _.bind(VideoPlayer, window, state);
} }
} }
......
...@@ -420,7 +420,7 @@ function (HTML5Video) { ...@@ -420,7 +420,7 @@ function (HTML5Video) {
this.videoPlayer.player.setPlaybackRate(this.speed); this.videoPlayer.player.setPlaybackRate(this.speed);
} }
/* The following has been commented out to make sure autoplay is /* The following has been commented out to make sure autoplay is
disabled for students. disabled for students.
if ( if (
!onTouchBasedDevice() && !onTouchBasedDevice() &&
......
define(["jquery"], function($) {
var url = "//www.youtube.com/player_api";
$("head").append($("<script/>", {src: url}));
return window.YT;
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment