Skip to content

Commit

Permalink
Catch and retry video module YT IFrame API ready errs
Browse files Browse the repository at this point in the history
Retry setting window.onYouTubeIframeAPIReady.resolve to JQuery Deferred obj .resolve
up to 3 times before finally failing
Log err message to console
Catch and retry only TypeErrors which should result from .resolve TypeError

This is direclty in edx-platform since I couldn't figure out how to
override in the theme due to the webpack bundling that is done directly
into VideoBlockPreview.js via add_webpack_to_frament in video_module.py

ENG-97
  • Loading branch information
bryanlandia committed Jul 20, 2023
1 parent b6fcd12 commit 4d0c936
Showing 1 changed file with 20 additions and 1 deletion.
21 changes: 20 additions & 1 deletion common/lib/xmodule/xmodule/js/src/video/01_initialize.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ function(VideoPlayer, i18n, moment, _) {

_youtubeApiDeferred = null,
_oldOnYouTubeIframeAPIReady;
const setupOnYouTubeIframeAPIReadyMaxCalls=3;

Initialize.prototype = methodsDict;

Expand Down Expand Up @@ -165,14 +166,32 @@ function(VideoPlayer, i18n, moment, _) {
//
// If this global function is already defined, we store it first, and make
// sure that it gets executed when our Deferred object is resolved.
let setupOnYouTubeIframeAPIReadyCallsCount = 0;

setupOnYouTubeIframeAPIReady = function() {
setupOnYouTubeIframeAPIReadyCallsCount++;
if (setupOnYouTubeIframeAPIReadyCallsCount > setupOnYouTubeIframeAPIReadyMaxCalls) {
throw new Error('Too many OnYouTubeIframeAPIReady retries after TypeError...giving up.');
}

_oldOnYouTubeIframeAPIReady = window.onYouTubeIframeAPIReady || undefined;

window.onYouTubeIframeAPIReady = function() {
window.onYouTubeIframeAPIReady.resolve();
};

window.onYouTubeIframeAPIReady.resolve = _youtubeApiDeferred.resolve;
try {
window.onYouTubeIframeAPIReady.resolve = _youtubeApiDeferred.resolve;
} catch (e) {
console.error('Error while trying to resolve the Deferred object responsible for calling OnYouTubeIframeAPIReady callbacks.');
console.error(e);
if (e instanceof TypeError) {
setupOnYouTubeIframeAPIReady(); // Try again up to defined max calls.
}
else {
throw e;
}
}
window.onYouTubeIframeAPIReady.done = _youtubeApiDeferred.done;

if (_oldOnYouTubeIframeAPIReady) {
Expand Down

0 comments on commit 4d0c936

Please sign in to comment.