<!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;

if (window.testRunner)
    testRunner.overridePreference("WebKitUsesPageCachePreferenceKey", 1);

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>
