]> git.proxmox.com Git - mirror_novnc.git/blobdiff - vendor/browser-es-module-loader/src/browser-es-module-loader.js
Better currentScript fallback
[mirror_novnc.git] / vendor / browser-es-module-loader / src / browser-es-module-loader.js
index 0bfe21b202f4ee1da7a39018f2a453fce0ecde19..5eff16765740c6c2c709a94a909d20410c1e9f22 100644 (file)
@@ -9,7 +9,7 @@ var loader;
 // <script type="module"> support
 var anonSources = {};
 if (typeof document != 'undefined' && document.getElementsByTagName) {
-  function handleError(err) {
+  var handleError = function(err) {
     // dispatch an error event so that we can display in errors in browsers
     // that don't yet support unhandledrejection
     if (window.onunhandledrejection === undefined) {
@@ -20,6 +20,15 @@ if (typeof document != 'undefined' && document.getElementsByTagName) {
         evt.initEvent('error', true, true);
       }
       evt.message = err.message;
+      if (err.fileName) {
+        evt.filename = err.fileName;
+        evt.lineno = err.lineNumber;
+        evt.colno = err.columnNumber;
+      } else if (err.sourceURL) {
+        evt.filename = err.sourceURL;
+        evt.lineno = err.line;
+        evt.colno = err.column;
+      }
       evt.error = err;
       window.dispatchEvent(evt);
     }
@@ -28,7 +37,7 @@ if (typeof document != 'undefined' && document.getElementsByTagName) {
     throw err;
   }
 
-  function ready() {
+  var ready = function() {
     document.removeEventListener('DOMContentLoaded', ready, false );
 
     var anonCnt = 0;
@@ -43,7 +52,7 @@ if (typeof document != 'undefined' && document.getElementsByTagName) {
         }
         // anonymous modules supported via a custom naming scheme and registry
         else {
-          var uri = './<anon' + ++anonCnt + '>';
+          var uri = './<anon' + ++anonCnt + '>.js';
           if (script.id !== ""){
             uri = "./" + script.id;
           }
@@ -94,10 +103,10 @@ BrowserESModuleLoader.prototype[RegisterLoader.resolve] = function(key, parent)
 
 function xhrFetch(url, resolve, reject) {
   var xhr = new XMLHttpRequest();
-  function load(source) {
+  var load = function(source) {
     resolve(xhr.responseText);
   }
-  function error() {
+  var error = function() {
     reject(new Error('XHR error' + (xhr.status ? ' (' + xhr.status + (xhr.statusText ? ' ' + xhr.statusText  : '') + ')' : '') + ' loading ' + url));
   }
 
@@ -128,17 +137,33 @@ function xhrFetch(url, resolve, reject) {
 }
 
 var WorkerPool = function (script, size) {
+  var current = document.currentScript;
+  // IE doesn't support currentScript
+  if (!current) {
+    // Find an entry with out basename
+    var scripts = document.getElementsByTagName('script');
+    for (var i = 0; i < scripts.length; i++) {
+      if (scripts[i].src.indexOf("browser-es-module-loader.js") !== -1) {
+        current = scripts[i];
+        break;
+      }
+    }
+    if (!current)
+      throw Error("Could not find own <script> element");
+  }
+  script = current.src.substr(0, current.src.lastIndexOf("/")) + "/" + script;
   this._workers = new Array(size);
   this._ind = 0;
   this._size = size;
   this._jobs = 0;
   this.onmessage = undefined;
   this._stopTimeout = undefined;
-  for (let i = 0; i < size; i++) {
-    let wrkr = new Worker(script);
+  for (var i = 0; i < size; i++) {
+    var wrkr = new Worker(script);
     wrkr._count = 0;
     wrkr._ind = i;
     wrkr.onmessage = this._onmessage.bind(this, wrkr);
+    wrkr.onerror = this._onerror.bind(this);
     this._workers[i] = wrkr;
   }
 
@@ -150,7 +175,7 @@ WorkerPool.prototype = {
       clearTimeout(this._stopTimeout);
       this._stopTimeout = undefined;
     }
-    let wrkr = this._workers[this._ind % this._size];
+    var wrkr = this._workers[this._ind % this._size];
     wrkr._count++;
     this._jobs++;
     wrkr.postMessage(msg);
@@ -164,6 +189,21 @@ WorkerPool.prototype = {
     this._checkJobs();
   },
 
+  _onerror: function(err) {
+    try {
+        var evt = new Event('error');
+    } catch (_eventError) {
+        var evt = document.createEvent('Event');
+        evt.initEvent('error', true, true);
+    }
+    evt.message = err.message;
+    evt.filename = err.filename;
+    evt.lineno = err.lineno;
+    evt.colno = err.colno;
+    evt.error = err.error;
+    window.dispatchEvent(evt);
+  },
+
   _checkJobs: function () {
     if (this._jobs === 0 && this._stopTimeout === undefined) {
       // wait for 2s of inactivity before stopping (that should be enough for local loading)
@@ -179,7 +219,7 @@ WorkerPool.prototype = {
 };
 
 var promiseMap = new Map();
-var babelWorker = new WorkerPool('/vendor/browser-es-module-loader/dist/babel-worker.js', 3);
+var babelWorker = new WorkerPool('babel-worker.js', 3);
 babelWorker.onmessage = function (evt) {
     var promFuncs = promiseMap.get(evt.data.key);
     promFuncs.resolve(evt.data);
@@ -205,12 +245,12 @@ BrowserESModuleLoader.prototype[RegisterLoader.instantiate] = function(key, proc
   })
   .then(function(source) {
     // check our cache first
-    const cacheEntryTrans = localStorage.getItem(key+'!transpiled');
-    if (cacheEntryTrans) {
-      const cacheEntryRaw = localStorage.getItem(key+'!raw');
+    var cacheEntry = localStorage.getItem(key);
+    if (cacheEntry) {
+      cacheEntry = JSON.parse(cacheEntry);
       // TODO: store a hash instead
-      if (cacheEntryRaw === source) {
-        return Promise.resolve({key: key, code: cacheEntryTrans, source: source});
+      if (cacheEntry.source === source) {
+        return Promise.resolve({key: key, code: cacheEntry.code, source: cacheEntry.source});
       }
     }
     return new Promise(function (resolve, reject) {
@@ -220,9 +260,13 @@ BrowserESModuleLoader.prototype[RegisterLoader.instantiate] = function(key, proc
   }).then(function (data) {
     // evaluate without require, exports and module variables
     // we leave module in for now to allow module.require access
-    if (data.key.slice(-8) !== '#nocache') {
-        localStorage.setItem(key+'!raw', data.source);
-        localStorage.setItem(data.key+'!transpiled', data.code);
+    try {
+      var cacheEntry = JSON.stringify({source: data.source, code: data.code});
+      localStorage.setItem(key, cacheEntry);
+    } catch (e) {
+      if (window.console) {
+        window.console.warn('Unable to cache transpiled version of ' + key + ': ' + e);
+      }
     }
     (0, eval)(data.code + '\n//# sourceURL=' + data.key + '!transpiled');
     processAnonRegister();