blob: 18b91b2c9e1bf7924b0574f64737b987f099b1ae [file] [log] [blame]
/*
* Copyright (C) 2010 Nikita Vasilyev. All rights reserved.
* Copyright (C) 2010 Joseph Pecoraro. All rights reserved.
* Copyright (C) 2010 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.
*/
/**
* @unrestricted
*/
export default class CSSMetadata {
/**
* @param {!Array.<!SDK.CSSMetadata.CSSPropertyDefinition>} properties
*/
constructor(properties) {
this._values = /** !Array.<string> */ ([]);
/** @type {!Map<string, !Array<string>>} */
this._longhands = new Map();
/** @type {!Map<string, !Array<string>>} */
this._shorthands = new Map();
/** @type {!Set<string>} */
this._inherited = new Set();
/** @type {!Set<string>} */
this._svgProperties = new Set();
for (let i = 0; i < properties.length; ++i) {
const property = properties[i];
const propertyName = property.name;
if (!CSS.supports(propertyName, 'initial')) {
continue;
}
this._values.push(propertyName);
if (property.inherited) {
this._inherited.add(propertyName);
}
if (property.svg) {
this._svgProperties.add(propertyName);
}
const longhands = properties[i].longhands;
if (longhands) {
this._longhands.set(propertyName, longhands);
for (let j = 0; j < longhands.length; ++j) {
const longhandName = longhands[j];
let shorthands = this._shorthands.get(longhandName);
if (!shorthands) {
shorthands = [];
this._shorthands.set(longhandName, shorthands);
}
shorthands.push(propertyName);
}
}
}
this._values.sort(CSSMetadata._sortPrefixesToEnd);
this._valuesSet = new Set(this._values);
// Reads in auto-generated property names and values from blink/public/renderer/core/css/css_properties.json5
// treats _generatedPropertyValues as basis
for (const [prop, basisValueObj] of Object.entries(CSSMetadata._generatedPropertyValues)) {
_finalPropertyValues[prop] = basisValueObj;
}
// and add manually maintained map of extra prop-value pairs
for (const [prop, extraValueObj] of Object.entries(_extraPropertyValues)) {
if (_finalPropertyValues[prop]) {
const baseValues = _finalPropertyValues[prop].values;
const baseValueSet = new Set(baseValues);
extraValueObj.values.forEach(extraVal => {
if (!baseValueSet.has(extraVal)) {
baseValues.push(extraVal);
}
});
} else {
_finalPropertyValues[prop] = extraValueObj;
}
}
/** @type {!Array<string>} */
this._nameValuePresets = [];
/** @type {!Array<string>} */
this._nameValuePresetsIncludingSVG = [];
for (const name of this._valuesSet) {
const values = this._specificPropertyValues(name)
.filter(value => CSS.supports(name, value))
.sort(CSSMetadata._sortPrefixesToEnd);
const presets = values.map(value => `${name}: ${value}`);
if (!this.isSVGProperty(name)) {
this._nameValuePresets.pushAll(presets);
}
this._nameValuePresetsIncludingSVG.pushAll(presets);
}
}
/**
* @param {string} a
* @param {string} b
*/
static _sortPrefixesToEnd(a, b) {
const aIsPrefixed = a.startsWith('-webkit-');
const bIsPrefixed = b.startsWith('-webkit-');
if (aIsPrefixed && !bIsPrefixed) {
return 1;
}
if (!aIsPrefixed && bIsPrefixed) {
return -1;
}
return a < b ? -1 : (a > b ? 1 : 0);
}
/**
* @return {!Array<string>}
*/
allProperties() {
return this._values;
}
/**
* @param {boolean=} includeSVG
* @return {!Array<string>}
*/
nameValuePresets(includeSVG) {
return includeSVG ? this._nameValuePresetsIncludingSVG : this._nameValuePresets;
}
/**
* @param {string} name
* @return {boolean}
*/
isSVGProperty(name) {
name = name.toLowerCase();
return this._svgProperties.has(name);
}
/**
* @param {string} shorthand
* @return {?Array.<string>}
*/
longhands(shorthand) {
return this._longhands.get(shorthand) || null;
}
/**
* @param {string} longhand
* @return {?Array.<string>}
*/
shorthands(longhand) {
return this._shorthands.get(longhand) || null;
}
/**
* @param {string} propertyName
* @return {boolean}
*/
isColorAwareProperty(propertyName) {
return !!_colorAwareProperties.has(propertyName.toLowerCase()) || this.isCustomProperty(propertyName.toLowerCase());
}
/**
* @param {string} propertyName
* @return {boolean}
*/
isGridAreaDefiningProperty(propertyName) {
propertyName = propertyName.toLowerCase();
return propertyName === 'grid' || propertyName === 'grid-template' || propertyName === 'grid-template-areas';
}
/**
* @param {string} propertyName
* @return {boolean}
*/
isLengthProperty(propertyName) {
propertyName = propertyName.toLowerCase();
if (propertyName === 'line-height') {
return false;
}
return _distanceProperties.has(propertyName) || propertyName.startsWith('margin') ||
propertyName.startsWith('padding') || propertyName.indexOf('width') !== -1 ||
propertyName.indexOf('height') !== -1;
}
/**
* @param {string} propertyName
* @return {boolean}
*/
isBezierAwareProperty(propertyName) {
propertyName = propertyName.toLowerCase();
return !!_bezierAwareProperties.has(propertyName) || this.isCustomProperty(propertyName);
}
/**
* @param {string} propertyName
* @return {boolean}
*/
isCustomProperty(propertyName) {
return propertyName.startsWith('--');
}
/**
* @param {string} name
* @return {string}
*/
canonicalPropertyName(name) {
if (this.isCustomProperty(name)) {
return name;
}
name = name.toLowerCase();
if (!name || name.length < 9 || name.charAt(0) !== '-') {
return name;
}
const match = name.match(/(?:-webkit-)(.+)/);
if (!match || !this._valuesSet.has(match[1])) {
return name;
}
return match[1];
}
/**
* @param {string} propertyName
* @return {boolean}
*/
isCSSPropertyName(propertyName) {
propertyName = propertyName.toLowerCase();
if (propertyName.startsWith('-moz-') || propertyName.startsWith('-o-') || propertyName.startsWith('-webkit-') ||
propertyName.startsWith('-ms-')) {
return true;
}
return this._valuesSet.has(propertyName);
}
/**
* @param {string} propertyName
* @return {boolean}
*/
isPropertyInherited(propertyName) {
propertyName = propertyName.toLowerCase();
return propertyName.startsWith('--') || this._inherited.has(this.canonicalPropertyName(propertyName)) ||
this._inherited.has(propertyName);
}
/**
* @param {string} propertyName
* @return {!Array<string>}
*/
_specificPropertyValues(propertyName) {
const unprefixedName = propertyName.replace(/^-webkit-/, '');
const entry = _finalPropertyValues[propertyName] || _finalPropertyValues[unprefixedName];
const keywords = entry && entry.values ? entry.values.slice() : [];
for (const commonKeyword of ['auto', 'none']) {
if (!keywords.includes(commonKeyword) && CSS.supports(propertyName, commonKeyword)) {
keywords.push(commonKeyword);
}
}
return keywords;
}
/**
* @param {string} propertyName
* @return {!Array<string>}
*/
propertyValues(propertyName) {
const acceptedKeywords = ['inherit', 'initial', 'unset'];
propertyName = propertyName.toLowerCase();
acceptedKeywords.pushAll(this._specificPropertyValues(propertyName));
if (this.isColorAwareProperty(propertyName)) {
acceptedKeywords.push('currentColor');
for (const color in Common.Color.Nicknames) {
acceptedKeywords.push(color);
}
}
return acceptedKeywords.sort(CSSMetadata._sortPrefixesToEnd);
}
/**
* @param {string} property
* @return {number}
*/
propertyUsageWeight(property) {
return Weight[property] || Weight[this.canonicalPropertyName(property)] || 0;
}
/**
* @param {string} key
* @param {string} value
* @return {?{text: string, startColumn: number, endColumn: number}}
*/
getValuePreset(key, value) {
const values = _valuePresets.get(key);
let text = values ? values.get(value) : null;
if (!text) {
return null;
}
let startColumn = text.length;
let endColumn = text.length;
if (text) {
startColumn = text.indexOf('|');
endColumn = text.lastIndexOf('|');
endColumn = startColumn === endColumn ? endColumn : endColumn - 1;
text = text.replace(/\|/g, '');
}
return {text, startColumn, endColumn};
}
}
export const VariableRegex = /(var\(--.*?\))/g;
export const URLRegex = /url\(\s*('.+?'|".+?"|[^)]+)\s*\)/g;
/**
* Matches an instance of a grid area 'row' definition.
* 'grid-template-areas', e.g.
* "a a ."
*
* 'grid', 'grid-template', e.g.
* [track-name] "a a ." minmax(50px, auto) [track-name]
*/
export const GridAreaRowRegex = /((?:\[[\w\- ]+\]\s*)*(?:"[^"]+"|'[^']+'))[^'"\[]*\[?[^'"\[]*/;
/**
* @return {!CSSMetadata}
*/
export function cssMetadata() {
if (!CSSMetadata._instance) {
CSSMetadata._instance = new CSSMetadata(CSSMetadata._generatedProperties);
}
return CSSMetadata._instance;
}
/**
* The pipe character '|' indicates where text selection should be set.
*/
const _imageValuePresetMap = new Map([
['linear-gradient', 'linear-gradient(|45deg, black, transparent|)'],
['radial-gradient', 'radial-gradient(|black, transparent|)'],
['repeating-linear-gradient', 'repeating-linear-gradient(|45deg, black, transparent 100px|)'],
['repeating-radial-gradient', 'repeating-radial-gradient(|black, transparent 100px|)'],
['url', 'url(||)'],
]);
const _valuePresets = new Map([
[
'filter', new Map([
['blur', 'blur(|1px|)'],
['brightness', 'brightness(|0.5|)'],
['contrast', 'contrast(|0.5|)'],
['drop-shadow', 'drop-shadow(|2px 4px 6px black|)'],
['grayscale', 'grayscale(|1|)'],
['hue-rotate', 'hue-rotate(|45deg|)'],
['invert', 'invert(|1|)'],
['opacity', 'opacity(|0.5|)'],
['saturate', 'saturate(|0.5|)'],
['sepia', 'sepia(|1|)'],
['url', 'url(||)'],
])
],
['background', _imageValuePresetMap], ['background-image', _imageValuePresetMap],
['-webkit-mask-image', _imageValuePresetMap],
[
'transform', new Map([
['scale', 'scale(|1.5|)'],
['scaleX', 'scaleX(|1.5|)'],
['scaleY', 'scaleY(|1.5|)'],
['scale3d', 'scale3d(|1.5, 1.5, 1.5|)'],
['rotate', 'rotate(|45deg|)'],
['rotateX', 'rotateX(|45deg|)'],
['rotateY', 'rotateY(|45deg|)'],
['rotateZ', 'rotateZ(|45deg|)'],
['rotate3d', 'rotate3d(|1, 1, 1, 45deg|)'],
['skew', 'skew(|10deg, 10deg|)'],
['skewX', 'skewX(|10deg|)'],
['skewY', 'skewY(|10deg|)'],
['translate', 'translate(|10px, 10px|)'],
['translateX', 'translateX(|10px|)'],
['translateY', 'translateY(|10px|)'],
['translateZ', 'translateZ(|10px|)'],
['translate3d', 'translate3d(|10px, 10px, 10px|)'],
['matrix', 'matrix(|1, 0, 0, 1, 0, 0|)'],
['matrix3d', 'matrix3d(|1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1|)'],
['perspective', 'perspective(|10px|)']
])
]
]);
const _distanceProperties = new Set([
'background-position', 'border-spacing', 'bottom', 'font-size', 'height', 'left', 'letter-spacing', 'max-height',
'max-width', 'min-height', 'min-width', 'right', 'text-indent', 'top', 'width', 'word-spacing', 'grid-row-gap',
'grid-column-gap', 'row-gap'
]);
const _bezierAwareProperties = new Set([
'animation', 'animation-timing-function', 'transition', 'transition-timing-function', '-webkit-animation',
'-webkit-animation-timing-function', '-webkit-transition', '-webkit-transition-timing-function'
]);
const _colorAwareProperties = new Set([
'backdrop-filter',
'background',
'background-color',
'background-image',
'border',
'border-color',
'border-image',
'border-image-source',
'border-bottom',
'border-bottom-color',
'border-left',
'border-left-color',
'border-right',
'border-right-color',
'border-top',
'border-top-color',
'box-shadow',
'caret-color',
'color',
'column-rule',
'column-rule-color',
'fill',
'list-style-image',
'outline',
'outline-color',
'stroke',
'text-decoration-color',
'text-shadow',
'-webkit-border-after',
'-webkit-border-after-color',
'-webkit-border-before',
'-webkit-border-before-color',
'-webkit-border-end',
'-webkit-border-end-color',
'-webkit-border-start',
'-webkit-border-start-color',
'-webkit-box-reflect',
'-webkit-box-shadow',
'-webkit-column-rule-color',
'-webkit-filter',
'-webkit-mask',
'-webkit-mask-box-image',
'-webkit-mask-box-image-source',
'-webkit-mask-image',
'-webkit-tap-highlight-color',
'-webkit-text-decoration-color',
'-webkit-text-emphasis',
'-webkit-text-emphasis-color',
'-webkit-text-fill-color',
'-webkit-text-stroke',
'-webkit-text-stroke-color'
]);
// manually maintained list of property values to add into autocomplete list
const _extraPropertyValues = {
'background-repeat': {values: ['repeat', 'repeat-x', 'repeat-y', 'no-repeat', 'space', 'round']},
'content': {values: ['normal', 'close-quote', 'no-close-quote', 'no-open-quote', 'open-quote']},
'baseline-shift': {values: ['baseline']},
'max-height': {values: ['min-content', 'max-content', '-webkit-fill-available', 'fit-content']},
'box-shadow': {values: ['inset']},
'-webkit-writing-mode': {values: ['horizontal-tb', 'vertical-rl', 'vertical-lr']},
'writing-mode': {values: ['lr', 'rl', 'tb', 'lr-tb', 'rl-tb', 'tb-rl']},
'page-break-inside': {values: ['avoid']},
'cursor': {values: ['-webkit-zoom-in', '-webkit-zoom-out', '-webkit-grab', '-webkit-grabbing']},
'border-width': {values: ['medium', 'thick', 'thin']},
'border-style': {values: ['hidden', 'inset', 'groove', 'ridge', 'outset', 'dotted', 'dashed', 'solid', 'double']},
'size': {values: ['a3', 'a4', 'a5', 'b4', 'b5', 'landscape', 'ledger', 'legal', 'letter', 'portrait']},
'overflow': {values: ['hidden', 'visible', 'overlay', 'scroll']},
'overscroll-behavior': {values: ['contain']},
'text-rendering': {values: ['optimizeSpeed', 'optimizeLegibility', 'geometricPrecision']},
'text-align': {values: ['-webkit-auto', '-webkit-match-parent']},
'color-interpolation': {values: ['sRGB', 'linearRGB']},
'word-wrap': {values: ['normal', 'break-word']},
'font-weight': {values: ['100', '200', '300', '400', '500', '600', '700', '800', '900']},
'-webkit-text-emphasis': {values: ['circle', 'filled', 'open', 'dot', 'double-circle', 'triangle', 'sesame']},
'color-rendering': {values: ['optimizeSpeed', 'optimizeQuality']},
'-webkit-text-combine': {values: ['horizontal']},
'text-orientation': {values: ['sideways-right']},
'outline': {
values: ['inset', 'groove', 'ridge', 'outset', 'dotted', 'dashed', 'solid', 'double', 'medium', 'thick', 'thin']
},
'font': {
values: [
'caption', 'icon', 'menu', 'message-box', 'small-caption', '-webkit-mini-control', '-webkit-small-control',
'-webkit-control', 'status-bar'
]
},
'dominant-baseline': {values: ['text-before-edge', 'text-after-edge', 'use-script', 'no-change', 'reset-size']},
'-webkit-text-emphasis-position': {values: ['over', 'under']},
'alignment-baseline': {values: ['before-edge', 'after-edge', 'text-before-edge', 'text-after-edge', 'hanging']},
'page-break-before': {values: ['left', 'right', 'always', 'avoid']},
'border-image': {values: ['repeat', 'stretch', 'space', 'round']},
'text-decoration':
{values: ['blink', 'line-through', 'overline', 'underline', 'wavy', 'double', 'solid', 'dashed', 'dotted']},
'font-family':
{values: ['serif', 'sans-serif', 'cursive', 'fantasy', 'monospace', '-webkit-body', '-webkit-pictograph']},
'zoom': {values: ['normal']},
'max-width': {values: ['min-content', 'max-content', '-webkit-fill-available', 'fit-content']},
'-webkit-font-smoothing': {values: ['antialiased', 'subpixel-antialiased']},
'border': {
values: [
'hidden', 'inset', 'groove', 'ridge', 'outset', 'dotted', 'dashed', 'solid', 'double', 'medium', 'thick', 'thin'
]
},
'font-variant': {
values: [
'small-caps',
'normal',
'common-ligatures',
'no-common-ligatures',
'discretionary-ligatures',
'no-discretionary-ligatures',
'historical-ligatures',
'no-historical-ligatures',
'contextual',
'no-contextual',
'all-small-caps',
'petite-caps',
'all-petite-caps',
'unicase',
'titling-caps',
'lining-nums',
'oldstyle-nums',
'proportional-nums',
'tabular-nums',
'diagonal-fractions',
'stacked-fractions',
'ordinal',
'slashed-zero',
'jis78',
'jis83',
'jis90',
'jis04',
'simplified',
'traditional',
'full-width',
'proportional-width',
'ruby'
]
},
'vertical-align': {values: ['top', 'bottom', '-webkit-baseline-middle']},
'page-break-after': {values: ['left', 'right', 'always', 'avoid']},
'-webkit-text-emphasis-style': {values: ['circle', 'filled', 'open', 'dot', 'double-circle', 'triangle', 'sesame']},
'transform': {
values: [
'scale', 'scaleX', 'scaleY', 'scale3d', 'rotate', 'rotateX', 'rotateY',
'rotateZ', 'rotate3d', 'skew', 'skewX', 'skewY', 'translate', 'translateX',
'translateY', 'translateZ', 'translate3d', 'matrix', 'matrix3d', 'perspective'
]
},
'align-content': {
values: [
'normal', 'baseline', 'space-between', 'space-around', 'space-evenly', 'stretch', 'center', 'start', 'end',
'flex-start', 'flex-end'
]
},
'justify-content': {
values: [
'normal', 'space-between', 'space-around', 'space-evenly', 'stretch', 'center', 'start', 'end', 'flex-start',
'flex-end', 'left', 'right'
]
},
'place-content': {
values: [
'normal', 'space-between', 'space-around', 'space-evenly', 'stretch', 'center', 'start', 'end', 'flex-start',
'flex-end', 'baseline'
]
},
'align-items': {
values:
['normal', 'stretch', 'baseline', 'center', 'start', 'end', 'self-start', 'self-end', 'flex-start', 'flex-end']
},
'justify-items': {
values: [
'normal', 'stretch', 'baseline', 'center', 'start', 'end', 'self-start', 'self-end', 'flex-start', 'flex-end',
'left', 'right', 'legacy'
]
},
'place-items': {
values:
['normal', 'stretch', 'baseline', 'center', 'start', 'end', 'self-start', 'self-end', 'flex-start', 'flex-end']
},
'align-self': {
values:
['normal', 'stretch', 'baseline', 'center', 'start', 'end', 'self-start', 'self-end', 'flex-start', 'flex-end']
},
'justify-self': {
values: [
'normal', 'stretch', 'baseline', 'center', 'start', 'end', 'self-start', 'self-end', 'flex-start', 'flex-end',
'left', 'right'
]
},
'place-self': {
values:
['normal', 'stretch', 'baseline', 'center', 'start', 'end', 'self-start', 'self-end', 'flex-start', 'flex-end']
},
'perspective-origin': {values: ['left', 'center', 'right', 'top', 'bottom']},
'transform-origin': {values: ['left', 'center', 'right', 'top', 'bottom']},
'transition-timing-function': {values: ['cubic-bezier', 'steps']},
'animation-timing-function': {values: ['cubic-bezier', 'steps']},
'-webkit-backface-visibility': {values: ['visible', 'hidden']},
'-webkit-column-break-after': {values: ['always', 'avoid']},
'-webkit-column-break-before': {values: ['always', 'avoid']},
'-webkit-column-break-inside': {values: ['avoid']},
'-webkit-column-span': {values: ['all']},
'-webkit-column-gap': {values: ['normal']},
'filter': {
values: [
'url', 'blur', 'brightness', 'contrast', 'drop-shadow', 'grayscale', 'hue-rotate', 'invert', 'opacity',
'saturate', 'sepia'
]
},
'mix-blend-mode': {values: ['unset']},
'background-blend-mode': {values: ['unset']},
'grid-template-columns': {values: ['min-content', 'max-content']},
'grid-template-rows': {values: ['min-content', 'max-content']},
'grid-auto-flow': {values: ['dense']},
'background': {
values: [
'repeat',
'repeat-x',
'repeat-y',
'no-repeat',
'top',
'bottom',
'left',
'right',
'center',
'fixed',
'local',
'scroll',
'space',
'round',
'border-box',
'content-box',
'padding-box',
'linear-gradient',
'radial-gradient',
'repeating-linear-gradient',
'repeating-radial-gradient',
'url'
]
},
'background-image':
{values: ['linear-gradient', 'radial-gradient', 'repeating-linear-gradient', 'repeating-radial-gradient', 'url']},
'background-position': {values: ['top', 'bottom', 'left', 'right', 'center']},
'background-position-x': {values: ['left', 'right', 'center']},
'background-position-y': {values: ['top', 'bottom', 'center']},
'background-repeat-x': {values: ['repeat', 'no-repeat']},
'background-repeat-y': {values: ['repeat', 'no-repeat']},
'border-bottom': {
values: [
'hidden', 'inset', 'groove', 'outset', 'ridge', 'dotted', 'dashed', 'solid', 'double', 'medium', 'thick', 'thin'
]
},
'border-left': {
values: [
'hidden', 'inset', 'groove', 'outset', 'ridge', 'dotted', 'dashed', 'solid', 'double', 'medium', 'thick', 'thin'
]
},
'border-right': {
values: [
'hidden', 'inset', 'groove', 'outset', 'ridge', 'dotted', 'dashed', 'solid', 'double', 'medium', 'thick', 'thin'
]
},
'border-top': {
values: [
'hidden', 'inset', 'groove', 'outset', 'ridge', 'dotted', 'dashed', 'solid', 'double', 'medium', 'thick', 'thin'
]
},
'buffered-rendering': {values: ['static', 'dynamic']},
'color-interpolation-filters': {values: ['srgb', 'linearrgb']},
'column-rule': {
values: [
'hidden', 'inset', 'groove', 'outset', 'ridge', 'dotted', 'dashed', 'solid', 'double', 'medium', 'thick', 'thin'
]
},
'flex-flow': {values: ['nowrap', 'row', 'row-reverse', 'column', 'column-reverse', 'wrap', 'wrap-reverse']},
'height': {values: ['-webkit-fill-available']},
'inline-size': {values: ['-webkit-fill-available', 'min-content', 'max-content', 'fit-content']},
'list-style': {
values: [
'outside',
'inside',
'disc',
'circle',
'square',
'decimal',
'decimal-leading-zero',
'arabic-indic',
'bengali',
'cambodian',
'khmer',
'devanagari',
'gujarati',
'gurmukhi',
'kannada',
'lao',
'malayalam',
'mongolian',
'myanmar',
'oriya',
'persian',
'urdu',
'telugu',
'tibetan',
'thai',
'lower-roman',
'upper-roman',
'lower-greek',
'lower-alpha',
'lower-latin',
'upper-alpha',
'upper-latin',
'cjk-earthly-branch',
'cjk-heavenly-stem',
'ethiopic-halehame',
'ethiopic-halehame-am',
'ethiopic-halehame-ti-er',
'ethiopic-halehame-ti-et',
'hangul',
'hangul-consonant',
'korean-hangul-formal',
'korean-hanja-formal',
'korean-hanja-informal',
'hebrew',
'armenian',
'lower-armenian',
'upper-armenian',
'georgian',
'cjk-ideographic',
'simp-chinese-formal',
'simp-chinese-informal',
'trad-chinese-formal',
'trad-chinese-informal',
'hiragana',
'katakana',
'hiragana-iroha',
'katakana-iroha'
]
},
'max-block-size': {values: ['-webkit-fill-available', 'min-content', 'max-content', 'fit-content']},
'max-inline-size': {values: ['-webkit-fill-available', 'min-content', 'max-content', 'fit-content']},
'min-block-size': {values: ['-webkit-fill-available', 'min-content', 'max-content', 'fit-content']},
'min-height': {values: ['-webkit-fill-available', 'min-content', 'max-content', 'fit-content']},
'min-inline-size': {values: ['-webkit-fill-available', 'min-content', 'max-content', 'fit-content']},
'min-width': {values: ['-webkit-fill-available', 'min-content', 'max-content', 'fit-content']},
'object-position': {values: ['top', 'bottom', 'left', 'right', 'center']},
'shape-outside': {values: ['border-box', 'content-box', 'padding-box', 'margin-box']},
'-webkit-appearance': {
values: [
'checkbox',
'radio',
'push-button',
'square-button',
'button',
'inner-spin-button',
'listbox',
'media-slider',
'media-sliderthumb',
'media-volume-slider',
'media-volume-sliderthumb',
'menulist',
'menulist-button',
'meter',
'progress-bar',
'slider-horizontal',
'slider-vertical',
'sliderthumb-horizontal',
'sliderthumb-vertical',
'searchfield',
'searchfield-cancel-button',
'textfield',
'textarea'
]
},
'-webkit-border-after': {
values: [
'hidden', 'inset', 'groove', 'outset', 'ridge', 'dotted', 'dashed', 'solid', 'double', 'medium', 'thick', 'thin'
]
},
'-webkit-border-after-style':
{values: ['hidden', 'inset', 'groove', 'outset', 'ridge', 'dotted', 'dashed', 'solid', 'double']},
'-webkit-border-after-width': {values: ['medium', 'thick', 'thin']},
'-webkit-border-before': {
values: [
'hidden', 'inset', 'groove', 'outset', 'ridge', 'dotted', 'dashed', 'solid', 'double', 'medium', 'thick', 'thin'
]
},
'-webkit-border-before-style':
{values: ['hidden', 'inset', 'groove', 'outset', 'ridge', 'dotted', 'dashed', 'solid', 'double']},
'-webkit-border-before-width': {values: ['medium', 'thick', 'thin']},
'-webkit-border-end': {
values: [
'hidden', 'inset', 'groove', 'outset', 'ridge', 'dotted', 'dashed', 'solid', 'double', 'medium', 'thick', 'thin'
]
},
'-webkit-border-end-style':
{values: ['hidden', 'inset', 'groove', 'outset', 'ridge', 'dotted', 'dashed', 'solid', 'double']},
'-webkit-border-end-width': {values: ['medium', 'thick', 'thin']},
'-webkit-border-start': {
values: [
'hidden', 'inset', 'groove', 'outset', 'ridge', 'dotted', 'dashed', 'solid', 'double', 'medium', 'thick', 'thin'
]
},
'-webkit-border-start-style':
{values: ['hidden', 'inset', 'groove', 'outset', 'ridge', 'dotted', 'dashed', 'solid', 'double']},
'-webkit-border-start-width': {values: ['medium', 'thick', 'thin']},
'-webkit-logical-height': {values: ['-webkit-fill-available', 'min-content', 'max-content', 'fit-content']},
'-webkit-logical-width': {values: ['-webkit-fill-available', 'min-content', 'max-content', 'fit-content']},
'-webkit-margin-collapse': {values: ['collapse', 'separate', 'discard']},
'-webkit-mask-box-image': {values: ['repeat', 'stretch', 'space', 'round']},
'-webkit-mask-box-image-repeat': {values: ['repeat', 'stretch', 'space', 'round']},
'-webkit-mask-clip': {values: ['text', 'border', 'border-box', 'content', 'content-box', 'padding', 'padding-box']},
'-webkit-mask-composite': {
values: [
'clear', 'copy', 'source-over', 'source-in', 'source-out', 'source-atop', 'destination-over', 'destination-in',
'destination-out', 'destination-atop', 'xor', 'plus-lighter'
]
},
'-webkit-mask-image':
{values: ['linear-gradient', 'radial-gradient', 'repeating-linear-gradient', 'repeating-radial-gradient', 'url']},
'-webkit-mask-origin': {values: ['border', 'border-box', 'content', 'content-box', 'padding', 'padding-box']},
'-webkit-mask-position': {values: ['top', 'bottom', 'left', 'right', 'center']},
'-webkit-mask-position-x': {values: ['left', 'right', 'center']},
'-webkit-mask-position-y': {values: ['top', 'bottom', 'center']},
'-webkit-mask-repeat': {values: ['repeat', 'repeat-x', 'repeat-y', 'no-repeat', 'space', 'round']},
'-webkit-mask-size': {values: ['contain', 'cover']},
'-webkit-max-logical-height': {values: ['-webkit-fill-available', 'min-content', 'max-content', 'fit-content']},
'-webkit-max-logical-width': {values: ['-webkit-fill-available', 'min-content', 'max-content', 'fit-content']},
'-webkit-min-logical-height': {values: ['-webkit-fill-available', 'min-content', 'max-content', 'fit-content']},
'-webkit-min-logical-width': {values: ['-webkit-fill-available', 'min-content', 'max-content', 'fit-content']},
'-webkit-perspective-origin-x': {values: ['left', 'right', 'center']},
'-webkit-perspective-origin-y': {values: ['top', 'bottom', 'center']},
'-webkit-text-decorations-in-effect': {values: ['blink', 'line-through', 'overline', 'underline']},
'-webkit-text-stroke': {values: ['medium', 'thick', 'thin']},
'-webkit-text-stroke-width': {values: ['medium', 'thick', 'thin']},
'-webkit-transform-origin-x': {values: ['left', 'right', 'center']},
'-webkit-transform-origin-y': {values: ['top', 'bottom', 'center']},
'width': {values: ['-webkit-fill-available']}
};
// final CSS property values for CSSMetadata to use as autocomplete list
// this object gets populated during initialization of cssMetadata instance
const _finalPropertyValues = {};
// Weight of CSS properties based on their usage from https://www.chromestatus.com/metrics/css/popularity
const Weight = {
'align-content': 57,
'align-items': 129,
'align-self': 55,
'animation': 175,
'animation-delay': 114,
'animation-direction': 113,
'animation-duration': 137,
'animation-fill-mode': 132,
'animation-iteration-count': 124,
'animation-name': 139,
'animation-play-state': 104,
'animation-timing-function': 141,
'backface-visibility': 123,
'background': 260,
'background-attachment': 119,
'background-clip': 165,
'background-color': 259,
'background-image': 246,
'background-origin': 107,
'background-position': 237,
'background-position-x': 108,
'background-position-y': 93,
'background-repeat': 234,
'background-size': 203,
'border': 263,
'border-bottom': 233,
'border-bottom-color': 190,
'border-bottom-left-radius': 186,
'border-bottom-right-radius': 185,
'border-bottom-style': 150,
'border-bottom-width': 179,
'border-collapse': 209,
'border-color': 226,
'border-image': 89,
'border-image-outset': 50,
'border-image-repeat': 49,
'border-image-slice': 58,
'border-image-source': 32,
'border-image-width': 52,
'border-left': 221,
'border-left-color': 174,
'border-left-style': 142,
'border-left-width': 172,
'border-radius': 224,
'border-right': 223,
'border-right-color': 182,
'border-right-style': 130,
'border-right-width': 178,
'border-spacing': 198,
'border-style': 206,
'border-top': 231,
'border-top-color': 192,
'border-top-left-radius': 187,
'border-top-right-radius': 189,
'border-top-style': 152,
'border-top-width': 180,
'border-width': 214,
'bottom': 227,
'box-shadow': 213,
'box-sizing': 216,
'caption-side': 96,
'clear': 229,
'clip': 173,
'clip-rule': 5,
'color': 256,
'content': 219,
'counter-increment': 111,
'counter-reset': 110,
'cursor': 250,
'direction': 176,
'display': 262,
'empty-cells': 99,
'fill': 140,
'fill-opacity': 82,
'fill-rule': 22,
'filter': 160,
'flex': 133,
'flex-basis': 66,
'flex-direction': 85,
'flex-flow': 94,
'flex-grow': 112,
'flex-shrink': 61,
'flex-wrap': 68,
'float': 252,
'font': 211,
'font-family': 254,
'font-kerning': 18,
'font-size': 264,
'font-stretch': 77,
'font-style': 220,
'font-variant': 161,
'font-weight': 257,
'height': 266,
'image-rendering': 90,
'justify-content': 127,
'left': 248,
'letter-spacing': 188,
'line-height': 244,
'list-style': 215,
'list-style-image': 145,
'list-style-position': 149,
'list-style-type': 199,
'margin': 267,
'margin-bottom': 241,
'margin-left': 243,
'margin-right': 238,
'margin-top': 253,
'mask': 20,
'max-height': 205,
'max-width': 225,
'min-height': 217,
'min-width': 218,
'object-fit': 33,
'opacity': 251,
'order': 117,
'orphans': 146,
'outline': 222,
'outline-color': 153,
'outline-offset': 147,
'outline-style': 151,
'outline-width': 148,
'overflow': 255,
'overflow-wrap': 105,
'overflow-x': 184,
'overflow-y': 196,
'padding': 265,
'padding-bottom': 230,
'padding-left': 235,
'padding-right': 232,
'padding-top': 240,
'page': 8,
'page-break-after': 120,
'page-break-before': 69,
'page-break-inside': 121,
'perspective': 92,
'perspective-origin': 103,
'pointer-events': 183,
'position': 261,
'quotes': 158,
'resize': 168,
'right': 245,
'shape-rendering': 38,
'size': 64,
'speak': 118,
'src': 170,
'stop-color': 42,
'stop-opacity': 31,
'stroke': 98,
'stroke-dasharray': 36,
'stroke-dashoffset': 3,
'stroke-linecap': 30,
'stroke-linejoin': 21,
'stroke-miterlimit': 12,
'stroke-opacity': 34,
'stroke-width': 87,
'table-layout': 171,
'tab-size': 46,
'text-align': 260,
'text-anchor': 35,
'text-decoration': 247,
'text-indent': 207,
'text-overflow': 204,
'text-rendering': 155,
'text-shadow': 208,
'text-transform': 202,
'top': 258,
'touch-action': 80,
'transform': 181,
'transform-origin': 162,
'transform-style': 86,
'transition': 193,
'transition-delay': 134,
'transition-duration': 135,
'transition-property': 131,
'transition-timing-function': 122,
'unicode-bidi': 156,
'unicode-range': 136,
'vertical-align': 236,
'visibility': 242,
'-webkit-appearance': 191,
'-webkit-backface-visibility': 154,
'-webkit-background-clip': 164,
'-webkit-background-origin': 40,
'-webkit-background-size': 163,
'-webkit-border-end': 9,
'-webkit-border-horizontal-spacing': 81,
'-webkit-border-image': 75,
'-webkit-border-radius': 212,
'-webkit-border-start': 10,
'-webkit-border-start-color': 16,
'-webkit-border-start-width': 13,
'-webkit-border-vertical-spacing': 43,
'-webkit-box-align': 101,
'-webkit-box-direction': 51,
'-webkit-box-flex': 128,
'-webkit-box-ordinal-group': 91,
'-webkit-box-orient': 144,
'-webkit-box-pack': 106,
'-webkit-box-reflect': 39,
'-webkit-box-shadow': 210,
'-webkit-column-break-inside': 60,
'-webkit-column-count': 84,
'-webkit-column-gap': 76,
'-webkit-column-rule': 25,
'-webkit-column-rule-color': 23,
'-webkit-columns': 44,
'-webkit-column-span': 29,
'-webkit-column-width': 47,
'-webkit-filter': 159,
'-webkit-font-feature-settings': 59,
'-webkit-font-smoothing': 177,
'-webkit-highlight': 1,
'-webkit-line-break': 45,
'-webkit-line-clamp': 126,
'-webkit-margin-after': 67,
'-webkit-margin-before': 70,
'-webkit-margin-collapse': 14,
'-webkit-margin-end': 65,
'-webkit-margin-start': 100,
'-webkit-margin-top-collapse': 78,
'-webkit-mask': 19,
'-webkit-mask-box-image': 72,
'-webkit-mask-image': 88,
'-webkit-mask-position': 54,
'-webkit-mask-repeat': 63,
'-webkit-mask-size': 79,
'-webkit-padding-after': 15,
'-webkit-padding-before': 28,
'-webkit-padding-end': 48,
'-webkit-padding-start': 73,
'-webkit-print-color-adjust': 83,
'-webkit-rtl-ordering': 7,
'-webkit-tap-highlight-color': 169,
'-webkit-text-emphasis-color': 11,
'-webkit-text-fill-color': 71,
'-webkit-text-security': 17,
'-webkit-text-stroke': 56,
'-webkit-text-stroke-color': 37,
'-webkit-text-stroke-width': 53,
'-webkit-user-drag': 95,
'-webkit-user-modify': 62,
'-webkit-user-select': 194,
'-webkit-writing-mode': 4,
'white-space': 228,
'widows': 115,
'width': 268,
'will-change': 74,
'word-break': 166,
'word-spacing': 157,
'word-wrap': 197,
'writing-mode': 41,
'z-index': 239,
'zoom': 200
};
/* Legacy exported object */
self.SDK = self.SDK || {};
/* Legacy exported object */
SDK = SDK || {};
/** @constructor */
SDK.CSSMetadata = CSSMetadata;
SDK.CSSMetadata.VariableRegex = VariableRegex;
SDK.CSSMetadata.URLRegex = URLRegex;
SDK.CSSMetadata.GridAreaRowRegex = GridAreaRowRegex;
SDK.cssMetadata = cssMetadata;
/**
* @typedef {{name: string, longhands: !Array.<string>, inherited: boolean, svg: boolean}}
*/
SDK.CSSMetadata.CSSPropertyDefinition;
/**
* @type {!Array<!SDK.CSSMetadata.CSSPropertyDefinition>}
*/
CSSMetadata._generatedProperties;
/**
* @type {!Object.<string, {values: !Array.<string>}>}
*/
CSSMetadata._generatedPropertyValues;