| Index: third_party/WebKit/Source/devtools/front_end/formatter_worker/CSSRuleParser.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/formatter_worker/CSSRuleParser.js b/third_party/WebKit/Source/devtools/front_end/formatter_worker/CSSRuleParser.js
|
| index 7bceb14e050e37302411599dc93fff11660ce889..58c15aacabda2987c0cad3c56565538854cbe993 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/formatter_worker/CSSRuleParser.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/formatter_worker/CSSRuleParser.js
|
| @@ -1,194 +1,183 @@
|
| // Copyright 2016 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
| -
|
| WebInspector.CSSParserStates = {
|
| - Initial: "Initial",
|
| - Selector: "Selector",
|
| - Style: "Style",
|
| - PropertyName: "PropertyName",
|
| - PropertyValue: "PropertyValue",
|
| - AtRule: "AtRule"
|
| + Initial: 'Initial',
|
| + Selector: 'Selector',
|
| + Style: 'Style',
|
| + PropertyName: 'PropertyName',
|
| + PropertyValue: 'PropertyValue',
|
| + AtRule: 'AtRule'
|
| };
|
|
|
| /**
|
| * @param {string} text
|
| */
|
| -WebInspector.parseCSS = function(text)
|
| -{
|
| - WebInspector._innerParseCSS(text, postMessage);
|
| +WebInspector.parseCSS = function(text) {
|
| + WebInspector._innerParseCSS(text, postMessage);
|
| };
|
|
|
| /**
|
| * @param {string} text
|
| * @param {function(*)} chunkCallback
|
| */
|
| -WebInspector._innerParseCSS = function(text, chunkCallback)
|
| -{
|
| - var chunkSize = 100000; // characters per data chunk
|
| - var lines = text.split("\n");
|
| - var rules = [];
|
| - var processedChunkCharacters = 0;
|
| +WebInspector._innerParseCSS = function(text, chunkCallback) {
|
| + var chunkSize = 100000; // characters per data chunk
|
| + var lines = text.split('\n');
|
| + var rules = [];
|
| + var processedChunkCharacters = 0;
|
|
|
| - var state = WebInspector.CSSParserStates.Initial;
|
| - var rule;
|
| - var property;
|
| - var UndefTokenType = new Set();
|
| + var state = WebInspector.CSSParserStates.Initial;
|
| + var rule;
|
| + var property;
|
| + var UndefTokenType = new Set();
|
|
|
| - var disabledRules = [];
|
| - function disabledRulesCallback(chunk)
|
| - {
|
| - disabledRules = disabledRules.concat(chunk.chunk);
|
| - }
|
| + 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 ? new Set(tokenTypes.split(" ")) : UndefTokenType;
|
| - switch (state) {
|
| - case WebInspector.CSSParserStates.Initial:
|
| - if (tokenType.has("qualifier") || tokenType.has("builtin") || tokenType.has("tag")) {
|
| - rule = {
|
| - selectorText: tokenValue,
|
| - lineNumber: lineNumber,
|
| - columnNumber: column,
|
| - properties: [],
|
| - };
|
| - state = WebInspector.CSSParserStates.Selector;
|
| - } else if (tokenType.has("def")) {
|
| - rule = {
|
| - atRule: tokenValue,
|
| - lineNumber: lineNumber,
|
| - columnNumber: column,
|
| - };
|
| - state = WebInspector.CSSParserStates.AtRule;
|
| - }
|
| - break;
|
| - case WebInspector.CSSParserStates.Selector:
|
| - if (tokenValue === "{" && tokenType === UndefTokenType) {
|
| - rule.selectorText = rule.selectorText.trim();
|
| - rule.styleRange = createRange(lineNumber, newColumn);
|
| - state = WebInspector.CSSParserStates.Style;
|
| - } else {
|
| - rule.selectorText += tokenValue;
|
| - }
|
| - break;
|
| - case WebInspector.CSSParserStates.AtRule:
|
| - if ((tokenValue === ";" || tokenValue === "{") && tokenType === UndefTokenType) {
|
| - rule.atRule = rule.atRule.trim();
|
| - rules.push(rule);
|
| - state = WebInspector.CSSParserStates.Initial;
|
| - } else {
|
| - rule.atRule += tokenValue;
|
| - }
|
| - break;
|
| - case WebInspector.CSSParserStates.Style:
|
| - if (tokenType.has("meta") || tokenType.has("property")) {
|
| - property = {
|
| - name: tokenValue,
|
| - value: "",
|
| - range: createRange(lineNumber, column),
|
| - nameRange: createRange(lineNumber, column)
|
| - };
|
| - state = WebInspector.CSSParserStates.PropertyName;
|
| - } else if (tokenValue === "}" && tokenType === UndefTokenType) {
|
| - rule.styleRange.endLine = lineNumber;
|
| - rule.styleRange.endColumn = column;
|
| - rules.push(rule);
|
| - state = WebInspector.CSSParserStates.Initial;
|
| - } else if (tokenType.has("comment")) {
|
| - // The |processToken| is called per-line, so no token spans more than 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 = [];
|
| - WebInspector._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 WebInspector.CSSParserStates.PropertyName:
|
| - if (tokenValue === ":" && tokenType === UndefTokenType) {
|
| - property.name = property.name;
|
| - property.nameRange.endLine = lineNumber;
|
| - property.nameRange.endColumn = column;
|
| - property.valueRange = createRange(lineNumber, newColumn);
|
| - state = WebInspector.CSSParserStates.PropertyValue;
|
| - } else if (tokenType.has("property")) {
|
| - property.name += tokenValue;
|
| - }
|
| - break;
|
| - case WebInspector.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 = WebInspector.CSSParserStates.Initial;
|
| - } else {
|
| - state = WebInspector.CSSParserStates.Style;
|
| - }
|
| - } else if (!tokenType.has("comment")) {
|
| - property.value += tokenValue;
|
| - }
|
| + /**
|
| + * @param {string} tokenValue
|
| + * @param {?string} tokenTypes
|
| + * @param {number} column
|
| + * @param {number} newColumn
|
| + */
|
| + function processToken(tokenValue, tokenTypes, column, newColumn) {
|
| + var tokenType = tokenTypes ? new Set(tokenTypes.split(' ')) : UndefTokenType;
|
| + switch (state) {
|
| + case WebInspector.CSSParserStates.Initial:
|
| + if (tokenType.has('qualifier') || tokenType.has('builtin') || tokenType.has('tag')) {
|
| + rule = {
|
| + selectorText: tokenValue,
|
| + lineNumber: lineNumber,
|
| + columnNumber: column,
|
| + properties: [],
|
| + };
|
| + state = WebInspector.CSSParserStates.Selector;
|
| + } else if (tokenType.has('def')) {
|
| + rule = {
|
| + atRule: tokenValue,
|
| + lineNumber: lineNumber,
|
| + columnNumber: column,
|
| + };
|
| + state = WebInspector.CSSParserStates.AtRule;
|
| + }
|
| + break;
|
| + case WebInspector.CSSParserStates.Selector:
|
| + if (tokenValue === '{' && tokenType === UndefTokenType) {
|
| + rule.selectorText = rule.selectorText.trim();
|
| + rule.styleRange = createRange(lineNumber, newColumn);
|
| + state = WebInspector.CSSParserStates.Style;
|
| + } else {
|
| + rule.selectorText += tokenValue;
|
| + }
|
| + break;
|
| + case WebInspector.CSSParserStates.AtRule:
|
| + if ((tokenValue === ';' || tokenValue === '{') && tokenType === UndefTokenType) {
|
| + rule.atRule = rule.atRule.trim();
|
| + rules.push(rule);
|
| + state = WebInspector.CSSParserStates.Initial;
|
| + } else {
|
| + rule.atRule += tokenValue;
|
| + }
|
| + break;
|
| + case WebInspector.CSSParserStates.Style:
|
| + if (tokenType.has('meta') || tokenType.has('property')) {
|
| + property = {
|
| + name: tokenValue,
|
| + value: '',
|
| + range: createRange(lineNumber, column),
|
| + nameRange: createRange(lineNumber, column)
|
| + };
|
| + state = WebInspector.CSSParserStates.PropertyName;
|
| + } else if (tokenValue === '}' && tokenType === UndefTokenType) {
|
| + rule.styleRange.endLine = lineNumber;
|
| + rule.styleRange.endColumn = column;
|
| + rules.push(rule);
|
| + state = WebInspector.CSSParserStates.Initial;
|
| + } else if (tokenType.has('comment')) {
|
| + // The |processToken| is called per-line, so no token spans more than one line.
|
| + // Support only a one-line comments.
|
| + if (tokenValue.substring(0, 2) !== '/*' || tokenValue.substring(tokenValue.length - 2) !== '*/')
|
| break;
|
| - default:
|
| - console.assert(false, "Unknown CSS parser state.");
|
| + var uncommentedText = tokenValue.substring(2, tokenValue.length - 2);
|
| + var fakeRule = 'a{\n' + uncommentedText + '}';
|
| + disabledRules = [];
|
| + WebInspector._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 WebInspector.CSSParserStates.PropertyName:
|
| + if (tokenValue === ':' && tokenType === UndefTokenType) {
|
| + property.name = property.name;
|
| + property.nameRange.endLine = lineNumber;
|
| + property.nameRange.endColumn = column;
|
| + property.valueRange = createRange(lineNumber, newColumn);
|
| + state = WebInspector.CSSParserStates.PropertyValue;
|
| + } else if (tokenType.has('property')) {
|
| + property.name += tokenValue;
|
| }
|
| - processedChunkCharacters += newColumn - column;
|
| - if (processedChunkCharacters > chunkSize) {
|
| - chunkCallback({ chunk: rules, isLastChunk: false });
|
| - rules = [];
|
| - processedChunkCharacters = 0;
|
| + break;
|
| + case WebInspector.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 = WebInspector.CSSParserStates.Initial;
|
| + } else {
|
| + state = WebInspector.CSSParserStates.Style;
|
| + }
|
| + } else if (!tokenType.has('comment')) {
|
| + property.value += tokenValue;
|
| }
|
| + break;
|
| + default:
|
| + console.assert(false, 'Unknown CSS parser state.');
|
| }
|
| - var tokenizer = WebInspector.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);
|
| + processedChunkCharacters += newColumn - column;
|
| + if (processedChunkCharacters > chunkSize) {
|
| + chunkCallback({chunk: rules, isLastChunk: false});
|
| + rules = [];
|
| + processedChunkCharacters = 0;
|
| }
|
| - chunkCallback({ chunk: rules, isLastChunk: true });
|
| + }
|
| + var tokenizer = WebInspector.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
|
| - };
|
| - }
|
| + /**
|
| + * @return {!{startLine: number, startColumn: number, endLine: number, endColumn: number}}
|
| + */
|
| + function createRange(lineNumber, columnNumber) {
|
| + return {startLine: lineNumber, startColumn: columnNumber, endLine: lineNumber, endColumn: columnNumber};
|
| + }
|
| };
|
|
|