<!DOCTYPE html>
<head>
<title>CSS Custom Properties and Variables: Changes that require resolving variable references</title>
<script src="../resources/runner.js"></script>
<script src="resources/utils.js"></script>
</head>
<style>
.container > div {
display: inline-block;
height: 14px;
width: 14px;
box-sizing: border-box;
border: 1px solid green;
}
.container {
height: 0px;
overflow: hidden;
}
</style>
<body>
<header id=info>CSS Variables: <button id=button></button></header>
<script>
const NUM_ELEMENTS = 20000;
const PROP_COUNT = 1000;
let curBorder = -1;
let root = document.createElement('div');
root.classList.add(`container`);
// Add ?ref to URL to run a similar test without CSS Variables.
const ref = document.location.href.endsWith('?ref');
button.textContent = ref ? 'OFF' : 'ON';
button.addEventListener('click', function(){
let href = document.location.href;
if (ref) {
document.location.href = href.substr(0, href.length - 4);
} else {
document.location.href = href + '?ref';
}
});
function hexcolor(i) {
let hex = i.toString(16);
while (hex.length < 6)
hex = '0' + hex;
return '#' + hex;
}
function createDOMTree() {
for (let n = 0; n < NUM_ELEMENTS; n++) {
let div = document.createElement('div');
let i = n % PROP_COUNT;
div.classList.add(`bg-color${i}`);
root.appendChild(div);
}
document.body.appendChild(root);
}
function createDivRules() {
let lines = [];
for (let i = 0; i < PROP_COUNT; i++) {
lines.push(`.border${i} > div { border-color: ${hexcolor(i)}; }`);
if (ref)
lines.push(`.bg-color${i} { background-color: ${hexcolor(i)}; }`);
else
lines.push(`.bg-color${i} { background-color: var(--prop-${i}); }`);
}
return lines.join('\n');
}
// Create a rule which defines 'propCount' custom properties at :root.
function createRootRule() {
if (ref)
return;
let lines = [':root {'];
for (let i = 0; i < PROP_COUNT; i++) {
lines.push(`--prop-${i}: ${hexcolor(i)};`);
}
lines.push('}');
return lines.join('\n');
}
applyCSSRule(createDivRules());
applyCSSRule(createRootRule());
createDOMTree();
PerfTestRunner.measureTime({
description: "Measures the performance of the CSS variable reference recalc.",
setup: () => {
root.classList.remove(`border${curBorder}`);
// Using PROP_COUNT to ensure different border values, avoiding the style cache
curBorder = (curBorder + 1) % PROP_COUNT;
},
run: function() {
root.classList.add(`border${curBorder}`);
forceStyleRecalc(document.body);
},
});
</script>
</body>