dom/workers/test/extensions/traditional/WorkerTest.js

changeset 0
6474c204b198
     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]);

mercurial