# HG changeset patch # User Jaroslav Tulach # Date 1401260868 -7200 # Node ID 5186733b7e07b8640fa702ef7c2593ee11a05f9b # Parent ace1ff1087e771eb8c5620db1c8a394f9b4e2caa Load scripts asynchronously diff -r ace1ff1087e7 -r 5186733b7e07 rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Tue May 27 16:36:07 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Wed May 28 09:07:48 2014 +0200 @@ -487,16 +487,34 @@ + " name = replaceAll(name, '.', '_');\n" + " return name;\n" + " };\n" + + " var pending = [];\n" + + " var pendingClasses = [];\n" + + " function extensionLoaded(ev) {\n" + + " var at = pending.indexOf(ev.target);\n" + + " pending.splice(at, 1);\n" + + " if (pending.length === 0) {\n" + + " for (var i = 0; i < pendingClasses.length; i += 2) {\n" + + " var vm = pendingClasses[i];\n" + + " var n = pendingClasses[i + 1];\n" + + " vm.loadClass(n);\n" + + " }\n" + + " pendingClasses = [];\n" + + " }\n" + + " }\n" + + " function extensionError(ev) {\n" + + " console.log('error loading ' + ev.target.src);\n" + + " extensionLoaded(ev);\n" + + " }\n" + " function loadExtension(url) {\n" + " if (url.substring(url.length - 4) == '.jar')\n" + " url = url.substring(0, url.length - 4) + '.js';\n" - + " var xhr = new XMLHttpRequest();\n" - + " xhr.open('GET', url, false);\n" - + " xhr.send();\n" + " var script = document.createElement('script');\n" + " script.type = 'text/javascript';\n" - + " script.text = xhr.responseText;\n" + + " script.src = url;\n" + + " script.onload = extensionLoaded;\n" + + " script.onerror = extensionError;\n" + " document.getElementsByTagName('head')[0].appendChild(script);\n" + + " pending.push(script);\n" + " }\n" + " global.bck2brwsr = function() {\n" + " var args = Array.prototype.slice.apply(arguments);\n" @@ -570,7 +588,7 @@ + " ['load__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2_3B']\n" + " (vm, name, args, arr);\n" + " };\n" - + " loader.loadClass = function(name) {\n" + + " var loadClass = function(name) {\n" + " var attr = mangleClass(name);\n" + " var fn = vm[attr];\n" + " if (fn) return fn(false);\n" @@ -586,10 +604,22 @@ + " if (vm['loadClass']) {\n" + " throw 'Cannot initialize the bck2brwsr VM twice!';\n" + " }\n" - + " vm['loadClass'] = loader.loadClass;\n" + + " vm['loadClass'] = loadClass;\n" + " vm['_reload'] = reload;\n" + " vm['loadBytes'] = loadBytes;\n" + " initVM();\n" + + " loader.loadClass = function(name) {\n" + + " if (pending.length === 0) {\n" + + " try {\n" + + " return loadClass(name);\n" + + " } catch (err) {\n" + + " if (pending.length === 0) throw err;\n" + + " }\n" + + " }\n" + + " pendingClasses.push(vm);\n" + + " pendingClasses.push(name);\n" + + " return null;\n" + + " }\n" + " return loader;\n" + " };\n"); append(