<!DOCTYPE html>
<html>
<body onLoad="runTest()">
    <script src="/js-test-resources/js-test-pre.js"></script>
    <script>
    description("Test that we don't attempt to revalidate the cached main resource on history navigation");
    jsTestIsAsync = true;

    if (window.testRunner)
        testRunner.setCanOpenWindows();

    // Values to check.
    var originalRandomNumber = 0;
    var backLoadRandomNumber = 0;
    var refreshRandomNumber  = 0;
    var nextLoadRandomNumber = 0;

    // Window we will be controlling.
    var target;

    // Pass messages between windows to control the navigation types.
    var pre = document.getElementById('console');
    window.addEventListener('message', function(event) {

        // First time, record the first number, and tell the target window to trigger a back navigation.
        if (!originalRandomNumber) {
            originalRandomNumber = event.data;
            target.postMessage('go-forward-and-back', '*');
            return;
        }

        // Second time, record the second number. It should be identical. Also tell the target window to reload.
        if (!backLoadRandomNumber) {
            backLoadRandomNumber = event.data;
            var wasCached = (backLoadRandomNumber === originalRandomNumber);
            if (wasCached)
                testPassed('no-cache subresource was cached and used for a back navigation');
            else
                testFailed('no-cache subresource should have been cached and used in a back navigation');

            target.postMessage('reload', '*');
            return;
        }

        // Third time, record the third number. It should not match. Also tell the target window to navigate forward.
        if (!refreshRandomNumber) {
            refreshRandomNumber = event.data;
            var wasCached = (refreshRandomNumber === originalRandomNumber);
            if (wasCached)
                testFailed('no-cache subresource should have been refetched with a reload');
            else
                testPassed('no-cache subresource was refetched with a reload');

            target.postMessage('next', '*');
            return;
        }

        // Fourth time, record the fourth number. It should not match any numbers so far.
        if (!nextLoadRandomNumber) {
            nextLoadRandomNumber = event.data;
            var wasCached = (nextLoadRandomNumber === originalRandomNumber || nextLoadRandomNumber === refreshRandomNumber);
            if (wasCached)
                testFailed('no-cache subresource should have been refetched with a normal navigation');
            else
                testPassed('no-cache subresource was refetched with a normal navigation');
        }

        // Test completed.
        target.close();
        finishJSTest();

    }, false);

    function runTest() {
        // Open the target window and it will begin to send us messages.
        target = window.open('https://127.0.0.1:8443/cache/resources/no-cache-main-resource.php');
    }
    </script>
    <script src="/js-test-resources/js-test-post.js"></script>
</body>
</html>
