<!DOCTYPE html>
<html>
<head>
    <style>
        iframe {
            height: 200px;
            width: 400px;
        }
    </style>
    <script src="/js-test-resources/js-test-pre.js"></script>
    <script src="/js-test-resources/ui-helper.js"></script>
    
    <script>
    description("Tests that DOM Timers are throttled in subframes that are cross-origin, and not in same-origin frames");
    window.jsTestIsAsync = true;
    
    var crossOriginFrame;
    var sameOriginFrame

    var throttledState = {
        'cross' : undefined,
        'same' : undefined,
    }

    var messageHandler;
    var messagesReceived = 0;

    function interactWithSubframes()
    {
        UIHelper.activateAt(crossOriginFrame.offsetLeft + 20, crossOriginFrame.offsetTop + 20).then(function() {
            debug("Interacted with cross-origin frame");
            UIHelper.activateAt(sameOriginFrame.offsetLeft + 20, sameOriginFrame.offsetTop + 20).then(function() {
                debug("Interacted with same-origin frame");
                messageHandler = checkUnthrottledAfterInteraction;
                messagesReceived = 0;
                crossOriginFrame.contentWindow.postMessage("report-throttle-cross", "*");
                sameOriginFrame.contentWindow.postMessage("report-throttle-same", "*");
            });
        });
    }

    function runTest()
    {
        crossOriginFrame = document.getElementById("cross-origin-frame");
        sameOriginFrame = document.getElementById("same-origin-frame");

        debug("Checking that DOM Timers are throttled in cross origin frame");
        
        messageHandler = checkInitiallyThrottled;
        messagesReceived = 0;
        crossOriginFrame.contentWindow.postMessage("report-throttle-cross", "*");
        sameOriginFrame.contentWindow.postMessage("report-throttle-same", "*");
    }

    function checkInitiallyThrottled()
    {
        shouldBeEqualToString("throttledState['cross']", "true");
        shouldBeEqualToString("throttledState['same']", "false");
        interactWithSubframes();
    }

    function checkUnthrottledAfterInteraction()
    {
        shouldBeEqualToString("throttledState['cross']", "false");
        shouldBeEqualToString("throttledState['same']", "false");
        finishJSTest();
    }

    window.onmessage = function(message)
    {
        if (message.data === "timerReachedMaxNestingLevel") {
            if (++messagesReceived == 2)
                runTest();
            return;
        }

        var re = /throttled\[(\w+)\]: (true|false)/;
        var match = re.exec(message.data);
        if (match) {
            frameID = match[1];
            throttledState[frameID] = match[2];
            if (++messagesReceived == 2)
                messageHandler();
            return;
        }
        
        debug("Failed to handle message " + message.data);
    }
    </script>
</head>
<body>
    <iframe id="cross-origin-frame" src="http://localhost:8000/frame-throttling/resources/timer-throttling-frame.html?dontcacheme"></iframe>
    <iframe id="same-origin-frame" src="resources/timer-throttling-frame.html?dontcacheme"></iframe>

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