<!DOCTYPE html>

<html>
<head>
<script src="media-file.js"></script>
<script src="../resources/js-test-pre.js"></script>
    <style>
        .container {
            width: 456px;
            height: 50px;
            margin: 4px;
            padding: 2px;
            box-sizing: border-box;
            border: 1px solid gray;
            position: relative;
            z-index: 0;
        }
        
        audio {
            display: block;
            margin: 20px;
        }
    </style>
    <script>
        if (window.testRunner)
            testRunner.dumpAsText();

        jsTestIsAsync = true;

        function containsLayerWithSize(layersText, width, height)
        {
            var lines = layersText.split('\n');
            
            var re = /\(bounds ([.\d]+) ([.\d]+)\)/;
            
            for (var line of lines) {
                var result;
                if (result = re.exec(line)) {
                    if (parseFloat(result[1]) == width && parseFloat(result[2]) == height)
                        return true;
                }
                
            }
            return false;
        }
        
        var mediaElementsToWaitFor = 2;
        function setupVideos()
        {
            setSrcById('loaded-video', findMediaFile('video', 'content/test'));

            var video = document.getElementById('loaded-video');
            video.addEventListener("canplaythrough", function() {
                checkForMediaLoaded(--mediaElementsToWaitFor);
            });
            video.load();

            setSrcById('loaded-audio', findMediaFile('audio', 'content/test'));
            var audio = document.getElementById('loaded-audio')
            audio.addEventListener("canplaythrough", function() {
                checkForMediaLoaded(--mediaElementsToWaitFor);
            });
            audio.load();
        }
        
        function checkForMediaLoaded(loadsRemaining)
        {
            if (loadsRemaining)
                return;
            
            testCompositedContainer();
        }

        var layers;
        function testCompositedContainer()
        {
            if (!window.internals)
                return;

            description('Tests that media controls don\'t trigger compositing on an ancestor via isolatesBlending');
            layers = internals.layerTreeAsText(document);
            
            shouldBeFalse('containsLayerWithSize(layers, 456, 50)');
            
            finishJSTest();
        }
        
        window.addEventListener('load', setupVideos, false);
    </script>
</head>
<body>

<div class="container">
    <audio controls="controls"/>
</div>

<div class="container">
    <video id="loaded-audio" controls="controls"/>
</div>

<div class="container">
    <video src="" controls="controls"/>
</div>

<div class="container">
    <video id="loaded-video" controls="controls"/>
</div>

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