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..b9bdb8158 100644
--- a/JSIL.Libraries/Sources/JSIL.js
+++ b/JSIL.Libraries/Sources/JSIL.js
@@ -31,17 +31,26 @@
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) {
+ 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) {