<!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>
