<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
    <title>New Window Opener Test</title>
    <script src="../../../resources/js-test-pre.js"></script>
</head>

<body>

    <script type="text/javascript">
        if (window.testRunner) {
            testRunner.dumpAsText();
            testRunner.waitUntilDone();
        }

    
        description(
            'This tests that the different arguments given to a new window are honored.<br/>\
            Take note that menubar is special and always on in Mac but not in Win.'
        );

        var args = [ "scrollbars=yes,width=75,height=100"
                   , "scrollbars=no,width=75,height=100"
                   , "scrollbars=1,width=75,height=100"
                   , "scrollbars=0,width=75,height=100"
                   , "toolbar=yes,width=75,height=100"
                   , "toolbar=no,width=75,height=100"
                   , "toolbar=1,width=75,height=100"
                   , "toolbar=0,width=75,height=100"
                   , "status=yes,width=75,height=100"
                   , "status=no,width=75,height=100"
                   , "status=1,width=75,height=100"
                   , "status=0,width=75,height=100"
                   , "menubar=yes,width=75,height=100"
                   , "menubar=no,width=75,height=100"
                   , "menubar=1,width=75,height=100"
                   , "menubar=0,width=75,height=100"
                   , "location=yes,width=75,height=100"
                   , "location=no,width=75,height=100"
                   , "location=1,width=75,height=100"
                   , "location=0,width=75,height=100"
                   ];

        var actual = [ "newWin.scrollbars.visible", "newWin.scrollbars.visible", "newWin.scrollbars.visible", "newWin.scrollbars.visible"
                     , "newWin.toolbar.visible", "newWin.toolbar.visible", "newWin.toolbar.visible", "newWin.toolbar.visible"
                     , "newWin.statusbar.visible", "newWin.statusbar.visible", "newWin.statusbar.visible", "newWin.statusbar.visible"
                     , "newWin.menubar.visible", "newWin.menubar.visible", "newWin.menubar.visible", "newWin.menubar.visible"
                     , "newWin.locationbar.visible", "newWin.locationbar.visible", "newWin.locationbar.visible", "newWin.locationbar.visible"
                     ];

        var expected = [ "true", "false", "true", "false"
                       , "true", "false", "true", "false"
                       , "true", "false", "true", "false"
                       , "true", "isMenubarAlwaysExpected", "true", "isMenubarAlwaysExpected"
                       , "true", "false", "true", "false"
                       ];

        // Since Mac always shows the menu bar we need to special case it, but in
        // a way that does not require platform specific results.
        var isMacOSX = navigator.userAgent.indexOf("Mac OS X");
        var isMenubarAlwaysExpected;
        if (isMacOSX != -1)
            isMenubarAlwaysExpected = true;
        else
            isMenubarAlwaysExpected = false;

        var testNum = 0;
        var lastTest = args.length;
        var newWin;

        nextTest();
        function nextTest() {
            if (testNum == lastTest) {
                isSuccessfullyParsed();
                if (window.testRunner)
                    testRunner.notifyDone();
                return;
            } else if (testNum == 0) {
                debug("");
                debug("Scrollbar");
            } else if (testNum == 4) {
                debug("");
                debug("Toolbar");
            } else if (testNum == 8) {
                debug("");
                debug("Statusbar");
            } else if (testNum == 12) {
                debug("");
                debug("Menubar");
            } else if (testNum == 16) {
                debug("");
                debug("Locationbar");
            }

            //get the next test and run it.
            newWin = window.open("../resources/abe.png", "testWindow", args[testNum] );
            shouldBe(actual[testNum], expected[testNum]);
            ++testNum;
            closeAndRunNextTest(newWin);
        }

        function closeAndRunNextTest(winToClose) {
            winToClose.close();
            setTimeout(doneHandler, 1);

            function doneHandler() {
                if (winToClose.closed) {
                    setTimeout(nextTest, 1);
                    return;
                }
                setTimeout(doneHandler, 1);
            }    
        }

    </script>
</body>
</html>

