JSDocument manages a single JavaScript source document
EDITING
Editing the document will cause the script to be reloaded via the ScriptAgent, which updates the implementation of all functions without loosing any state. To support redrawing canvases, jQuery must be loaded and a rerender method must be attached to every canvas that clears and renders the canvas.
HIGHLIGHTING
JSDocument supports highlighting nodes from the HighlightAgent. Support for highlighting the nodes that were created / touched by the current line is missing.
var JSDocument = function JSDocument(doc, editor) {
if (!editor) {
return;
}
this.doc = doc;
this.editor = editor;
this.onHighlight = this.onHighlight.bind(this);
this.onChange = this.onChange.bind(this);
this.onCursorActivity = this.onCursorActivity.bind(this);
HighlightAgent.on("highlight", this.onHighlight);
this.editor.on("change", this.onChange);
this.editor.on("cursorActivity", this.onCursorActivity);
this.onCursorActivity();
};
// JSDocument doesn't dispatch events, but the "live document" interface requires having an on() API
EventDispatcher.makeEventDispatcher(JSDocument.prototype);
Close the document
JSDocument.prototype.close = function close() {
if (!this.editor) {
return;
}
HighlightAgent.off("highlight", this.onHighlight);
this.editor.off("change", this.onChange);
this.editor.off("cursorActivity", this.onCursorActivity);
this.onHighlight();
};
JSDocument.prototype.script = function script() {
return ScriptAgent.scriptForURL(this.doc.url);
};
Triggered on change by the editor
JSDocument.prototype.onChange = function onChange(event, editor, change) {
var src = this.doc.getText();
Inspector.Debugger.setScriptSource(this.script().scriptId, src, function onSetScriptSource(res) {
Inspector.Runtime.evaluate("if($)$(\"canvas\").each(function(i,e){if(e.rerender)e.rerender()})");
}.bind(this));
};
Triggered on cursor activity by the editor
JSDocument.prototype.onCursorActivity = function onCursorActivity(event, editor) {
};
Triggered by the HighlightAgent to highlight a node in the editor
JSDocument.prototype.onHighlight = function onHighlight(event, node) {
// clear an existing highlight
var codeMirror = this.editor._codeMirror;
var i;
for (i in this._highlight) {
codeMirror.removeLineClass(this._highlight[i], "wrap", "highlight");
}
this._highlight = [];
if (!node || !node.trace) {
return;
}
// go through the trace and find highlight the lines of this script
var scriptId = this.script().scriptId;
var callFrame, line;
for (i in node.trace) {
callFrame = node.trace[i];
if (callFrame.location && callFrame.location.scriptId === scriptId) {
line = callFrame.location.lineNumber;
codeMirror.addLineClass(line, "wrap", "highlight");
this._highlight.push(line);
}
}
};
// Export the class
module.exports = JSDocument;
});