aboutsummaryrefslogtreecommitdiff
path: root/src/proxyWorker.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/proxyWorker.js')
-rw-r--r--src/proxyWorker.js51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/proxyWorker.js b/src/proxyWorker.js
index 5cdc4455..8d641b0d 100644
--- a/src/proxyWorker.js
+++ b/src/proxyWorker.js
@@ -6,6 +6,16 @@ function EventListener() {
if (!this.listeners[event]) this.listeners[event] = [];
this.listeners[event].push(func);
};
+
+ this.fireEvent = function(event) {
+ event.preventDefault = function(){};
+
+ if (event.type in this.listeners) {
+ this.listeners[event.type].forEach(function(listener) {
+ listener(event);
+ });
+ }
+ };
};
var window = this;
@@ -75,3 +85,44 @@ Module.printErr = function(x) {
postMessage({ target: 'stderr', content: x });
};
+// buffer messages until the program starts to run
+
+var messageBuffer = null;
+
+function messageResender() {
+ if (calledMain) {
+ assert(messageBuffer && messageBuffer.length > 0);
+ messageBuffer.forEach(function(message) {
+ onmessage(message);
+ });
+ messageBuffer = null;
+ } else {
+ setTimeout(messageResender, 100);
+ }
+}
+
+onmessage = function(message) {
+ if (!calledMain) {
+ if (!messageBuffer) {
+ messageBuffer = [];
+ setTimeout(messageResender, 100);
+ }
+ messageBuffer.push(message);
+ }
+ switch (message.data.target) {
+ case 'document': {
+ document.fireEvent(message.data.event);
+ break;
+ }
+ case 'window': {
+ window.fireEvent(message.data.event);
+ break;
+ }
+ case 'canvas': {
+ Module.canvas.fireEvent(message.data.event);
+ break;
+ }
+ default: throw 'wha? ' + message.data.target;
+ }
+};
+