<!-- webkit-test-runner [ enablePageCache=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>
