<html>
<body>
Test pageshow/pagehide event behavior when navigating away from a page with frames, putting the page in the page cache, then back to it.
<pre id="log"></pre>
</body>
<script>

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
    testRunner.overridePreference("WebKitUsesPageCachePreferenceKey", 1);
}

// We explicitly chain the loading of the subframes to ensure consistent test results between runs.
var didLoadSubframes = appendIframe("resources/pageshow-pagehide-subframe-cachable.html").then(() => appendIframe("resources/pageshow-pagehide-subframe-cachable-2.html"));

function appendIframe(url)
{
    var promise = new Promise((resolve, reject) => {
        var iframe = document.createElement("iframe");
        iframe.onload = resolve;
        iframe.src = url;
        document.body.appendChild(iframe);
    });
    return promise;
}

function log(message)
{
    // Logging to the console instead of the "log" DIV in the DOM because
    // otherwise we trigger the assert mentioned at http://webkit.org/b/43152
    // (since we log during pagehide)
    console.log(message);
}

log("***Top level frame being parsed for the initial page load***");

window.onload = function(evt) {
    log("Main frame window.onload");
}

window.onpageshow = function(evt) {
    log("Main frame window.onpageshow" + ", target = " + evt.target + ", persisted = " + evt.persisted);
    if (evt.persisted) {
        if (window.testRunner)
            testRunner.notifyDone();
    } else {
        log("***Navigating top-level frame to a page that will immediately navigate back to this one***");
        didLoadSubframes.then(() => {
            // Location changes need to happen outside the onload handler to generate history entries.
            setTimeout(() => { window.location.href = "data:text/html,<script>history.back();</scr" + "ipt>"; }, 0);
        });
    }
}

window.onpagehide = function(evt) {
    log("Main frame window.onpagehide" + ", target = " + evt.target + ", persisted = " + evt.persisted);
}

</script>
</html>
