<!DOCTYPE html>
<html>
<head>
    <title>Test Caching "max-age" For History Only</title>
</head>
<body>
    <p>
        This test checks that loading a subresource with "Cache-Control: max-age=0" is
        cached and reused in back navigation when the page is not in the page cache.
    </p>
    <p>
        We then test that loading the same subresource is refetched when used in
        non-stale loads such as refreshes or normal navigation.
    </p>
    <pre id="console"></pre>
    <script>
    // Asynchronous test because this requires a new window to perform multiple navigations.
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    // 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)
                pre.appendChild(document.createTextNode('PASS - max-age subresource was cached and used for a back navigation\n'));
            else
                pre.appendChild(document.createTextNode('FAIL - max-age subresource should have been cached and used in a back navigation\n'));
            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)
                pre.appendChild(document.createTextNode('FAIL - max-age subresource should have been refetched with a reload\n'));
            else
                pre.appendChild(document.createTextNode('PASS - max-age subresource was refetched with a reload\n'));
            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)
                pre.appendChild(document.createTextNode('FAIL - max-age subresource should have been refetched with a normal navigation\n'));
            else
                pre.appendChild(document.createTextNode('PASS - max-age subresource was refetched with a normal navigation\n'));
        }

        // Test completed.
        target.close();
        if (window.testRunner)
            window.testRunner.notifyDone();

    }, false);

    // Open the target window and it will begin to send us messages.
    target = window.open('https://127.0.0.1:8443/cache/resources/max-age-resource.html');
    </script>
</body>
</html>
