From 0bbbd73b9aa1fdb84f53d187f0513c96e9088ea8 Mon Sep 17 00:00:00 2001 From: Igor Kiselev Date: Wed, 20 Apr 2016 19:08:58 -0700 Subject: [PATCH 1/2] WebWorker environment support --- JSIL.Libraries/JSIL.Libraries.csproj | 2 + .../Sources/JSIL.WebWorker.Loaders.js | 13 +++ JSIL.Libraries/Sources/JSIL.WebWorker.js | 103 ++++++++++++++++++ JSIL.Libraries/Sources/JSIL.js | 55 +++++++--- 4 files changed, 156 insertions(+), 17 deletions(-) create mode 100644 JSIL.Libraries/Sources/JSIL.WebWorker.Loaders.js create mode 100644 JSIL.Libraries/Sources/JSIL.WebWorker.js diff --git a/JSIL.Libraries/JSIL.Libraries.csproj b/JSIL.Libraries/JSIL.Libraries.csproj index 7af588ac0..82a69f032 100644 --- a/JSIL.Libraries/JSIL.Libraries.csproj +++ b/JSIL.Libraries/JSIL.Libraries.csproj @@ -287,6 +287,8 @@ + + diff --git a/JSIL.Libraries/Sources/JSIL.WebWorker.Loaders.js b/JSIL.Libraries/Sources/JSIL.WebWorker.Loaders.js new file mode 100644 index 000000000..073b214d3 --- /dev/null +++ b/JSIL.Libraries/Sources/JSIL.WebWorker.Loaders.js @@ -0,0 +1,13 @@ +var assetLoaders = { + "Library": function loadLibrary (filename, data, onError, onDoneLoading, state) { + var uri = jsilConfig.libraryRoot + filename; + importScripts(uri); + }, + "Script": function loadScript (filename, data, onError, onDoneLoading, state) { + var uri = jsilConfig.scriptRoot + filename; + importScripts(uri); + }, +}; + +function initAssetLoaders () { +}; \ No newline at end of file diff --git a/JSIL.Libraries/Sources/JSIL.WebWorker.js b/JSIL.Libraries/Sources/JSIL.WebWorker.js new file mode 100644 index 000000000..c5450278b --- /dev/null +++ b/JSIL.Libraries/Sources/JSIL.WebWorker.js @@ -0,0 +1,103 @@ +"use strict"; + +JSIL.DeclareNamespace("JSIL.WebWorker", false); + +JSIL.WebWorker.StdOutService = function () { +}; + +JSIL.WebWorker.StdOutService.prototype.write = function (text) { + postMessage("output " + text); +}; + + +JSIL.WebWorker.StdErrService = function () { +}; + +JSIL.WebWorker.StdErrService.prototype.write = function (text) { + var trimmed = String(text).trim(); + if (trimmed[trimmed.length - 1] === "\n") { + text = trimmed.substr(0, trimmed.length - 1); + } + + postMessage("error " + text); +}; + +(function () { + JSIL.Host.registerServices({ + stdout: new JSIL.WebWorker.StdOutService(), + stderr: new JSIL.WebWorker.StdErrService() + }); +})(); + +function reportException (e) { + var stack = ""; + try { + stack = e.stack || ""; + } catch (ex) { + stack = ""; + } + + JSIL.Host.logWriteLine("// EXCEPTION:"); + JSIL.Host.logWriteLine(String(e)); + if (stack.length > 0) { + JSIL.Host.logWriteLine("// STACK:"); + JSIL.Host.logWriteLine(stack); + } + JSIL.Host.logWriteLine("// ENDEXCEPTION"); + + throw e; +}; + +function loadAssets (assets) { + for (var i = 0, l = assets.length; i < l; i++) { + var assetSpec = assets[i]; + + var assetType = assetSpec[0]; + var assetPath = assetSpec[1]; + var assetData = assetSpec[2] || null; + + var assetLoader = assetLoaders[assetType]; + + assetLoader(assetPath, assetData); + } +}; + +// onLoad will be called from the worker. +var onLoad = function () { + initAssetLoaders(); + + var seenFilenames = {}; + + var pushAsset = function (assetSpec) { + var filename = assetSpec[1]; + if (seenFilenames[filename]) + return; + + seenFilenames[filename] = true; + allAssetsToLoad.push(assetSpec); + } + + var allAssetsToLoad = []; + + if (typeof (assetsToLoad) !== "undefined") { + for (var i = 0, l = assetsToLoad.length; i < l; i++) + pushAsset(assetsToLoad[i]); + } + + if (typeof (contentManifest) === "object") { + for (var k in contentManifest) { + var subManifest = contentManifest[k]; + + for (var i = 0, l = subManifest.length; i < l; i++) + pushAsset(subManifest[i]); + + } + } + + loadAssets(allAssetsToLoad); + JSIL.Initialize(); + JSIL.Host.runInitCallbacks(); + if (typeof (runMain) === "function") { + runMain(); + } +}; \ No newline at end of file diff --git a/JSIL.Libraries/Sources/JSIL.js b/JSIL.Libraries/Sources/JSIL.js index 6d36d9b0d..b201a303c 100644 --- a/JSIL.Libraries/Sources/JSIL.js +++ b/JSIL.Libraries/Sources/JSIL.js @@ -42,6 +42,15 @@ var $jsilloaderstate = { }; (function loadJSIL (config) { + function getLibraryPrefix(config) { + if (config.bclMode === "translated") { + return "TranslatedBCL/"; + } else if (config.bclMode === "stubbed") { + return "StubbedBCL/"; + } + + return "IgnoredBCL/"; + } function Environment_Browser (config) { var self = this; @@ -67,14 +76,7 @@ var $jsilloaderstate = { } } - var libraryPrefix; - if (config.bclMode === "translated") { - libraryPrefix = "TranslatedBCL/"; - } else if (config.bclMode === "stubbed") { - libraryPrefix = "StubbedBCL/"; - } else { - libraryPrefix = "IgnoredBCL/"; - } + var libraryPrefix = getLibraryPrefix(config); contentManifest["JSIL"].push(["Library", "JSIL.Storage.js"]); contentManifest["JSIL"].push(["Library", libraryPrefix + "JSIL.IO.js"]); @@ -130,14 +132,7 @@ var $jsilloaderstate = { var self = this; this.config = config; - var libraryPrefix; - if (config.bclMode === "translated") { - libraryPrefix = "TranslatedBCL/"; - } else if (config.bclMode === "stubbed") { - libraryPrefix = "StubbedBCL/"; - } else { - libraryPrefix = "IgnoredBCL/"; - } + var libraryPrefix = getLibraryPrefix(config); contentManifest["JSIL"].push(["Library", "JSIL.Storage.js"]); contentManifest["JSIL"].push(["Library", libraryPrefix + "JSIL.IO.js"]); @@ -161,6 +156,31 @@ var $jsilloaderstate = { this.loadScript(libraryRoot + "JSIL.Shell.Loaders.js"); }; + + function Environment_WebWorker(config) { + var self = this; + this.config = config; + + var libraryPrefix = getLibraryPrefix(config); + + contentManifest["JSIL"].push(["Library", "JSIL.Storage.js"]); + contentManifest["JSIL"].push(["Library", libraryPrefix + "JSIL.IO.js"]); + contentManifest["JSIL"].push(["Library", libraryPrefix + "JSIL.XML.js"]); + }; + + Environment_WebWorker.prototype.getUserSetting = function (key) { + return false; + }; + + Environment_WebWorker.prototype.loadScript = function (uri) { + importScripts(uri); + }; + + Environment_WebWorker.prototype.loadEnvironmentScripts = function () { + this.loadScript(libraryRoot + "JSIL.WebWorker.js"); + this.loadScript(libraryRoot + "JSIL.WebWorker.Loaders.js"); + }; + var priorModule = JSIL.GlobalNamespace.Module; JSIL.BeginLoadNativeLibrary = function (name) { @@ -202,7 +222,8 @@ var $jsilloaderstate = { var environments = { "browser": Environment_Browser, - "spidermonkey_shell": Environment_SpidermonkeyShell + "spidermonkey_shell": Environment_SpidermonkeyShell, + "webworker": Environment_WebWorker } if (!config.environment) { From 6d58e8592bcd89adcfe47892ffc9250634b5c912 Mon Sep 17 00:00:00 2001 From: Igor Kiselev Date: Wed, 20 Apr 2016 19:09:40 -0700 Subject: [PATCH 2/2] Compatibility with browserify. --- JSIL.Libraries/Sources/JSIL.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/JSIL.Libraries/Sources/JSIL.js b/JSIL.Libraries/Sources/JSIL.js index b201a303c..b9bdb8158 100644 --- a/JSIL.Libraries/Sources/JSIL.js +++ b/JSIL.Libraries/Sources/JSIL.js @@ -31,15 +31,15 @@ globalNamespace.jsilConfig = {}; if (typeof (globalNamespace.contentManifest) !== "object") - globalNamespace.contentManifest = {}; -})(this); + globalNamespace.contentManifest = { + "JSIL": [] + }; -contentManifest["JSIL"] = []; - -var $jsilloaderstate = { - environment: null, - loadFailures: [] -}; + globalNamespace.$jsilloaderstate = { + environment: null, + loadFailures: [] + }; +})(typeof(self) !== "undefined" ? self : this); (function loadJSIL (config) { function getLibraryPrefix(config) {