<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>window.navigation.type for back and forward navigations</title>
        <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
        <link rel="help" href="http://www.w3.org/TR/navigation-timing/#sec-navigation-info-interface"/>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="resources/webperftestharness.js"></script>
        <link rel="stylesheet" href="/resources/testharness.css" />
        <script>
            setup({explicit_done: true});

            // explicitly test the namespace before we start testing
            test_namespace('navigation');

            function onload_test()
            {
                if (performanceNamespace === undefined)
                {
                    // avoid script errors
                    done();
                    return;
                }

                // do this with a timeout to see the visuals of the navigations.
                setTimeout("nav_frame();", 100);
            }

            var step = 1;
            function nav_frame()
            {
                var navigation_frame = document.getElementById("frameContext").contentWindow;
                switch (step)
                {
                    case 1:
                    {
                        navigation_frame.location.href = '/navigation-timing/resources/blank_page_green_with_onunload.html';
                        step++;
                        break;
                    }
                    case 2:
                    {
                        test_equals(navigation_frame.performance.navigation.type,
                                performanceNamespace.navigation.TYPE_NAVIGATE,
                                'window.performance.navigation.type == TYPE_NAVIGATE');
                        navigation_frame.history.back();
                        step++;
                        break;
                    }
                    case 3:
                    {
                        test_equals(navigation_frame.performance.navigation.type,
                                performanceNamespace.navigation.TYPE_BACK_FORWARD,
                                'window.performance.navigation.type == TYPE_BACK_FORWARD after history.back()');
                        step++;
                        navigation_frame.history.forward();
                        break;
                    }
                    case 4:
                    {
                        test_equals(navigation_frame.performance.navigation.type,
                                performanceNamespace.navigation.TYPE_BACK_FORWARD,
                                'window.performance.navigation.type == TYPE_BACK_FORWARD after history.forward()');
                        done();
                        step++;
                        break;
                    }
                    default:
                        break;
                }
            }
        </script>

    </head>
    <body>
        <h1>
            Description</h1>
        <p>
            This test validates the value of window.performance.navigation.type with a forward
            and back navigation.</p>

        <p>This page should be loaded with a yellow background frame below.  It should turn green for a starting
            navigation, back to yellow for a back navigation and then back to green again for a forward navigation.</p>

        <p>Along the navigation timeline the frame.window.performance.type is checked for TYPE_BACK_FORWARD.</p>

        <p>This test passes if all of the checks to the navigation.type are correct throughout the navigation
            scenario and the frame below ends with a green background.  Otherwise, this test fails.</p>

        <div id="log"></div>
        <br />
        <iframe id="frameContext" onload="onload_test();" src="resources/blank_page_yellow_with_onunload.html" style="width: 250px; height: 250px;"></iframe>
    </body>
</html>
