From 9869eac9d50d079aabcb11552900b8c22ebaab2e Mon Sep 17 00:00:00 2001
From: Frode Petterson <frode.andre.petterson@gmail.com>
Date: Wed, 5 Jan 2022 13:41:42 +0100
Subject: [PATCH] JI-2981 Fix JS files being loaded multiple times

This is an issue with complex editors/content types where code might be executing while it's being overwritten.
For example, this can happen when IV and CP are used together in Column and can cause strange bugs.
---
 scripts/h5peditor.js | 46 ++++++++++++++++++++++++++++----------------
 1 file changed, 29 insertions(+), 17 deletions(-)

diff --git a/scripts/h5peditor.js b/scripts/h5peditor.js
index c88e1186..3affeec6 100644
--- a/scripts/h5peditor.js
+++ b/scripts/h5peditor.js
@@ -56,34 +56,46 @@ ns.isIE = navigator.userAgent.match(/; MSIE \d+.\d+;/) !== null;
  */
 ns.renderableCommonFields = {};
 
-/**
- * Help load JavaScripts, prevents double loading.
- *
- * @param {string} src
- * @param {Function} done Callback
- */
-ns.loadJs = function (src, done) {
-  if (H5P.jsLoaded(src)) {
-    // Already loaded
-    done();
-  }
-  else {
-    // Loading using script tag
+(() => {
+  const loading = {}; // Map of callbacks for each src being loaded
+
+  /**
+   * Help load JavaScripts, prevents double loading.
+   *
+   * @param {string} src
+   * @param {Function} done Callback
+   */
+  ns.loadJs = (src, done) => {
+    if (H5P.jsLoaded(src)) {
+      // Already loaded
+      done(); 
+      return;
+    }
+
+    if (loading[src] !== undefined) {
+      // Loading in progress...
+      loading[src].push(done);
+      return;
+    }
+
+    loading[src] = [done];
+
+    // Load using script tag
     var script = document.createElement('script');
     script.type = 'text/javascript';
     script.charset = 'UTF-8';
     script.async = false;
     script.onload = function () {
       H5PIntegration.loadedJs.push(src);
-      done();
+      loading[src].forEach(cb => cb());
     };
     script.onerror = function (err) {
-      done(err);
+      loading[src].forEach(cb => cb(err));
     };
     script.src = src;
     document.head.appendChild(script);
-  }
-}
+  };
+})();
 
 /**
  * Helper function invoked when a library is requested. Will add CSS and eval JS
-- 
GitLab