<!-- webkit-test-runner [ enableBackForwardCache=true ] -->
<!DOCTYPE html>
<html>
<body>
<script src="../../resources/js-test-pre.js"></script>
<script>
description('Tests that a page with a running AudioContext does not go into the page cache.');
window.jsTestIsAsync = true;

window.addEventListener("pageshow", function(event) {
    debug("pageshow - " + (event.persisted ? "" : "not ") + "from cache");

    if (!window.sessionStorage.page_cache_running_audiocontext_test_started)
        return;

    delete window.sessionStorage.page_cache_running_audiocontext_test_started;

    if (event.persisted)
        testFailed("Page did enter and was restored from the page cache");
    else
        testPassed("Page was not restored from page cache");

    finishJSTest();
}, false);

window.addEventListener("pagehide", function(event) {
    debug("pagehide - " + (event.persisted ? "" : "not ") + "entering cache");
    if (event.persisted) {
        testFailed("Page entered the page cache.");
        finishJSTest();
    }
}, false);

window.addEventListener('load', function() {
    audioContext = new webkitAudioContext();

    oscillator = audioContext.createOscillator();
    oscillator.frequency.value = 300;
    oscillator.type = 0;
    oscillator.connect(audioContext.destination);
    oscillator.start(0);

    setTimeout(function() {
        // Force a back navigation back to this page.
        window.sessionStorage.page_cache_running_audiocontext_test_started = true;
        window.location.href = "resources/page-cache-helper.html";
    }, 0);
}, false);

</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
