<!DOCTYPE html>
<html>
<head>
    <title>Test Caching "no-store" For History Only</title>
</head>
<body>
    <p>
        This test checks that loading a subresource with "Cache-Control: no-store" 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();
        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)
                pre.appendChild(document.createTextNode('PASS - no-store subresource was cached and used for a back navigation\n'));
            else
                pre.appendChild(document.createTextNode('FAIL - no-store 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 - no-store subresource should have been refetched with a reload\n'));
            else
                pre.appendChild(document.createTextNode('PASS - no-store 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 - no-store subresource should have been refetched with a normal navigation\n'));
            else
                pre.appendChild(document.createTextNode('PASS - no-store 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('resources/no-store-resource.html');
    </script>
</body>
</html>
