blob: 811dc7526b585171042c742892c981cac204382d [file] [log] [blame]
// Compares two CSSStyleValues to check if they're the same type
// and have the same attributes.
function assert_style_value_equals(a, b) {
if (a == null || b == null) {
assert_equals(a, b);
return;
}
assert_equals(a.constructor.name, b.constructor.name);
const className = a.constructor.name;
switch (className) {
case 'CSSKeywordValue':
assert_equals(a.value, b.value);
break;
case 'CSSUnitValue':
assert_approx_equals(a.value, b.value, 1e-6);
assert_equals(a.unit, b.unit);
break;
case 'CSSMathSum':
case 'CSSMathProduct':
case 'CSSMathMin':
case 'CSSMathMax':
assert_style_value_array_equals(a.values, b.values);
break;
case 'CSSMathInvert':
case 'CSSMathNegate':
assert_style_value_equals(a.value, b.value);
break;
case 'CSSUnparsedValue':
assert_style_value_array_equals(a, b);
break;
case 'CSSVariableReferenceValue':
assert_equals(a.variable, b.variable);
assert_style_value_equals(a.fallback, b.fallback);
break;
}
}
// Compares two arrays of CSSStyleValues to check if every element is equal
function assert_style_value_array_equals(a, b) {
assert_equals(a.length, b.length);
for (let i = 0; i < a.length; i++) {
assert_style_value_equals(a[i], b[i]);
}
}
// Creates a new div element with specified inline style.
function newDivWithStyle(style) {
let target = document.createElement('div');
target.style = style;
return target;
}
const gValidUnits = [
'number', 'percent', 'em', 'ex', 'ch',
'ic', 'rem', 'lh', 'rlh', 'vw',
'vh', 'vi', 'vb', 'vmin', 'vmax',
'cm', 'mm', 'q', 'in', 'pt',
'pc', 'px', 'deg', 'grad', 'rad',
'turn', 's', 'ms', 'Hz', 'kHz',
'dpi', 'dpcm', 'dppx', 'fr',
];
// Hacky way of creating a CSSVariableReferenceValue
// since it doesn't expose a constructor.
function createReferenceValue(variable, fallback) {
const varExpr = 'var(' + variable + ')';
const unparsedValue = newDivWithStyle('color:' + varExpr).attributeStyleMap.get('color');
let referenceValue = unparsedValue[0];
referenceValue.fallback = fallback;
return referenceValue;
}