summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/inspector/front-end/ScriptFormatter.js
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/inspector/front-end/ScriptFormatter.js')
-rw-r--r--Source/WebCore/inspector/front-end/ScriptFormatter.js162
1 files changed, 86 insertions, 76 deletions
diff --git a/Source/WebCore/inspector/front-end/ScriptFormatter.js b/Source/WebCore/inspector/front-end/ScriptFormatter.js
index 69ffb74..5c00e51 100644
--- a/Source/WebCore/inspector/front-end/ScriptFormatter.js
+++ b/Source/WebCore/inspector/front-end/ScriptFormatter.js
@@ -28,107 +28,117 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-WebInspector.ScriptFormatter = function(source)
+WebInspector.ScriptFormatter = function()
{
- this._originalSource = source;
- this._originalLineEndings = source.findAll("\n");
- this._originalLineEndings.push(source.length);
-}
-
-WebInspector.ScriptFormatter.locationToPosition = function(lineEndings, location)
-{
- var position = location.line ? lineEndings[location.line - 1] + 1 : 0;
- return position + location.column;
-}
-
-WebInspector.ScriptFormatter.positionToLocation = function(lineEndings, position)
-{
- var location = {};
- location.line = lineEndings.upperBound(position - 1);
- if (!location.line)
- location.column = position;
- else
- location.column = position - lineEndings[location.line - 1] - 1;
- return location;
+ this._worker = new Worker("ScriptFormatterWorker.js");
+ this._worker.onmessage = this._handleMessage.bind(this);
+ this._worker.onerror = this._handleError.bind(this);
+ this._tasks = [];
}
WebInspector.ScriptFormatter.prototype = {
- format: function(callback)
+ formatContent: function(content, callback)
{
- var worker = new Worker("scriptFormatterWorker.js");
- function messageHandler(event)
+ var chunks = this._splitContentIntoChunks(content.text, content.scriptRanges);
+
+ function didFormatChunks()
{
- var formattedSource = event.data;
- this._formatted = true;
- this._formattedSource = formattedSource;
- this._formattedLineEndings = formattedSource.findAll("\n");
- this._formattedLineEndings.push(formattedSource.length);
- this._buildMapping();
- callback(formattedSource);
+ var result = this._buildContentFromChunks(chunks);
+ callback(new WebInspector.FormattedSourceFrameContent(content, result.text, result.mapping));
}
- worker.onmessage = messageHandler.bind(this);
- worker.postMessage(this._originalSource);
+ this._formatChunks(chunks, 0, didFormatChunks.bind(this));
},
- _buildMapping: function()
+ _splitContentIntoChunks: function(text, scriptRanges)
{
- this._originalSymbolPositions = [];
- this._formattedSymbolPositions = [];
- var lastCodePosition = 0;
- var regexp = /[\$\.\w]+|{|}|;/g;
- while (true) {
- var match = regexp.exec(this._formattedSource);
- if (!match)
- break;
- var position = this._originalSource.indexOf(match[0], lastCodePosition);
- if (position === -1)
- continue;
- this._originalSymbolPositions.push(position);
- this._formattedSymbolPositions.push(match.index);
- lastCodePosition = position + match[0].length;
+ var chunks = [];
+ function addChunk(start, end, isScript)
+ {
+ var chunk = {};
+ chunk.start = start;
+ chunk.end = end;
+ chunk.isScript = isScript;
+ chunk.text = text.substring(start, end);
+ chunks.push(chunk);
+ }
+ var currentPosition = 0;
+ for (var i = 0; i < scriptRanges.length; ++i) {
+ var scriptRange = scriptRanges[i];
+ if (currentPosition < scriptRange.start)
+ addChunk(currentPosition, scriptRange.start, false);
+ addChunk(scriptRange.start, scriptRange.end, true);
+ currentPosition = scriptRange.end;
}
- this._originalSymbolPositions.push(this._originalSource.length);
- this._formattedSymbolPositions.push(this._formattedSource.length);
+ if (currentPosition < text.length)
+ addChunk(currentPosition, text.length, false);
+ return chunks;
},
- originalLineNumberToFormattedLineNumber: function(originalLineNumber)
+ _formatChunks: function(chunks, index, callback)
{
- if (!this._formatted)
- return originalLineNumber;
- var originalPosition = WebInspector.ScriptFormatter.locationToPosition(this._originalLineEndings, { line: originalLineNumber, column: 0 });
- return this.originalPositionToFormattedLineNumber(originalPosition);
+ while(true) {
+ if (index === chunks.length) {
+ callback();
+ return;
+ }
+ var chunk = chunks[index++];
+ if (chunk.isScript)
+ break;
+ }
+
+ function didFormat(formattedSource, mapping)
+ {
+ chunk.text = formattedSource;
+ chunk.mapping = mapping;
+ this._formatChunks(chunks, index, callback);
+ }
+ this._formatScript(chunk.text, didFormat.bind(this));
},
- formattedLineNumberToOriginalLineNumber: function(formattedLineNumber)
+ _buildContentFromChunks: function(chunks)
{
- if (!this._formatted)
- return formattedLineNumber;
- var originalPosition = this.formattedLineNumberToOriginalPosition(formattedLineNumber);
- return WebInspector.ScriptFormatter.positionToLocation(this._originalLineEndings, originalPosition).line;
+ var text = "";
+ var mapping = { original: [], formatted: [] };
+ for (var i = 0; i < chunks.length; ++i) {
+ var chunk = chunks[i];
+ mapping.original.push(chunk.start);
+ mapping.formatted.push(text.length);
+ if (chunk.isScript) {
+ if (text)
+ text += "\n";
+ for (var j = 0; j < chunk.mapping.original.length; ++j) {
+ mapping.original.push(chunk.mapping.original[j] + chunk.start);
+ mapping.formatted.push(chunk.mapping.formatted[j] + text.length);
+ }
+ text += chunk.text;
+ } else {
+ if (text)
+ text += "\n";
+ text += chunk.text;
+ }
+ mapping.original.push(chunk.end);
+ mapping.formatted.push(text.length);
+ }
+ return { text: text, mapping: mapping };
},
- originalPositionToFormattedLineNumber: function(originalPosition)
+ _formatScript: function(source, callback)
{
- var lineEndings = this._formatted ? this._formattedLineEndings : this._originalLineEndings;
- if (this._formatted)
- formattedPosition = this._convertPosition(this._originalSymbolPositions, this._formattedSymbolPositions, originalPosition);
- return WebInspector.ScriptFormatter.positionToLocation(lineEndings, formattedPosition).line;
+ this._tasks.push({ source: source, callback: callback });
+ this._worker.postMessage(source);
},
- formattedLineNumberToOriginalPosition: function(formattedLineNumber)
+ _handleMessage: function(event)
{
- var lineEndings = this._formatted ? this._formattedLineEndings : this._originalLineEndings;
- var formattedPosition = WebInspector.ScriptFormatter.locationToPosition(lineEndings, { line: formattedLineNumber, column: 0 });
- if (!this._formatted)
- return formattedPosition;
- return this._convertPosition(this._formattedSymbolPositions, this._originalSymbolPositions, formattedPosition);
+ var task = this._tasks.shift();
+ task.callback(event.data.formattedSource, event.data.mapping);
},
- _convertPosition: function(symbolPositions1, symbolPositions2, position)
+ _handleError: function(event)
{
- var index = symbolPositions1.upperBound(position);
- if (index === symbolPositions2.length - 1)
- return symbolPositions2[index] - 1;
- return symbolPositions2[index];
+ console.warn("Error in script formatter worker:", event);
+ event.preventDefault()
+ var task = this._tasks.shift();
+ task.callback(task.source, { original: [], formatted: [] });
}
}