<!-- webkit-test-runner [ UsesBackForwardCache=true ] -->
<!DOCTYPE html>
<html>
<body>
<script src="../../resources/js-test-pre.js"></script>
<script>
description('Tests that notifications do not prevent the Page from entering page cache if they are idle or closed.');
window.jsTestIsAsync = true;

if (window.testRunner)
    testRunner.grantWebNotificationPermission("file://");

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

    if (event.persisted) {
        testPassed("Page did enter and was restored from the page cache");
        finishJSTest();
    }
}, false);

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

window.addEventListener('load', function() {
    // This notification is shown and should be suspendable once it is closed.
    notification = new Notification('title', { body: 'body' });
    notification.ondisplay = function() {
        // Close the notification.
        setTimeout(function() {
            notification.close();
        }, 0);
    };
    notification.onerror = function() {
        testFailed("Could not display the notification");
        finishJSTest();
    };
    notification.onclose = function() {
        setTimeout(function() {
            // Force a back navigation back to this page.
            window.location.href = "resources/page-cache-helper.html";
        }, 0);
    };
}, false);

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