Index: third_party/WebKit/Source/devtools/front_end/script_formatter_worker/ScriptFormatterWorker.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/script_formatter_worker/ScriptFormatterWorker.js b/third_party/WebKit/Source/devtools/front_end/script_formatter_worker/ScriptFormatterWorker.js |
deleted file mode 100644 |
index 9b2afc85f59347fe0fecd7ff72ea1a1d8eb1b6db..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/Source/devtools/front_end/script_formatter_worker/ScriptFormatterWorker.js |
+++ /dev/null |
@@ -1,535 +0,0 @@ |
-/* |
- * Copyright (C) 2011 Google Inc. All rights reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions are |
- * met: |
- * |
- * * Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * * Redistributions in binary form must reproduce the above |
- * copyright notice, this list of conditions and the following disclaimer |
- * in the documentation and/or other materials provided with the |
- * distribution. |
- * * Neither the name of Google Inc. nor the names of its |
- * contributors may be used to endorse or promote products derived from |
- * this software without specific prior written permission. |
- * |
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
-var FormatterWorker = { |
- /** |
- * @param {string} mimeType |
- * @return {function(string, function(string, ?string, number, number))} |
- */ |
- createTokenizer: function(mimeType) |
- { |
- var mode = CodeMirror.getMode({indentUnit: 2}, mimeType); |
- var state = CodeMirror.startState(mode); |
- function tokenize(line, callback) |
- { |
- var stream = new CodeMirror.StringStream(line); |
- while (!stream.eol()) { |
- var style = mode.token(stream, state); |
- var value = stream.current(); |
- callback(value, style, stream.start, stream.start + value.length); |
- stream.start = stream.pos; |
- } |
- } |
- return tokenize; |
- } |
-}; |
- |
-/** |
- * @typedef {{indentString: string, content: string, mimeType: string}} |
- */ |
-var FormatterParameters; |
- |
-self.onmessage = function(event) { |
- var data = /** @type !{method: string, params: !FormatterParameters} */ (event.data); |
- if (!data.method) |
- return; |
- |
- FormatterWorker[data.method](data.params); |
-}; |
- |
-/** |
- * @param {!FormatterParameters} params |
- */ |
-FormatterWorker.format = function(params) |
-{ |
- // Default to a 4-space indent. |
- var indentString = params.indentString || " "; |
- var result = {}; |
- |
- if (params.mimeType === "text/html") { |
- var formatter = new FormatterWorker.HTMLFormatter(indentString); |
- result = formatter.format(params.content); |
- } else if (params.mimeType === "text/css") { |
- result.mapping = { original: [0], formatted: [0] }; |
- result.content = FormatterWorker._formatCSS(params.content, result.mapping, 0, 0, indentString); |
- } else { |
- result.mapping = { original: [0], formatted: [0] }; |
- result.content = FormatterWorker._formatScript(params.content, result.mapping, 0, 0, indentString); |
- } |
- postMessage(result); |
-} |
- |
-/** |
- * @param {!Object} params |
- */ |
-FormatterWorker.javaScriptOutline = function(params) |
-{ |
- var chunkSize = 100000; // characters per data chunk |
- var outlineChunk = []; |
- var previousIdentifier = null; |
- var previousToken = null; |
- var processedChunkCharacters = 0; |
- var addedFunction = false; |
- var isReadingArguments = false; |
- var argumentsText = ""; |
- var currentFunction = null; |
- var tokenizer = new WebInspector.AcornTokenizer(params.content); |
- var AT = WebInspector.AcornTokenizer; |
- |
- while (tokenizer.peekToken()) { |
- var token = /** @type {!Acorn.TokenOrComment} */(tokenizer.nextToken()); |
- if (AT.lineComment(token) || AT.blockComment(token)) |
- continue; |
- |
- var tokenValue = params.content.substring(token.start, token.end); |
- |
- if (AT.identifier(token) && previousToken && (AT.identifier(previousToken, "get") || AT.identifier(previousToken, "set"))) { |
- currentFunction = { |
- line: tokenizer.tokenLineStart(), |
- column: tokenizer.tokenColumnStart(), |
- name : previousToken.value + " " + tokenValue |
- }; |
- addedFunction = true; |
- previousIdentifier = null; |
- } else if (AT.identifier(token)) { |
- previousIdentifier = tokenValue; |
- if (tokenValue && previousToken && AT.keyword(previousToken, "function")) { |
- // A named function: "function f...". |
- currentFunction = { |
- line: tokenizer.tokenLineStart(), |
- column: tokenizer.tokenColumnStart(), |
- name: tokenValue |
- }; |
- addedFunction = true; |
- previousIdentifier = null; |
- } |
- } else if (AT.keyword(token, "function") && previousIdentifier && previousToken && AT.punctuator(previousToken, ":=")) { |
- // Anonymous function assigned to an identifier: "...f = function..." |
- // or "funcName: function...". |
- currentFunction = { |
- line: tokenizer.tokenLineStart(), |
- column: tokenizer.tokenColumnStart(), |
- name: previousIdentifier |
- }; |
- addedFunction = true; |
- previousIdentifier = null; |
- } else if (AT.punctuator(token, ".") && previousToken && AT.identifier(previousToken)) |
- previousIdentifier += "."; |
- else if (AT.punctuator(token, "(") && addedFunction) |
- isReadingArguments = true; |
- if (isReadingArguments && tokenValue) |
- argumentsText += tokenValue; |
- |
- if (AT.punctuator(token, ")") && isReadingArguments) { |
- addedFunction = false; |
- isReadingArguments = false; |
- currentFunction.arguments = argumentsText.replace(/,[\r\n\s]*/g, ", ").replace(/([^,])[\r\n\s]+/g, "$1"); |
- argumentsText = ""; |
- outlineChunk.push(currentFunction); |
- } |
- |
- previousToken = token; |
- processedChunkCharacters += token.end - token.start; |
- |
- if (processedChunkCharacters >= chunkSize) { |
- postMessage({ chunk: outlineChunk, isLastChunk: false }); |
- outlineChunk = []; |
- processedChunkCharacters = 0; |
- } |
- } |
- |
- postMessage({ chunk: outlineChunk, isLastChunk: true }); |
-} |
- |
-FormatterWorker.CSSParserStates = { |
- Initial: "Initial", |
- Selector: "Selector", |
- Style: "Style", |
- PropertyName: "PropertyName", |
- PropertyValue: "PropertyValue", |
- AtRule: "AtRule" |
-}; |
- |
-FormatterWorker.parseCSS = function(params) |
-{ |
- FormatterWorker._innerParseCSS(params.content, postMessage); |
-} |
- |
-FormatterWorker._innerParseCSS = function(text, chunkCallback) |
-{ |
- var chunkSize = 100000; // characters per data chunk |
- var lines = text.split("\n"); |
- var rules = []; |
- var processedChunkCharacters = 0; |
- |
- var state = FormatterWorker.CSSParserStates.Initial; |
- var rule; |
- var property; |
- var UndefTokenType = {}; |
- |
- var disabledRules = []; |
- function disabledRulesCallback(chunk) |
- { |
- disabledRules = disabledRules.concat(chunk.chunk); |
- } |
- |
- /** |
- * @param {string} tokenValue |
- * @param {?string} tokenTypes |
- * @param {number} column |
- * @param {number} newColumn |
- */ |
- function processToken(tokenValue, tokenTypes, column, newColumn) |
- { |
- var tokenType = tokenTypes ? tokenTypes.split(" ").keySet() : UndefTokenType; |
- switch (state) { |
- case FormatterWorker.CSSParserStates.Initial: |
- if (tokenType["qualifier"] || tokenType["builtin"] || tokenType["tag"]) { |
- rule = { |
- selectorText: tokenValue, |
- lineNumber: lineNumber, |
- columnNumber: column, |
- properties: [], |
- }; |
- state = FormatterWorker.CSSParserStates.Selector; |
- } else if (tokenType["def"]) { |
- rule = { |
- atRule: tokenValue, |
- lineNumber: lineNumber, |
- columnNumber: column, |
- }; |
- state = FormatterWorker.CSSParserStates.AtRule; |
- } |
- break; |
- case FormatterWorker.CSSParserStates.Selector: |
- if (tokenValue === "{" && tokenType === UndefTokenType) { |
- rule.selectorText = rule.selectorText.trim(); |
- rule.styleRange = createRange(lineNumber, newColumn); |
- state = FormatterWorker.CSSParserStates.Style; |
- } else { |
- rule.selectorText += tokenValue; |
- } |
- break; |
- case FormatterWorker.CSSParserStates.AtRule: |
- if ((tokenValue === ";" || tokenValue === "{") && tokenType === UndefTokenType) { |
- rule.atRule = rule.atRule.trim(); |
- rules.push(rule); |
- state = FormatterWorker.CSSParserStates.Initial; |
- } else { |
- rule.atRule += tokenValue; |
- } |
- break; |
- case FormatterWorker.CSSParserStates.Style: |
- if (tokenType["meta"] || tokenType["property"]) { |
- property = { |
- name: tokenValue, |
- value: "", |
- range: createRange(lineNumber, column), |
- nameRange: createRange(lineNumber, column) |
- }; |
- state = FormatterWorker.CSSParserStates.PropertyName; |
- } else if (tokenValue === "}" && tokenType === UndefTokenType) { |
- rule.styleRange.endLine = lineNumber; |
- rule.styleRange.endColumn = column; |
- rules.push(rule); |
- state = FormatterWorker.CSSParserStates.Initial; |
- } else if (tokenType["comment"]) { |
- // The |processToken| is called per-line, so no token spans more then one line. |
- // Support only a one-line comments. |
- if (tokenValue.substring(0, 2) !== "/*" || tokenValue.substring(tokenValue.length - 2) !== "*/") |
- break; |
- var uncommentedText = tokenValue.substring(2, tokenValue.length - 2); |
- var fakeRule = "a{\n" + uncommentedText + "}"; |
- disabledRules = []; |
- FormatterWorker._innerParseCSS(fakeRule, disabledRulesCallback); |
- if (disabledRules.length === 1 && disabledRules[0].properties.length === 1) { |
- var disabledProperty = disabledRules[0].properties[0]; |
- disabledProperty.disabled = true; |
- disabledProperty.range = createRange(lineNumber, column); |
- disabledProperty.range.endColumn = newColumn; |
- var lineOffset = lineNumber - 1; |
- var columnOffset = column + 2; |
- disabledProperty.nameRange.startLine += lineOffset; |
- disabledProperty.nameRange.startColumn += columnOffset; |
- disabledProperty.nameRange.endLine += lineOffset; |
- disabledProperty.nameRange.endColumn += columnOffset; |
- disabledProperty.valueRange.startLine += lineOffset; |
- disabledProperty.valueRange.startColumn += columnOffset; |
- disabledProperty.valueRange.endLine += lineOffset; |
- disabledProperty.valueRange.endColumn += columnOffset; |
- rule.properties.push(disabledProperty); |
- } |
- } |
- break; |
- case FormatterWorker.CSSParserStates.PropertyName: |
- if (tokenValue === ":" && tokenType === UndefTokenType) { |
- property.name = property.name; |
- property.nameRange.endLine = lineNumber; |
- property.nameRange.endColumn = column; |
- property.valueRange = createRange(lineNumber, newColumn); |
- state = FormatterWorker.CSSParserStates.PropertyValue; |
- } else if (tokenType["property"]) { |
- property.name += tokenValue; |
- } |
- break; |
- case FormatterWorker.CSSParserStates.PropertyValue: |
- if ((tokenValue === ";" || tokenValue === "}") && tokenType === UndefTokenType) { |
- property.value = property.value; |
- property.valueRange.endLine = lineNumber; |
- property.valueRange.endColumn = column; |
- property.range.endLine = lineNumber; |
- property.range.endColumn = tokenValue === ";" ? newColumn : column; |
- rule.properties.push(property); |
- if (tokenValue === "}") { |
- rule.styleRange.endLine = lineNumber; |
- rule.styleRange.endColumn = column; |
- rules.push(rule); |
- state = FormatterWorker.CSSParserStates.Initial; |
- } else { |
- state = FormatterWorker.CSSParserStates.Style; |
- } |
- } else if (!tokenType["comment"]) { |
- property.value += tokenValue; |
- } |
- break; |
- default: |
- console.assert(false, "Unknown CSS parser state."); |
- } |
- processedChunkCharacters += newColumn - column; |
- if (processedChunkCharacters > chunkSize) { |
- chunkCallback({ chunk: rules, isLastChunk: false }); |
- rules = []; |
- processedChunkCharacters = 0; |
- } |
- } |
- var tokenizer = FormatterWorker.createTokenizer("text/css"); |
- var lineNumber; |
- for (lineNumber = 0; lineNumber < lines.length; ++lineNumber) { |
- var line = lines[lineNumber]; |
- tokenizer(line, processToken); |
- processToken("\n", null, line.length, line.length + 1); |
- } |
- chunkCallback({ chunk: rules, isLastChunk: true }); |
- |
- /** |
- * @return {!{startLine: number, startColumn: number, endLine: number, endColumn: number}} |
- */ |
- function createRange(lineNumber, columnNumber) |
- { |
- return { |
- startLine: lineNumber, |
- startColumn: columnNumber, |
- endLine: lineNumber, |
- endColumn: columnNumber |
- }; |
- } |
-} |
- |
-/** |
- * @param {string} content |
- * @param {!{original: !Array.<number>, formatted: !Array.<number>}} mapping |
- * @param {number} offset |
- * @param {number} formattedOffset |
- * @param {string} indentString |
- * @return {string} |
- */ |
-FormatterWorker._formatScript = function(content, mapping, offset, formattedOffset, indentString) |
-{ |
- var formattedContent; |
- try { |
- var builder = new FormatterWorker.FormattedContentBuilder(mapping, offset, formattedOffset, indentString); |
- var formatter = new FormatterWorker.JavaScriptFormatter(content, builder); |
- formatter.format(); |
- formattedContent = builder.content(); |
- } catch (e) { |
- console.error(e); |
- formattedContent = content; |
- } |
- return formattedContent; |
-} |
- |
-/** |
- * @param {string} content |
- * @param {!{original: !Array.<number>, formatted: !Array.<number>}} mapping |
- * @param {number} offset |
- * @param {number} formattedOffset |
- * @param {string} indentString |
- * @return {string} |
- */ |
-FormatterWorker._formatCSS = function(content, mapping, offset, formattedOffset, indentString) |
-{ |
- var formattedContent; |
- try { |
- var builder = new FormatterWorker.FormattedContentBuilder(mapping, offset, formattedOffset, indentString); |
- var formatter = new FormatterWorker.CSSFormatter(content, builder); |
- formatter.format(); |
- formattedContent = builder.content(); |
- } catch (e) { |
- formattedContent = content; |
- } |
- return formattedContent; |
-} |
- |
-/** |
- * @constructor |
- * @param {string} indentString |
- */ |
-FormatterWorker.HTMLFormatter = function(indentString) |
-{ |
- this._indentString = indentString; |
-} |
- |
-FormatterWorker.HTMLFormatter.prototype = { |
- /** |
- * @param {string} content |
- * @return {!{content: string, mapping: {original: !Array.<number>, formatted: !Array.<number>}}} |
- */ |
- format: function(content) |
- { |
- this.line = content; |
- this._content = content; |
- this._formattedContent = ""; |
- this._mapping = { original: [0], formatted: [0] }; |
- this._position = 0; |
- |
- var scriptOpened = false; |
- var styleOpened = false; |
- var tokenizer = FormatterWorker.createTokenizer("text/html"); |
- var accumulatedTokenValue = ""; |
- var accumulatedTokenStart = 0; |
- |
- /** |
- * @this {FormatterWorker.HTMLFormatter} |
- */ |
- function processToken(tokenValue, tokenType, tokenStart, tokenEnd) { |
- if (!tokenType) |
- return; |
- tokenType = tokenType.split(" ").keySet(); |
- if (!tokenType["tag"]) |
- return; |
- if (tokenType["bracket"] && (tokenValue === "<" || tokenValue === "</")) { |
- accumulatedTokenValue = tokenValue; |
- accumulatedTokenStart = tokenStart; |
- return; |
- } |
- accumulatedTokenValue = accumulatedTokenValue + tokenValue.toLowerCase(); |
- if (accumulatedTokenValue === "<script") { |
- scriptOpened = true; |
- } else if (scriptOpened && tokenValue === ">") { |
- scriptOpened = false; |
- this._scriptStarted(tokenEnd); |
- } else if (accumulatedTokenValue === "</script") { |
- this._scriptEnded(accumulatedTokenStart); |
- } else if (accumulatedTokenValue === "<style") { |
- styleOpened = true; |
- } else if (styleOpened && tokenValue === ">") { |
- styleOpened = false; |
- this._styleStarted(tokenEnd); |
- } else if (accumulatedTokenValue === "</style") { |
- this._styleEnded(accumulatedTokenStart); |
- } |
- accumulatedTokenValue = ""; |
- } |
- tokenizer(content, processToken.bind(this)); |
- |
- this._formattedContent += this._content.substring(this._position); |
- return { content: this._formattedContent, mapping: this._mapping }; |
- }, |
- |
- /** |
- * @param {number} cursor |
- */ |
- _scriptStarted: function(cursor) |
- { |
- this._handleSubFormatterStart(cursor); |
- }, |
- |
- /** |
- * @param {number} cursor |
- */ |
- _scriptEnded: function(cursor) |
- { |
- this._handleSubFormatterEnd(FormatterWorker._formatScript, cursor); |
- }, |
- |
- /** |
- * @param {number} cursor |
- */ |
- _styleStarted: function(cursor) |
- { |
- this._handleSubFormatterStart(cursor); |
- }, |
- |
- /** |
- * @param {number} cursor |
- */ |
- _styleEnded: function(cursor) |
- { |
- this._handleSubFormatterEnd(FormatterWorker._formatCSS, cursor); |
- }, |
- |
- /** |
- * @param {number} cursor |
- */ |
- _handleSubFormatterStart: function(cursor) |
- { |
- this._formattedContent += this._content.substring(this._position, cursor); |
- this._formattedContent += "\n"; |
- this._position = cursor; |
- }, |
- |
- /** |
- * @param {function(string, !{formatted: !Array.<number>, original: !Array.<number>}, number, number, string)} formatFunction |
- * @param {number} cursor |
- */ |
- _handleSubFormatterEnd: function(formatFunction, cursor) |
- { |
- if (cursor === this._position) |
- return; |
- |
- var scriptContent = this._content.substring(this._position, cursor); |
- this._mapping.original.push(this._position); |
- this._mapping.formatted.push(this._formattedContent.length); |
- var formattedScriptContent = formatFunction(scriptContent, this._mapping, this._position, this._formattedContent.length, this._indentString); |
- |
- this._formattedContent += formattedScriptContent; |
- this._position = cursor; |
- } |
-} |
- |
-// A dummy javascript mode which is used only by htmlmixed mode to advance |
-// stream until a </script> is found. |
-CodeMirror.defineMode("javascript", function(config, parserConfig) { |
- return { |
- token: function(stream, state) |
- { |
- return stream.next(); |
- } |
- } |
-}); |