<html>
<head>
    <script>
        function log(msg)
        {
            document.getElementById("log").appendChild(
                document.createTextNode(msg + "\n"));
        }
        
        function setFrameHandler(frameId)
        {
            if (frameId == "") {
                window.onfocus = function()
                {
                    log("main frame focused.");
                }
            
                window.onblur = function()
                {
                    log("main frame blurred.");
                }
            } else {
                var frameWin = document.getElementById(frameId).contentWindow;
                frameWin.onfocus = function()
                {
                    log(frameId + " focused.");
                }

                frameWin.onblur = function()
                {
                    log(frameId + " blurred.");
                }
            }
        }

        function setFrameFocus(frameId)
        {
            if (frameId == "") {
                window.focus();
            } else {
                var frameWin = document.getElementById(frameId).contentWindow;
                frameWin.focus();
            }
        }

        function testMainFrameToIFrameFocus()
        {
            log("\nTest: main frame to iframe.");
            setFrameFocus("");
            setFrameFocus("iframe1");
        }

        function testIFrameToMainFrameFocus()
        {
            log("\nTest: iframe to main frame.");
            setFrameFocus("iframe1");
            setFrameFocus("");
        }

        function testIFrameToIFrameFocus()
        {
            log("\nTest: iframe1 to iframe2.");
            setFrameFocus("iframe1");
            setFrameFocus("iframe2");
            setFrameFocus("iframe1");
        }

        function testFrame1OnBlurSetFrame2Focus()
        {
            var frameWin1 = document.getElementById("iframe1").contentWindow;
            frameWin1.onfocus = function()
            {
                log("iframe1 focused.");
            }

            frameWin1.onblur = function()
            {
                log("iframe1 blurred.");
                // This set focus request will be ignored because the FocusController
                // is in the middle of changing focused frame.
                setFrameFocus("iframe2");
            }

            log("\nTest: iframe1 onblur sets iframe2 focus.");
            setFrameFocus("");
            setFrameFocus("iframe1");
            setFrameFocus("");
        }

        function testFrame1OnBlurSetFrame1Focus()
        {
            var frameWin1 = document.getElementById("iframe1").contentWindow;
            frameWin1.onfocus = function()
            {
                log("iframe1 focused.");
            }

            frameWin1.onblur = function()
            {
                log("iframe1 blurred.");
                // This set focus request will be ignored because the FocusController
                // is in the middle of changing focused frame.
                setFrameFocus("iframe1");
            }

            log("\nTest: iframe1 onblur sets iframe1 focus.");
            setFrameFocus("");
            setFrameFocus("iframe1");
            setFrameFocus("");
        }

        function testFrame1OnFocusSetFrame2Focus()
        {
            var frameWin1 = document.getElementById("iframe1").contentWindow;
            frameWin1.onfocus = function()
            {
                log("iframe1 focused.");
                // This set focus request will be ignored because the FocusController
                // is in the middle of changing focused frame.
                setFrameFocus("iframe2");
            }

            frameWin1.onblur = function()
            {
                log("iframe1 blurred.");
            }

            log("\nTest: iframe1 onfocus sets iframe2 focus.");
            setFrameFocus("");
            setFrameFocus("iframe1");
        }

        function testFrame1OnFocusSetFrame1Focus()
        {
            var frameWin1 = document.getElementById("iframe1").contentWindow;
            frameWin1.onfocus = function()
            {
                log("iframe1 focused.");
                // This set focus request will be ignored because the FocusController
                // is in the middle of changing focused frame.
                setFrameFocus("iframe1");
            }

            frameWin1.onblur = function()
            {
                log("iframe1 blurred.");
            }

            log("\nTest: iframe1 onfocus sets iframe1 focus.");
            setFrameFocus("");
            setFrameFocus("iframe1");
        }

        function test()
        {
            if (window.testRunner) {
                testRunner.dumpAsText();
            }

            setFrameHandler("");
            setFrameHandler("iframe1");
            setFrameHandler("iframe2");

            // Test the correct frame is focused when switching focus from
            // one frame to another.
            testMainFrameToIFrameFocus();
            testIFrameToMainFrameFocus();
            testIFrameToIFrameFocus();
            
            // New setting focus request will be ignored if the focus controller
            // is in the middle of switching focused frame (onblur, onfocus events).
            testFrame1OnBlurSetFrame2Focus();
            testFrame1OnBlurSetFrame1Focus();
            testFrame1OnFocusSetFrame2Focus();
            testFrame1OnFocusSetFrame1Focus();
            
            // Restore iframe1 onfocus and onblur handlers.
            setFrameHandler("iframe1");
        }

    </script>
</head>
<body onload="test()">
    <iframe id="iframe1" style="width: 100px; height: 100px;"></iframe>
    <iframe id="iframe2" style="width: 100px; height: 100px;"></iframe>
    <p>Test the focus controller working properly when switching focused frame. Here are the cases tested:
    <br>
    <br>-. Correct frame is focused when switching focus from one frame to another:
    <br>1. main frame -> iframe
    <br>2. iframe to main frame
    <br>3. iframe 1 to iframe 2
    <br>
    <br>-. New setting focus request will be ignored if the focus controller is in the middle of switching focused frame (onblur, onfocus events):
    <br>1. iframe 1 onblur sets iframe 2 focus.
    <br>2. iframe 1 onblur sets iframe 1 focus.
    <br>3. iframe 1 onfocus sets iframe 2 focus.
    <br>4. iframe 1 onfocus sets iframe 1 focus.
    </p>
    <pre id="log"></pre>
</body>
</html>
