chromium/third_party/blink/web_tests/plugins/iframe-shims.html

<html><head>
<script>
    var expectedClicks = [];
    var clicks = [];

    var height = 100;
    var width = 100;
    var items = 0;

    function makePluginElement()
    {
        var f = document.createElement('embed');
        f.setAttribute('id', 'swf_embed_' + items);
        f.setAttribute('width', width + '');
        f.setAttribute('height', height + '');
        f.setAttribute('wmode', 'window');
        f.setAttribute('loop', 'false');
        f.setAttribute('src', 'resources/simple_blank.swf');
        f.setAttribute('type', 'application/x-shockwave-flash');
        return f;
    }

    function makePluginElementWithHigherZIndex()
    {
        var f = makePluginElement();
        f.style.zIndex = 1000;
        f.style.position = 'relative';
        return f;
    }

    function makeIframeDiv()
    {
        var i = document.createElement('iframe');
        i.style.position = 'absolute';
        i.style.top = '10px';
        i.style.left = '30px';
        i.style.width = '80px';
        i.style.height = '80px';
        i.setAttribute('frameborder', '0');
        i.setAttribute('src', 'javascript:void(0);');
        return i;
    }

    function makeOverlayDiv(color, caseId)
    {
        var o = document.createElement('div');
        o.style.position = 'absolute';
        o.style.top = '10px';
        o.style.left = '30px';
        o.style.width = '80px';
        o.style.height = '80px';
        o.style.backgroundColor = color;
        o.style.overflow = 'hidden';
        o.innerHTML = '<input type="button" id="button' + caseId + '" ' +
            'onclick="doClick(' + caseId +
            ');" value="clickme" style="position: absolute; top: 10; left: 10; width: 60px; height: 60px;"/>';
        return o;
    }
    
    function appendOverlay(overlayDivZIframe, overlayDivZOverlay, overlayInsideDiv, expectClickable, caseId)
    {
        var id = makeIframeDiv();
        var root = document.getElementById(caseId);
        if (overlayDivZIframe)
            id.style.zIndex = overlayDivZIframe;

        var od = makeOverlayDiv(expectClickable ? 'green' : 'red', caseId);
        od.style.position = 'absolute';
        if (overlayDivZOverlay)
            od.style.zIndex = overlayDivZOverlay;

        if (overlayInsideDiv) {
            var parentdiv = document.createElement('div');
            if (overlayDivZOverlay)
                parentdiv.style.zIndex = overlayDivZOverlay;

            parentdiv.style.position = 'absolute';
            parentdiv.style.top = '0px';
            parentdiv.style.left = '0px';
            parentdiv.appendChild(id);
            parentdiv.appendChild(od);
            root.appendChild(parentdiv);
        } else {
            root.appendChild(id);
            root.appendChild(od);
        }
    };

    function addCase(x, y, tags)
    {
        var caseId = items;
        items++;

        var expectClickable = tags.expect && tags.expect.indexOf('UNDER') == -1;
        expectedClicks[caseId] = expectClickable;

        var container = document.getElementById('container');
        var root = document.createElement('div');
        root.style.position = 'absolute';
        root.style.left = x * (width + 40) + 'px';
        root.style.top = y * (height + 20) + 'px';
        root.id = caseId;
        container.appendChild(root);

        var pluginDivZ;
        var overlayDivZIframe;
        var overlayDivZOverlay;
        if (tags.pluginLowerz) {
            pluginDivZ = 100;
            overlayDivZIframe = 200;
            overlayDivZOverlay = 201;
        } else if (tags.pluginHigherz) {
            pluginDivZ = 200;
            overlayDivZIframe = 100;
            overlayDivZOverlay = 101;
        } else if (tags.pluginEqualz) {
            pluginDivZ = 100;
            overlayDivZIframe = 100;
            overlayDivZOverlay = 100;
        } else if (tags.pluginExplicitHigherZIndex) {
            // For this test case we set the z-index for the iframe and the overlay
            // to be lower than the plugin.
            overlayDivZIframe = 100;
            overlayDivZOverlay = 0;
        }

        var appendPlugin = function()
        {
            var pd;
            if (tags.pluginExplicitHigherZIndex) {
                pd = makePluginElementWithHigherZIndex();
            } else {
                pd = makePluginElement();
            }

            if (tags.pluginInsideDiv || pluginDivZ) {
                var parentdiv = document.createElement('div');
                parentdiv.appendChild(pd)
                if (!tags.pluginNorelative)
                    parentdiv.style.position = 'relative';

                if (pluginDivZ)
                    parentdiv.style.zIndex = pluginDivZ;

                root.appendChild(parentdiv);
            } else {
                if (!tags.pluginNorelative)
                    pd.style.position = 'relative';
                root.appendChild(pd);
            }
        };

        if (tags.overlayEarlier) {
            appendOverlay(overlayDivZIframe, overlayDivZOverlay, tags.overlayInsideDiv, expectClickable, caseId);
            appendPlugin();
        } else {
            appendPlugin();
            if (tags.overlayOnTimeout) {
                setTimeout('appendOverlay('+overlayDivZIframe+', '+overlayDivZOverlay +', ' + tags.overlayInsideDiv + ', ' + expectClickable + ', ' + caseId + ')', 0);
            } else {
                appendOverlay(overlayDivZIframe, overlayDivZOverlay, tags.overlayInsideDiv, expectClickable, caseId);
            }
        }
     }

    function doClick(id)
    {
        clicks[id] = true;

        // Check success/failure.
        var output = document.getElementById("output");
        var waitingForMoreClicks = false;
        var k;
        for (k in expectedClicks) {
            if (expectedClicks[k] && !clicks[k])
                waitingForMoreClicks = true;
            else if (!expectedClicks[k] && clicks[k]) {
                output.innerHTML = 'FAILURE';
                return;
            }
        }

        if (!waitingForMoreClicks) {
            output.innerHTML = 'SUCCESS';
            return;
        }
    }

    function init() {
        addCase(0, 0, {expect:'overlay OVER'});
        addCase(1, 0, {'overlayEarlier':1, 'overlayInsideDiv': 1, 'pluginInsideDiv':1, expect:'overlay UNDER'});
        addCase(2, 0, {'pluginLowerz':1, expect:'overlay OVER'});
        addCase(3, 0, {'pluginHigherz':1, expect:'overlay UNDER'});
        addCase(0, 1, {'overlayInsideDiv':1, expect:'overlay OVER'});
        addCase(1, 1, {'pluginLowerz':1, 'overlayInsideDiv':1, expect:'overlay OVER'});
        addCase(2, 1, {'pluginHigherz':1, 'overlayInsideDiv':1, expect:'overlay UNDER'});
        addCase(0, 2, {'pluginEqualz':1, 'overlayInsideDiv':1, expect:'overlay OVER'});
        addCase(1, 2, {'pluginEqualz':1, 'overlayInsideDiv':1, 'overlayEarlier':1, expect:'overlay UNDER'});
        addCase(2, 2, {'overlayEarlier':1, expect:'overlay UNDER'});
        addCase(3, 2, {'overlayEarlier':1, 'pluginNorelative':1, expect:'overlay OVER'});
        addCase(0, 3, {'pluginNorelative':1, expect:'overlay OVER'});
        addCase(1, 3, {'overlayEarlier':1, 'pluginNorelative':1, 'pluginInsideDiv':1, expect:'overlay OVER'});
        addCase(2, 3, {'pluginNorelative':1, 'pluginInsideDiv':1, expect:'overlay OVER'});
        addCase(3, 3, {'pluginLowerz':1, 'overlayOnTimeout':1, expect:'overlay OVER'});
        addCase(4, 0, {'pluginExplicitHigherZIndex': 1, 'pluginNorelative': 1, 'pluginInsideDiv': 1, 'overlayInsideDiv': 1, expect: 'overlay UNDER' });
        runTest();
    }

    // Automation: try to click on each button.
    var nextIdToClick = 0;

    function runTest() {
        if (window.testRunner && window.eventSender) {
            testRunner.waitUntilDone();
            testRunner.dumpAsText();
            setTimeout(doNextClick, 0);
        }
    }

    function moveMouseOver(elemName) {
        var elem = document.getElementById(elemName);
        var x = elem.offsetLeft + elem.scrollWidth / 2;
        var y = elem.offsetTop + elem.scrollHeight / 2;
        var offsetParent = elem.offsetParent;
        while (offsetParent) {
            x += offsetParent.offsetLeft;
            y += offsetParent.offsetTop;
            offsetParent = offsetParent.offsetParent;
        }
        eventSender.mouseMoveTo(x, y);
    }

    function doNextClick() {
        eventSender.mouseUp();
        if (nextIdToClick < expectedClicks.length) {
            moveMouseOver('button' + nextIdToClick);
            eventSender.mouseDown();
            nextIdToClick++;
            setTimeout(doNextClick, 0);
        } else {
            setTimeout(function() {
                testRunner.notifyDone();
            }, 0);
        }
    }

</script>
</head>
<body onload="init()">

    <p>Test that iframe shims can be used to overlay HTML above a
    windowed plugin. The red squares should be hidden by the blue
    flash plugins, and the green squares should appear over the
    plugins. To test interactively, click over the buttons on the
    squares. You should not be able to reach the red squares'
    buttons.</p>

    <p>Prints "SUCCESS" on success, "FAILURE" on failure.</p>
    <div id=output>NONE</div>
    <div id="container" style="position: relative;"></div>

</body>
</html>