1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/workers/test/extensions/traditional/WorkerTest.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,132 @@ 1.4 +/** 1.5 + * Any copyright is dedicated to the Public Domain. 1.6 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.7 + */ 1.8 + 1.9 +const Cc = Components.classes; 1.10 +const Ci = Components.interfaces; 1.11 +const Cu = Components.utils; 1.12 + 1.13 +Cu.import("resource://gre/modules/Services.jsm"); 1.14 +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); 1.15 + 1.16 +var gWorkerAndCallback = { 1.17 + _worker: null, 1.18 + _callback: null, 1.19 + 1.20 + _ensureStarted: function() { 1.21 + if (!this._worker) { 1.22 + throw new Error("Not yet started!"); 1.23 + } 1.24 + }, 1.25 + 1.26 + start: function() { 1.27 + if (!this._worker) { 1.28 + var file = __LOCATION__.parent.parent; 1.29 + var fileuri = file.isDirectory() ? 1.30 + Services.io.newFileURI(file) : 1.31 + Services.io.newURI('jar:' + file.path + '!/', null, null); 1.32 + var resourceName = "worker-test"; 1.33 + 1.34 + Services.io.getProtocolHandler("resource"). 1.35 + QueryInterface(Ci.nsIResProtocolHandler). 1.36 + setSubstitution(resourceName, fileuri); 1.37 + 1.38 + var worker = new Worker("resource://" + resourceName + "/worker.js"); 1.39 + worker.onerror = function(event) { 1.40 + Cu.reportError(event.message); 1.41 + event.preventDefault(); 1.42 + }; 1.43 + 1.44 + this._worker = worker; 1.45 + } 1.46 + }, 1.47 + 1.48 + stop: function() { 1.49 + if (this._worker) { 1.50 + try { 1.51 + this.terminate(); 1.52 + } 1.53 + catch(e) { 1.54 + Cu.reportError(e); 1.55 + } 1.56 + this._worker = null; 1.57 + } 1.58 + }, 1.59 + 1.60 + set callback(val) { 1.61 + this._ensureStarted(); 1.62 + if (val) { 1.63 + var callback = val.QueryInterface(Ci.nsIWorkerTestCallback); 1.64 + if (this.callback != callback) { 1.65 + this._worker.onmessage = function(event) { 1.66 + callback.onmessage(event.data); 1.67 + }; 1.68 + this._worker.onerror = function(event) { 1.69 + callback.onerror(event.message); 1.70 + event.preventDefault(); 1.71 + }; 1.72 + this._callback = callback; 1.73 + } 1.74 + } 1.75 + else { 1.76 + this._worker.onmessage = null; 1.77 + this._worker.onerror = null; 1.78 + this._callback = null; 1.79 + } 1.80 + }, 1.81 + 1.82 + get callback() { 1.83 + return this._callback; 1.84 + }, 1.85 + 1.86 + postMessage: function(data) { 1.87 + this._ensureStarted(); 1.88 + this._worker.postMessage(data); 1.89 + }, 1.90 + 1.91 + terminate: function() { 1.92 + this._ensureStarted(); 1.93 + this._worker.terminate(); 1.94 + this.callback = null; 1.95 + } 1.96 +}; 1.97 + 1.98 +function WorkerTest() { 1.99 +} 1.100 +WorkerTest.prototype = { 1.101 + observe: function(subject, topic, data) { 1.102 + switch(topic) { 1.103 + case "profile-after-change": 1.104 + gWorkerAndCallback.start(); 1.105 + Services.obs.addObserver(this, "profile-before-change", false); 1.106 + break; 1.107 + case "profile-before-change": 1.108 + gWorkerAndCallback.stop(); 1.109 + break; 1.110 + default: 1.111 + Cu.reportError("Unknown topic: " + topic); 1.112 + } 1.113 + }, 1.114 + 1.115 + set callback(val) { 1.116 + gWorkerAndCallback.callback = val; 1.117 + }, 1.118 + 1.119 + get callback() { 1.120 + return gWorkerAndCallback.callback; 1.121 + }, 1.122 + 1.123 + postMessage: function(message) { 1.124 + gWorkerAndCallback.postMessage(message); 1.125 + }, 1.126 + 1.127 + terminate: function() { 1.128 + gWorkerAndCallback.terminate(); 1.129 + }, 1.130 + 1.131 + QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsIWorkerTest]), 1.132 + classID: Components.ID("{3b52b935-551f-4606-ba4c-decc18b67bfd}") 1.133 +}; 1.134 + 1.135 +this.NSGetFactory = XPCOMUtils.generateNSGetFactory([WorkerTest]);