diff --git a/lib/ace/mode/coffee.js b/lib/ace/mode/coffee.js index 01584d54..563139c7 100644 --- a/lib/ace/mode/coffee.js +++ b/lib/ace/mode/coffee.js @@ -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]); diff --git a/lib/ace/mode/css.js b/lib/ace/mode/css.js index 9f89228a..3331002b 100644 --- a/lib/ace/mode/css.js +++ b/lib/ace/mode/css.js @@ -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 = []; diff --git a/lib/ace/mode/javascript.js b/lib/ace/mode/javascript.js index 797d57e2..cac492d3 100644 --- a/lib/ace/mode/javascript.js +++ b/lib/ace/mode/javascript.js @@ -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 = []; diff --git a/lib/ace/worker/worker_client.js b/lib/ace/worker/worker_client.js index 25391e44..d7a2c172 100644 --- a/lib/ace/worker/worker_client.js +++ b/lib/ace/worker/worker_client.js @@ -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);