<!DOCTYPE html>

<html>
<head>
    <script src="../../resources/js-test-pre.js"></script>
    <script>
        description('Test that compositing updates do not happen in an iframe with no compoting layers.');
        window.jsTestIsAsync = true;

        let updateCount;
        let iframeWindow;
        let iframeDocument;
        let targetElement;

        function zeroUpdateCount()
        {
            if (iframeWindow.internals) {
                iframeWindow.internals.updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks();
                iframeWindow.internals.startTrackingCompositingUpdates();
            }
        }

        function updateLayoutAndCompositingCount()
        {
            if (iframeWindow.internals) {
                iframeWindow.internals.updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks();
                updateCount = iframeWindow.internals.compositingUpdateCount();
            }
        }
        
        function testForCompositingUpdate(callback)
        {
            zeroUpdateCount();
            callback();
            updateLayoutAndCompositingCount();
        }
        
        function runTests()
        {
            iframeWindow = document.getElementById('iframe').contentWindow;
            
            updateLayoutAndCompositingCount();

            if (iframeWindow.internals) {
                iframeWindow.internals.startTrackingCompositingUpdates();
                updateCount = iframeWindow.internals.compositingUpdateCount();
            }
            
            iframeDocument = iframeWindow.document;
            targetElement = iframeDocument.getElementById('middle');

            doNextTest();
        }

        let tests = [
            {
                'description' : 'Initial',
                'mutation' : async () => {
                    return;
                },
            },
            {
                'description' : 'Layout',
                'mutation' : async () => {
                    targetElement.style.overflow = 'hidden';
                    return;
                }
            },
            {
                'description' : 'Change stacking order',
                'mutation' : async () => {
                    targetElement.style.zIndex = 1;
                    return Promise.resolve();
                }
            },
            {
                'description' : 'Negative z-order child',
                'mutation' : async () => {
                    targetElement.style.zIndex = -1;
                    let targetBounds = targetElement.getBoundingClientRect();
                    let x = targetBounds.x + targetBounds.width / 2;
                    let y = targetBounds.y + targetBounds.height / 2;
                    iframeDocument.elementFromPoint(x, y); // Force a z-order list update.
                    return Promise.resolve();
                }
            },
            {
                'description' : 'Change visibility',
                'mutation' : async () => {
                    targetElement.style.visibility = 'hidden';
                    return Promise.resolve();
                }
            },
            {
                'description' : 'Change content',
                'mutation' : async () => {
                    iframeDocument.getElementById('child').textContent = 'child';
                    return Promise.resolve();
                }
            },
            {
                'description' : 'Change clip path',
                'mutation' : async () => {
                    targetElement.style.webkitClipPath = 'inset(0 20% 0 50px)';
                    return Promise.resolve();
                }
            },
            {
                'description' : 'Change transform',
                'mutation' : async () => {
                    targetElement.style.transform = 'translate(10px, 20px)';
                    return Promise.resolve();
                }
            },
            {
                'description' : 'Image change',
                'mutation' : async () => {
                    let image = iframeDocument.getElementById('image');
                    return new Promise((resolve, reject)=> {
                        image.onload = ()=> resolve();
                        image.src = "data:image/gif;base64,R0lGODlhAQABAPAAAP8REf///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==";
                    });
                }
            },
            // Must be last
            {
                'description' : 'Remove layer',
                'mutation' : async () => {
                    targetElement.remove();
                    return Promise.resolve();
                }
            },
        ];

        function resetStyle(element)
        {
            element.removeAttribute('style');
        }
        
        let nextTestIndex = 0;
        async function doNextTest()
        {
            if (nextTestIndex == tests.length) {
                finishJSTest();
                return;
            }

            let test = tests[nextTestIndex];
            debug(test.description);

            zeroUpdateCount();
            await test.mutation();
            updateLayoutAndCompositingCount();

            shouldBe('updateCount', '0');
            resetStyle(targetElement);
            
            setTimeout(() => {
                ++nextTestIndex;
                doNextTest();
            }, 0);
        }
        
        window.addEventListener('load', () => {
            window.setTimeout(runTests, 0);
        }, false);
    </script>

</head>
<body>
    <iframe id="iframe" src="resources/non-composited.html"></iframe>

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