summaryrefslogtreecommitdiffstats
path: root/dom/workers/test/extensions/traditional/WorkerTest.js
blob: 5890c0d4c68dfd44aaa6821584c7760bd2f8ce63 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/**
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;

Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");

var gWorkerAndCallback = {
  _worker: null,
  _callback: null,

  _ensureStarted: function() {
    if (!this._worker) {
      throw new Error("Not yet started!");
    }
  },

  start: function() {
    if (!this._worker) {
      var worker = new Worker("chrome://worker/content/worker.js");
      worker.onerror = function(event) {
        Cu.reportError(event.message);
        event.preventDefault();
      };

      this._worker = worker;
    }
  },

  stop: function() {
    if (this._worker) {
      try {
        this.terminate();
      }
      catch(e) {
        Cu.reportError(e);
      }
      this._worker = null;
    }
  },

  set callback(val) {
    this._ensureStarted();
    if (val) {
      var callback = val.QueryInterface(Ci.nsIWorkerTestCallback);
      if (this.callback != callback) {
        this._worker.onmessage = function(event) {
          callback.onmessage(event.data);
        };
        this._worker.onerror = function(event) {
          callback.onerror(event.message);
          event.preventDefault();
        };
        this._callback = callback;
      }
    }
    else {
      this._worker.onmessage = null;
      this._worker.onerror = null;
      this._callback = null;
    }
  },

  get callback() {
    return this._callback;
  },

  postMessage: function(data) {
    this._ensureStarted();
    this._worker.postMessage(data);
  },

  terminate: function() {
    this._ensureStarted();
    this._worker.terminate();
    this.callback = null;
  }
};

function WorkerTest() {
}
WorkerTest.prototype = {
  observe: function(subject, topic, data) {
    switch(topic) {
      case "profile-after-change":
        gWorkerAndCallback.start();
        Services.obs.addObserver(this, "profile-before-change", false);
        break;
      case "profile-before-change":
        gWorkerAndCallback.stop();
        break;
      default:
        Cu.reportError("Unknown topic: " + topic);
    }
  },

  set callback(val) {
    gWorkerAndCallback.callback = val;
  },

  get callback() {
    return gWorkerAndCallback.callback;
  },

  postMessage: function(message) {
    gWorkerAndCallback.postMessage(message);
  },

  terminate: function() {
    gWorkerAndCallback.terminate();
  },

  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsIWorkerTest]),
  classID: Components.ID("{3b52b935-551f-4606-ba4c-decc18b67bfd}")
};

this.NSGetFactory = XPCOMUtils.generateNSGetFactory([WorkerTest]);