| Index: third_party/WebKit/Source/devtools/front_end/sdk/CSSProperty.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/CSSProperty.js b/third_party/WebKit/Source/devtools/front_end/sdk/CSSProperty.js
|
| index feedbbe8e0cab2583f84a5679dd5945e20d368de..081f7560fc76bd633d7cbccbade4fccf14c0eef7 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/sdk/CSSProperty.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/sdk/CSSProperty.js
|
| @@ -1,22 +1,23 @@
|
| // 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.
|
| -
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.CSSStyleDeclaration} ownerStyle
|
| - * @param {number} index
|
| - * @param {string} name
|
| - * @param {string} value
|
| - * @param {boolean} important
|
| - * @param {boolean} disabled
|
| - * @param {boolean} parsedOk
|
| - * @param {boolean} implicit
|
| - * @param {?string=} text
|
| - * @param {!CSSAgent.SourceRange=} range
|
| + * @unrestricted
|
| */
|
| -WebInspector.CSSProperty = function(ownerStyle, index, name, value, important, disabled, parsedOk, implicit, text, range)
|
| -{
|
| +WebInspector.CSSProperty = class {
|
| + /**
|
| + * @param {!WebInspector.CSSStyleDeclaration} ownerStyle
|
| + * @param {number} index
|
| + * @param {string} name
|
| + * @param {string} value
|
| + * @param {boolean} important
|
| + * @param {boolean} disabled
|
| + * @param {boolean} parsedOk
|
| + * @param {boolean} implicit
|
| + * @param {?string=} text
|
| + * @param {!CSSAgent.SourceRange=} range
|
| + */
|
| + constructor(ownerStyle, index, name, value, important, disabled, parsedOk, implicit, text, range) {
|
| this.ownerStyle = ownerStyle;
|
| this.index = index;
|
| this.name = name;
|
| @@ -24,277 +25,265 @@ WebInspector.CSSProperty = function(ownerStyle, index, name, value, important, d
|
| this.important = important;
|
| this.disabled = disabled;
|
| this.parsedOk = parsedOk;
|
| - this.implicit = implicit; // A longhand, implicitly set by missing values of shorthand.
|
| + this.implicit = implicit; // A longhand, implicitly set by missing values of shorthand.
|
| this.text = text;
|
| this.range = range ? WebInspector.TextRange.fromObject(range) : null;
|
| this._active = true;
|
| this._nameRange = null;
|
| this._valueRange = null;
|
| -};
|
| + }
|
|
|
| -/**
|
| - * @param {!WebInspector.CSSStyleDeclaration} ownerStyle
|
| - * @param {number} index
|
| - * @param {!CSSAgent.CSSProperty} payload
|
| - * @return {!WebInspector.CSSProperty}
|
| - */
|
| -WebInspector.CSSProperty.parsePayload = function(ownerStyle, index, payload)
|
| -{
|
| + /**
|
| + * @param {!WebInspector.CSSStyleDeclaration} ownerStyle
|
| + * @param {number} index
|
| + * @param {!CSSAgent.CSSProperty} payload
|
| + * @return {!WebInspector.CSSProperty}
|
| + */
|
| + static parsePayload(ownerStyle, index, payload) {
|
| // The following default field values are used in the payload:
|
| // important: false
|
| // parsedOk: true
|
| // implicit: false
|
| // disabled: false
|
| var result = new WebInspector.CSSProperty(
|
| - ownerStyle, index, payload.name, payload.value, payload.important || false, payload.disabled || false, ("parsedOk" in payload) ? !!payload.parsedOk : true, !!payload.implicit, payload.text, payload.range);
|
| + ownerStyle, index, payload.name, payload.value, payload.important || false, payload.disabled || false,
|
| + ('parsedOk' in payload) ? !!payload.parsedOk : true, !!payload.implicit, payload.text, payload.range);
|
| return result;
|
| -};
|
| + }
|
|
|
| -WebInspector.CSSProperty.prototype = {
|
| - _ensureRanges: function()
|
| - {
|
| - if (this._nameRange && this._valueRange)
|
| - return;
|
| - var range = this.range;
|
| - var text = this.text ? new WebInspector.Text(this.text) : null;
|
| - if (!range || !text)
|
| - return;
|
| + _ensureRanges() {
|
| + if (this._nameRange && this._valueRange)
|
| + return;
|
| + var range = this.range;
|
| + var text = this.text ? new WebInspector.Text(this.text) : null;
|
| + if (!range || !text)
|
| + return;
|
|
|
| - var nameIndex = text.value().indexOf(this.name);
|
| - var valueIndex = text.value().lastIndexOf(this.value);
|
| - if (nameIndex === -1 || valueIndex === -1 || nameIndex > valueIndex)
|
| - return;
|
| + var nameIndex = text.value().indexOf(this.name);
|
| + var valueIndex = text.value().lastIndexOf(this.value);
|
| + if (nameIndex === -1 || valueIndex === -1 || nameIndex > valueIndex)
|
| + return;
|
|
|
| - var nameSourceRange = new WebInspector.SourceRange(nameIndex, this.name.length);
|
| - var valueSourceRange = new WebInspector.SourceRange(valueIndex, this.value.length);
|
| + var nameSourceRange = new WebInspector.SourceRange(nameIndex, this.name.length);
|
| + var valueSourceRange = new WebInspector.SourceRange(valueIndex, this.value.length);
|
|
|
| - this._nameRange = rebase(text.toTextRange(nameSourceRange), range.startLine, range.startColumn);
|
| - this._valueRange = rebase(text.toTextRange(valueSourceRange), range.startLine, range.startColumn);
|
| -
|
| - /**
|
| - * @param {!WebInspector.TextRange} oneLineRange
|
| - * @param {number} lineOffset
|
| - * @param {number} columnOffset
|
| - * @return {!WebInspector.TextRange}
|
| - */
|
| - function rebase(oneLineRange, lineOffset, columnOffset)
|
| - {
|
| - if (oneLineRange.startLine === 0) {
|
| - oneLineRange.startColumn += columnOffset;
|
| - oneLineRange.endColumn += columnOffset;
|
| - }
|
| - oneLineRange.startLine += lineOffset;
|
| - oneLineRange.endLine += lineOffset;
|
| - return oneLineRange;
|
| - }
|
| - },
|
| + this._nameRange = rebase(text.toTextRange(nameSourceRange), range.startLine, range.startColumn);
|
| + this._valueRange = rebase(text.toTextRange(valueSourceRange), range.startLine, range.startColumn);
|
|
|
| /**
|
| - * @return {?WebInspector.TextRange}
|
| + * @param {!WebInspector.TextRange} oneLineRange
|
| + * @param {number} lineOffset
|
| + * @param {number} columnOffset
|
| + * @return {!WebInspector.TextRange}
|
| */
|
| - nameRange: function()
|
| - {
|
| - this._ensureRanges();
|
| - return this._nameRange;
|
| - },
|
| + function rebase(oneLineRange, lineOffset, columnOffset) {
|
| + if (oneLineRange.startLine === 0) {
|
| + oneLineRange.startColumn += columnOffset;
|
| + oneLineRange.endColumn += columnOffset;
|
| + }
|
| + oneLineRange.startLine += lineOffset;
|
| + oneLineRange.endLine += lineOffset;
|
| + return oneLineRange;
|
| + }
|
| + }
|
|
|
| - /**
|
| - * @return {?WebInspector.TextRange}
|
| - */
|
| - valueRange: function()
|
| - {
|
| - this._ensureRanges();
|
| - return this._valueRange;
|
| - },
|
| + /**
|
| + * @return {?WebInspector.TextRange}
|
| + */
|
| + nameRange() {
|
| + this._ensureRanges();
|
| + return this._nameRange;
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.CSSModel.Edit} edit
|
| - */
|
| - rebase: function(edit)
|
| - {
|
| - if (this.ownerStyle.styleSheetId !== edit.styleSheetId)
|
| - return;
|
| - if (this.range)
|
| - this.range = this.range.rebaseAfterTextEdit(edit.oldRange, edit.newRange);
|
| - },
|
| + /**
|
| + * @return {?WebInspector.TextRange}
|
| + */
|
| + valueRange() {
|
| + this._ensureRanges();
|
| + return this._valueRange;
|
| + }
|
|
|
| - /**
|
| - * @param {boolean} active
|
| - */
|
| - _setActive: function(active)
|
| - {
|
| - this._active = active;
|
| - },
|
| + /**
|
| + * @param {!WebInspector.CSSModel.Edit} edit
|
| + */
|
| + rebase(edit) {
|
| + if (this.ownerStyle.styleSheetId !== edit.styleSheetId)
|
| + return;
|
| + if (this.range)
|
| + this.range = this.range.rebaseAfterTextEdit(edit.oldRange, edit.newRange);
|
| + }
|
|
|
| - get propertyText()
|
| - {
|
| - if (this.text !== undefined)
|
| - return this.text;
|
| + /**
|
| + * @param {boolean} active
|
| + */
|
| + _setActive(active) {
|
| + this._active = active;
|
| + }
|
|
|
| - if (this.name === "")
|
| - return "";
|
| - return this.name + ": " + this.value + (this.important ? " !important" : "") + ";";
|
| - },
|
| + get propertyText() {
|
| + if (this.text !== undefined)
|
| + return this.text;
|
|
|
| - /**
|
| - * @return {boolean}
|
| - */
|
| - activeInStyle: function()
|
| - {
|
| - return this._active;
|
| - },
|
| + if (this.name === '')
|
| + return '';
|
| + return this.name + ': ' + this.value + (this.important ? ' !important' : '') + ';';
|
| + }
|
|
|
| - /**
|
| - * @param {string} propertyText
|
| - * @param {boolean} majorChange
|
| - * @param {boolean} overwrite
|
| - * @return {!Promise.<boolean>}
|
| - */
|
| - setText: function(propertyText, majorChange, overwrite)
|
| - {
|
| - if (!this.ownerStyle)
|
| - return Promise.reject(new Error("No ownerStyle for property"));
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| + activeInStyle() {
|
| + return this._active;
|
| + }
|
|
|
| - if (!this.ownerStyle.styleSheetId)
|
| - return Promise.reject(new Error("No owner style id"));
|
| + /**
|
| + * @param {string} propertyText
|
| + * @param {boolean} majorChange
|
| + * @param {boolean} overwrite
|
| + * @return {!Promise.<boolean>}
|
| + */
|
| + setText(propertyText, majorChange, overwrite) {
|
| + if (!this.ownerStyle)
|
| + return Promise.reject(new Error('No ownerStyle for property'));
|
|
|
| - if (!this.range || !this.ownerStyle.range)
|
| - return Promise.reject(new Error("Style not editable"));
|
| + if (!this.ownerStyle.styleSheetId)
|
| + return Promise.reject(new Error('No owner style id'));
|
|
|
| - if (majorChange)
|
| - WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.StyleRuleEdited);
|
| + if (!this.range || !this.ownerStyle.range)
|
| + return Promise.reject(new Error('Style not editable'));
|
|
|
| - if (overwrite && propertyText === this.propertyText) {
|
| - if (majorChange)
|
| - this.ownerStyle.cssModel().domModel().markUndoableState();
|
| - return Promise.resolve(true);
|
| - }
|
| + if (majorChange)
|
| + WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.StyleRuleEdited);
|
|
|
| - var range = this.range.relativeTo(this.ownerStyle.range.startLine, this.ownerStyle.range.startColumn);
|
| - var indentation = this.ownerStyle.cssText ? this._detectIndentation(this.ownerStyle.cssText) : WebInspector.moduleSetting("textEditorIndent").get();
|
| - var endIndentation = this.ownerStyle.cssText ? indentation.substring(0, this.ownerStyle.range.endColumn) : "";
|
| - var text = new WebInspector.Text(this.ownerStyle.cssText || "");
|
| - var newStyleText = text.replaceRange(range, String.sprintf(";%s;", propertyText));
|
| + if (overwrite && propertyText === this.propertyText) {
|
| + if (majorChange)
|
| + this.ownerStyle.cssModel().domModel().markUndoableState();
|
| + return Promise.resolve(true);
|
| + }
|
|
|
| - return self.runtime.extension(WebInspector.TokenizerFactory).instance()
|
| - .then(this._formatStyle.bind(this, newStyleText, indentation, endIndentation))
|
| - .then(setStyleText.bind(this));
|
| + var range = this.range.relativeTo(this.ownerStyle.range.startLine, this.ownerStyle.range.startColumn);
|
| + var indentation = this.ownerStyle.cssText ? this._detectIndentation(this.ownerStyle.cssText) :
|
| + WebInspector.moduleSetting('textEditorIndent').get();
|
| + var endIndentation = this.ownerStyle.cssText ? indentation.substring(0, this.ownerStyle.range.endColumn) : '';
|
| + var text = new WebInspector.Text(this.ownerStyle.cssText || '');
|
| + var newStyleText = text.replaceRange(range, String.sprintf(';%s;', propertyText));
|
|
|
| - /**
|
| - * @param {string} styleText
|
| - * @this {WebInspector.CSSProperty}
|
| - * @return {!Promise.<boolean>}
|
| - */
|
| - function setStyleText(styleText)
|
| - {
|
| - return this.ownerStyle.setText(styleText, majorChange);
|
| - }
|
| - },
|
| + return self.runtime.extension(WebInspector.TokenizerFactory)
|
| + .instance()
|
| + .then(this._formatStyle.bind(this, newStyleText, indentation, endIndentation))
|
| + .then(setStyleText.bind(this));
|
|
|
| /**
|
| * @param {string} styleText
|
| - * @param {string} indentation
|
| - * @param {string} endIndentation
|
| - * @param {!WebInspector.TokenizerFactory} tokenizerFactory
|
| - * @return {string}
|
| + * @this {WebInspector.CSSProperty}
|
| + * @return {!Promise.<boolean>}
|
| */
|
| - _formatStyle: function(styleText, indentation, endIndentation, tokenizerFactory)
|
| - {
|
| - if (indentation)
|
| - indentation = "\n" + indentation;
|
| - var result = "";
|
| - var propertyText;
|
| - var insideProperty = false;
|
| - var tokenize = tokenizerFactory.createTokenizer("text/css");
|
| + function setStyleText(styleText) {
|
| + return this.ownerStyle.setText(styleText, majorChange);
|
| + }
|
| + }
|
|
|
| - tokenize("*{" + styleText + "}", processToken);
|
| - if (insideProperty)
|
| - result += propertyText;
|
| - result = result.substring(2, result.length - 1).trimRight();
|
| - return result + (indentation ? "\n" + endIndentation : "");
|
| + /**
|
| + * @param {string} styleText
|
| + * @param {string} indentation
|
| + * @param {string} endIndentation
|
| + * @param {!WebInspector.TokenizerFactory} tokenizerFactory
|
| + * @return {string}
|
| + */
|
| + _formatStyle(styleText, indentation, endIndentation, tokenizerFactory) {
|
| + if (indentation)
|
| + indentation = '\n' + indentation;
|
| + var result = '';
|
| + var propertyText;
|
| + var insideProperty = false;
|
| + var tokenize = tokenizerFactory.createTokenizer('text/css');
|
|
|
| - /**
|
| - * @param {string} token
|
| - * @param {?string} tokenType
|
| - * @param {number} column
|
| - * @param {number} newColumn
|
| - */
|
| - function processToken(token, tokenType, column, newColumn)
|
| - {
|
| - if (!insideProperty) {
|
| - var disabledProperty = tokenType && tokenType.includes("css-comment") && isDisabledProperty(token);
|
| - var isPropertyStart = tokenType && (tokenType.includes("css-string") || tokenType.includes("css-meta") || tokenType.includes("css-property") || tokenType.includes("css-variable-2"));
|
| - if (disabledProperty) {
|
| - result = result.trimRight() + indentation + token;
|
| - } else if (isPropertyStart) {
|
| - insideProperty = true;
|
| - propertyText = token;
|
| - } else if (token !== ";") {
|
| - result += token;
|
| - }
|
| - return;
|
| - }
|
| + tokenize('*{' + styleText + '}', processToken);
|
| + if (insideProperty)
|
| + result += propertyText;
|
| + result = result.substring(2, result.length - 1).trimRight();
|
| + return result + (indentation ? '\n' + endIndentation : '');
|
|
|
| - if (token === "}" || token === ";") {
|
| - result = result.trimRight() + indentation + propertyText.trim() + ";";
|
| - insideProperty = false;
|
| - if (token === "}")
|
| - result += "}";
|
| - } else {
|
| - propertyText += token;
|
| - }
|
| + /**
|
| + * @param {string} token
|
| + * @param {?string} tokenType
|
| + * @param {number} column
|
| + * @param {number} newColumn
|
| + */
|
| + function processToken(token, tokenType, column, newColumn) {
|
| + if (!insideProperty) {
|
| + var disabledProperty = tokenType && tokenType.includes('css-comment') && isDisabledProperty(token);
|
| + var isPropertyStart = tokenType && (tokenType.includes('css-string') || tokenType.includes('css-meta') ||
|
| + tokenType.includes('css-property') || tokenType.includes('css-variable-2'));
|
| + if (disabledProperty) {
|
| + result = result.trimRight() + indentation + token;
|
| + } else if (isPropertyStart) {
|
| + insideProperty = true;
|
| + propertyText = token;
|
| + } else if (token !== ';') {
|
| + result += token;
|
| }
|
| + return;
|
| + }
|
|
|
| - /**
|
| - * @param {string} text
|
| - * @return {boolean}
|
| - */
|
| - function isDisabledProperty(text)
|
| - {
|
| - var colon = text.indexOf(":");
|
| - if (colon === -1)
|
| - return false;
|
| - var propertyName = text.substring(2, colon).trim();
|
| - return WebInspector.cssMetadata().isCSSPropertyName(propertyName);
|
| - }
|
| - },
|
| + if (token === '}' || token === ';') {
|
| + result = result.trimRight() + indentation + propertyText.trim() + ';';
|
| + insideProperty = false;
|
| + if (token === '}')
|
| + result += '}';
|
| + } else {
|
| + propertyText += token;
|
| + }
|
| + }
|
|
|
| /**
|
| * @param {string} text
|
| - * @return {string}
|
| + * @return {boolean}
|
| */
|
| - _detectIndentation: function(text)
|
| - {
|
| - var lines = text.split("\n");
|
| - if (lines.length < 2)
|
| - return "";
|
| - return WebInspector.TextUtils.lineIndent(lines[1]);
|
| - },
|
| + function isDisabledProperty(text) {
|
| + var colon = text.indexOf(':');
|
| + if (colon === -1)
|
| + return false;
|
| + var propertyName = text.substring(2, colon).trim();
|
| + return WebInspector.cssMetadata().isCSSPropertyName(propertyName);
|
| + }
|
| + }
|
|
|
| - /**
|
| - * @param {string} newValue
|
| - * @param {boolean} majorChange
|
| - * @param {boolean} overwrite
|
| - * @param {function(boolean)=} userCallback
|
| - */
|
| - setValue: function(newValue, majorChange, overwrite, userCallback)
|
| - {
|
| - var text = this.name + ": " + newValue + (this.important ? " !important" : "") + ";";
|
| - this.setText(text, majorChange, overwrite).then(userCallback);
|
| - },
|
| + /**
|
| + * @param {string} text
|
| + * @return {string}
|
| + */
|
| + _detectIndentation(text) {
|
| + var lines = text.split('\n');
|
| + if (lines.length < 2)
|
| + return '';
|
| + return WebInspector.TextUtils.lineIndent(lines[1]);
|
| + }
|
|
|
| - /**
|
| - * @param {boolean} disabled
|
| - * @return {!Promise.<boolean>}
|
| - */
|
| - setDisabled: function(disabled)
|
| - {
|
| - if (!this.ownerStyle)
|
| - return Promise.resolve(false);
|
| - if (disabled === this.disabled)
|
| - return Promise.resolve(true);
|
| - var propertyText = this.text.trim();
|
| - var text = disabled ? "/* " + propertyText + " */" : this.text.substring(2, propertyText.length - 2).trim();
|
| - return this.setText(text, true, true);
|
| - }
|
| + /**
|
| + * @param {string} newValue
|
| + * @param {boolean} majorChange
|
| + * @param {boolean} overwrite
|
| + * @param {function(boolean)=} userCallback
|
| + */
|
| + setValue(newValue, majorChange, overwrite, userCallback) {
|
| + var text = this.name + ': ' + newValue + (this.important ? ' !important' : '') + ';';
|
| + this.setText(text, majorChange, overwrite).then(userCallback);
|
| + }
|
| +
|
| + /**
|
| + * @param {boolean} disabled
|
| + * @return {!Promise.<boolean>}
|
| + */
|
| + setDisabled(disabled) {
|
| + if (!this.ownerStyle)
|
| + return Promise.resolve(false);
|
| + if (disabled === this.disabled)
|
| + return Promise.resolve(true);
|
| + var propertyText = this.text.trim();
|
| + var text = disabled ? '/* ' + propertyText + ' */' : this.text.substring(2, propertyText.length - 2).trim();
|
| + return this.setText(text, true, true);
|
| + }
|
| };
|
| +
|
| +
|
|
|