From bee04095bd3c239f660bd134a6df6f21334927bc Mon Sep 17 00:00:00 2001 From: cahrens Date: Fri, 7 Oct 2016 11:34:17 -0400 Subject: [PATCH] Fix eslint violations. --- .../xmodule/js/src/javascript_loader.js | 88 ++++++++++--------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/common/lib/xmodule/xmodule/js/src/javascript_loader.js b/common/lib/xmodule/xmodule/js/src/javascript_loader.js index 4f16b8dd14..1b31217f5d 100644 --- a/common/lib/xmodule/xmodule/js/src/javascript_loader.js +++ b/common/lib/xmodule/xmodule/js/src/javascript_loader.js @@ -1,47 +1,51 @@ -// Generated by CoffeeScript 1.6.1 -(function () { - - this.JavascriptLoader = (function () { - +(function() { + 'use strict'; + this.JavascriptLoader = (function() { function JavascriptLoader() { } - JavascriptLoader.executeModuleScripts = function (el, callback) { - var callbackCalled, completed, completionHandlerGenerator, completionHandlerGeneratorIE, i, loaded, placeholders, - _this = this; - if (callback == null) { - callback = null; + /** + * Set of library functions that provide common interface for javascript loading + * for all module types. All functionality provided by JavascriptLoader should take + * place at module scope, i.e. don't run jQuery over entire page. + * + * executeModuleScripts: + * Scan the module ('el') for "script_placeholder"s, then: + * + * 1) Fetch each script from server + * 2) Explicitly attach the script to the of document + * 3) Explicitly wait for each script to be loaded + * 4) Return to callback function when all scripts loaded + */ + JavascriptLoader.executeModuleScripts = function(el, callback) { + var callbackCalled, completed, completionHandlerGenerator, loaded, placeholders; + if (!callback) { + callback = null; // eslint-disable-line no-param-reassign } - placeholders = el.find(".script_placeholder"); + placeholders = el.find('.script_placeholder'); if (placeholders.length === 0) { - if (callback != null) { + if (callback !== null) { callback(); } - return; + return []; } - completed = (function () { - var _i, _ref, _results; - _results = []; - for (i = _i = 1, _ref = placeholders.length; 1 <= _ref ? _i <= _ref : _i >= _ref; i = 1 <= _ref ? ++_i : --_i) { - _results.push(false); + // TODO: Verify the execution order of multiple placeholders + completed = (function() { + var i, ref, results; + results = []; + for (i = 1, ref = placeholders.length; ref >= 1 ? i <= ref : i >= ref; ref >= 1 ? ++i : --i) { + results.push(false); } - return _results; - })(); + return results; + }()); callbackCalled = false; - completionHandlerGeneratorIE = function (index) { - return function () { - if (this.readyState === 'complete' || this.readyState === 'loaded') { - return completionHandlerGenerator(index)(); - } - }; - }; - completionHandlerGenerator = function (index) { - return function () { - var allComplete, flag, _i, _len; + completionHandlerGenerator = function(index) { + return function() { + var allComplete, flag, i, len; allComplete = true; completed[index] = true; - for (_i = 0, _len = completed.length; _i < _len; _i++) { - flag = completed[_i]; + for (i = 0, len = completed.length; i < len; i++) { + flag = completed[i]; if (!flag) { allComplete = false; break; @@ -49,25 +53,31 @@ } if (allComplete && !callbackCalled) { callbackCalled = true; - if (callback != null) { + if (callback !== null) { return callback(); } } + return undefined; }; }; + // Keep a map of what sources we're loaded from, and don't do it twice. loaded = {}; - return placeholders.each(function (index, placeholder) { + return placeholders.each(function(index, placeholder) { var s, src; - src = $(placeholder).attr("data-src"); + // TODO: Check if the script already exists in DOM. If so, (1) copy it + // into memory; (2) delete the DOM script element; (3) reappend it. + // This would prevent memory bloat and save a network request. + src = $(placeholder).attr('data-src'); if (!(src in loaded)) { loaded[src] = true; s = document.createElement('script'); s.setAttribute('src', src); - s.setAttribute('type', "text/javascript"); + s.setAttribute('type', 'text/javascript'); s.onload = completionHandlerGenerator(index); - s.onreadystatechange = completionHandlerGeneratorIE(index); + // Need to use the DOM elements directly or the scripts won't execute properly. $('head')[0].appendChild(s); } else { + // just call the completion callback directly, without reloading the file completionHandlerGenerator(index)(); } return $(placeholder).remove(); @@ -75,7 +85,5 @@ }; return JavascriptLoader; - - })(); - + }()); }).call(this);