remove listeners when worker is terminated

fixes bug with workers on firefox 8.0a
This commit is contained in:
nightwing 2011-10-04 21:53:33 +05:00
commit fdb8372597
4 changed files with 28 additions and 32 deletions

View file

@ -97,17 +97,8 @@ oop.inherits(Mode, TextMode);
};
this.createWorker = function(session) {
var doc = session.getDocument();
var worker = new WorkerClient(["ace", "pilot"], "worker-coffee.js", "ace/mode/coffee_worker", "Worker");
worker.call("setValue", [doc.getValue()]);
doc.on("change", function(e) {
e.range = {
start: e.data.range.start,
end: e.data.range.end
};
worker.emit("change", e);
});
worker.attachToDocument(session.getDocument());
worker.on("error", function(e) {
session.setAnnotations([e.data]);

View file

@ -78,17 +78,8 @@ oop.inherits(Mode, TextMode);
};
this.createWorker = function(session) {
var doc = session.getDocument();
var worker = new WorkerClient(["ace", "pilot"], "worker-css.js", "ace/mode/css_worker", "Worker");
worker.call("setValue", [doc.getValue()]);
doc.on("change", function(e) {
e.range = {
start: e.data.range.start,
end: e.data.range.end
};
worker.emit("change", e);
});
worker.attachToDocument(session.getDocument());
worker.on("csslint", function(e) {
var errors = [];

View file

@ -125,17 +125,8 @@ oop.inherits(Mode, TextMode);
};
this.createWorker = function(session) {
var doc = session.getDocument();
var worker = new WorkerClient(["ace", "pilot"], "worker-javascript.js", "ace/mode/javascript_worker", "JavaScriptWorker");
worker.call("setValue", [doc.getValue()]);
doc.on("change", function(e) {
e.range = {
start: e.data.range.start,
end: e.data.range.end
};
worker.emit("change", e);
});
worker.attachToDocument(session.getDocument());
worker.on("jslint", function(results) {
var errors = [];

View file

@ -42,7 +42,7 @@ var EventEmitter = require("pilot/event_emitter").EventEmitter;
var WorkerClient = function(topLevelNamespaces, packagedJs, module, classname) {
this.callbacks = [];
this.changeListener = this.changeListener.bind(this);
if (require.packaged) {
var base = this.$guessBasePath();
@ -138,6 +138,9 @@ var WorkerClient = function(topLevelNamespaces, packagedJs, module, classname) {
this.terminate = function() {
this._dispatchEvent("terminate", {});
this.$worker.terminate();
this.$worker = null;
this.$doc.removeEventListener("change", this.changeListener);
this.$doc = null;
};
this.send = function(cmd, args) {
@ -157,8 +160,28 @@ var WorkerClient = function(topLevelNamespaces, packagedJs, module, classname) {
try {
this.$worker.postMessage({event: event, data: data});
}
catch(ex) {}
catch(ex) {
console.log("no worker");
console.trace();
}
};
this.attachToDocument = function(doc) {
if(this.$doc)
this.terminate();
this.$doc = doc;
this.call("setValue", [doc.getValue()]);
doc.on("change", this.changeListener);
};
this.changeListener = function(e) {
e.range = {
start: e.data.range.start,
end: e.data.range.end
};
this.emit("change", e);
};
}).call(WorkerClient.prototype);