<!DOCTYPE html>
<title>Performance test changing "contain: layout size" box inside a document with complicated and expensive layout</title>
<style>
#wrapper {
    display: flex;
    flex-direction: column;
}
.row {
    display: flex;
}
#target {   
    contain: layout size;
}

</style>
<script src="../resources/runner.js"></script>
<pre id="log"></pre>
<div id="wrapper"></div>
<script>
    let wrapper = document.getElementById("wrapper");
    let target = undefined;

    const NUM_ROWS = 10;
    const DOM_DEPTH = 100;
    function createCells(depth) {
        let content = document.createElement("div");
        if (!target) {
            target = document.createElement("div");
            target.id = "target";
            content.appendChild(target);
        }
        content.appendChild(document.createElement("h1"));
        content.appendChild(document.createElement("paragraph"));

        if (depth > 0)
            content.appendChild(createCells(depth - 1));

        return content;
    }

    function generateContent() {
        for (let i = 0; i < NUM_ROWS; i++) {
            let row = document.createElement("div");
            row.classList.add("row");
            row.appendChild(createCells(DOM_DEPTH));
            wrapper.appendChild(row);
        }
    }

    function addTextToTarget() {
        for (let i = 0; i < 5; i++) {
            let textNode = document.createElement("div");
            textNode.innerHTML = "some text";
            target.appendChild(textNode);
        }
    }

    function removeTextFromTarget() {
        while (target.firstElementChild)
            target.removeChild(target.firstElementChild);
    }

    function runTest() {
        addTextToTarget();
        document.body.getBoundingClientRect();
        removeTextFromTarget();
        document.body.getBoundingClientRect();
    }

    function setupTest() {
        generateContent();
        document.body.getBoundingClientRect();
        PerfTestRunner.measureRunsPerSecond({
            description: 'Measures performance of changing contain: layout size box inside a document with complicated and expensive layout.',
            run: function () {
                runTest();
            },
            done: function() {
                wrapper.innerHTML = "";
            }
        });
    }
    window.requestAnimationFrame(setupTest);

</script>
