<!DOCTYPE html>
<html>
<head>
    <style>
        body {
            height: 5000px;
        }
        .container > div {
            margin: 20px;
            width: 100px;
            height: 100px;
            background-color: blue;
        }
    </style>
    <script src="../../resources/js-test-pre.js"></script>
    <script>
        description('Test that layout and render layer updates do not happen for style changes that do not need them.');
        window.jsTestIsAsync = true;

        var results = [];
        var result;

	// Stash the results during the test, so that we don't mutate layout inserting the output into the document.
        function expectLayoutAndLayerUpdateCounts(layoutCount, layerUpdateCount)
        {
            results.push({
                expectedLayoutCount: layoutCount,
                actualLayoutCount: internals.layoutUpdateCount(),
                expectedLayerUpdateCount: layerUpdateCount,
                actualLayerUpdateCount: internals.renderLayerPositionUpdateCount()
            });
        }

        function runTest()
        {
            internals.updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks();
            internals.startTrackingLayoutUpdates();
            internals.startTrackingRenderLayerPositionUpdates();

            const boxes = document.querySelectorAll('.box');

            // Check that interleaved mutations and getBoundingClientRect don't trigger layer updates.
            boxes[0].style.width = "101px";
            boxes[0].getBoundingClientRect();

            expectLayoutAndLayerUpdateCounts(1, 0);

	    boxes[1].style.width = "101px";
            boxes[1].getBoundingClientRect();

            expectLayoutAndLayerUpdateCounts(2, 0);

            boxes[2].style.width = "101px";
            boxes[2].getBoundingClientRect();

            expectLayoutAndLayerUpdateCounts(3, 0);

            // Check that getBoundingClientRect without mutations doesn't do any extra work.
            for (let box of boxes) {
                box.getBoundingClientRect();
            }

            expectLayoutAndLayerUpdateCounts(3, 0);

            // Check that flushing layout via another property results in the layer update happening.
            boxes[1].offsetTop;

            expectLayoutAndLayerUpdateCounts(4, 1);

            for (let i = 0; i < results.length; i++) {
              result =  results[i];
              shouldBe('result.actualLayoutCount', 'result.expectedLayoutCount');
              shouldBe('result.actualLayerUpdateCount', 'result.expectedLayerUpdateCount');
            }

            finishJSTest();
        }

        window.addEventListener('load', function() {
            window.setTimeout(runTest, 200);
        }, false);
    </script>
</head>
<body>
  <div class="container">
    <div id="box" class="box"></div>
    <div id="box" class="box"></div>
    <div id="box" class="box"></div>
    <div id="box" class="box"></div>
    <div id="box" class="box"></div>
    <div id="box" class="box"></div>
    <div id="box" class="box"></div>
    <div id="box" class="box"></div>
  </div>

    <script src="../../resources/js-test-post.js"></script>
</body>
</html>
