<!-- webkit-test-runner [ enableBackForwardCache=true ] -->
<html>
<head>
    <title>Test resource load callbacks going back to a cached main resource</title>
    <script>
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.dumpResourceLoadCallbacks();
        testRunner.setCanOpenWindows();
        testRunner.waitUntilDone();
    }

    // Window we will be controlling.
    var target;

    // Counter for visits to first page.
    var firstPageVisits = 0;

    window.addEventListener('message', function(event) {

        if (event.data === 'first-page') {
            firstPageVisits++;
            if (firstPageVisits < 3)
                target.postMessage('navigate-other-page', '*');
            if (firstPageVisits == 3)
                window.testRunner.notifyDone();
            return;
        }

        if (event.data === 'other-page') {
            switch (firstPageVisits) {
            case 1:
                target.postMessage('navigate-first-page', '*');
                break;
            case 2:
                target.postMessage('navigate-back', '*');
                break;
            }
            return;
        }

    }, false);

    function startTest() {
        // Open the target window and we will start to exchange messages.
        target = window.open('resources/first-page.html');
    }
    </script>
</head>
<body onload="startTest();">
    <p>This test check the following situation:</p>
    <ul>
        <li>First you navigate to a page (first-page.html).</li>
        <li>Then you go to another page (other-page.html).</li>
        <li>You repeat previous steps again (going to first-page.html and then to other-page.html).</li>
        <li>Finally you click back.</li>
    </ul>
    <p>The problem was that the resource load callbacks when going back to the cached main resource were not being called.</p>
    <p>See <a href="https://bugs.webkit.org/show_bug.cgi?id=112418">bug #112418</a>.</p>
</body>
</html>
