<!DOCTYPE html>

<html>
<head>
    <style>
        .box {
            width: 100px;
            height: 100px;
            margin: 10px;
            background-color: blue;
            border: 2px solid black;
            -webkit-transform: translateZ(0);
        }
        
        .colorchange {
            background-color: green;
        }
        
        .dummy {
            /* Empty. */
        }
        
    </style>
    <script src="../../resources/js-test-pre.js"></script>
    <script>
        description('Test that compositing updates do not happen for style changes that do not need them.');
        window.jsTestIsAsync = true;

        var updateCount;
        
        function zeroUpdateCount()
        {
            if (window.internals) {
                internals.updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks();
                internals.startTrackingCompositingUpdates();
            }
        }

        function updateLayoutAndCompositingCount()
        {
            if (window.internals) {
                internals.updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks();
                updateCount = internals.compositingUpdateCount();
            }
        }
        
        function testForCompositingUpdate(callback)
        {
            zeroUpdateCount();
            callback();
            updateLayoutAndCompositingCount();
        }
        
        function runTest()
        {
            updateLayoutAndCompositingCount();

            if (window.internals) {
                internals.startTrackingCompositingUpdates();
                updateCount = internals.compositingUpdateCount();
            }

            shouldBe('updateCount', '0');
            
            testForCompositingUpdate(function() {
                document.getElementById('box').classList.add('colorchange');
            });
            
            shouldBe('updateCount', '1');

            testForCompositingUpdate(function() {
                document.getElementById('box').classList.add('dummy');
            });

            shouldBe('updateCount', '0');
            
            testForCompositingUpdate(function() {
                var div = document.createElement('div');
                div.className = 'box';
                document.body.appendChild(div);
            });
            
            shouldBe('updateCount', '1');
            
            testForCompositingUpdate(function() {
                var stylesheet = document.createElement('style');
                stylesheet.type = 'text/css';
                stylesheet.rel = 'stylesheet';
                stylesheet.textContent = '.unmatched { border: 5px solid blue; }';
                document.getElementsByTagName("head")[0].appendChild(stylesheet);
            });
            
            shouldBe('updateCount', '0');

            finishJSTest();
        }
        
        window.addEventListener('load', function() {
            window.setTimeout(runTest, 200);
        }, false);
    </script>

</head>
<body>
    <div id="box" class="box"></div>

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