michael@0: /** michael@0: * Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ michael@0: */ michael@0: "use strict"; michael@0: michael@0: if (self.name != "FrameWorker") { michael@0: throw new Error("Bad worker name: " + self.name); michael@0: } michael@0: michael@0: var registeredPorts = []; michael@0: var errorCount = 0; michael@0: var storedData; michael@0: michael@0: self.onconnect = function(event) { michael@0: var port = event.ports[0]; michael@0: michael@0: if (registeredPorts.length) { michael@0: var data = { michael@0: type: "connect" michael@0: }; michael@0: michael@0: registeredPorts.forEach(function(registeredPort) { michael@0: registeredPort.postMessage(data); michael@0: }); michael@0: } michael@0: michael@0: port.onmessage = function(event) { michael@0: switch (event.data.command) { michael@0: case "start": michael@0: break; michael@0: michael@0: case "error": michael@0: throw new Error("Expected"); michael@0: michael@0: case "store": michael@0: storedData = event.data.data; michael@0: break; michael@0: michael@0: case "retrieve": michael@0: var data = { michael@0: type: "result", michael@0: data: storedData michael@0: }; michael@0: port.postMessage(data); michael@0: break; michael@0: michael@0: default: michael@0: throw new Error("Unknown command '" + error.data.command + "'"); michael@0: } michael@0: }; michael@0: michael@0: registeredPorts.push(port); michael@0: }; michael@0: michael@0: self.onerror = function(message, filename, lineno) { michael@0: if (!errorCount++) { michael@0: var data = { michael@0: type: "worker-error", michael@0: message: message, michael@0: filename: filename, michael@0: lineno: lineno michael@0: }; michael@0: michael@0: registeredPorts.forEach(function (registeredPort) { michael@0: registeredPort.postMessage(data); michael@0: }); michael@0: michael@0: // Prevent the error from propagating the first time only. michael@0: return true; michael@0: } michael@0: };