<!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="/common/performance-timeline-utils.js"></script>
        <script src="resources/webperftestharness.js"></script>
        <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.
                step_timeout(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>
