<!-- webkit-test-runner [ enableBackForwardCache=true ] -->
<head>
<style>
html {
    font-size: 32pt;
}
</style>
<script src="resources/swipe-test.js"></script>
<script>

function didBeginSwipeCallback()
{
    log("didBeginSwipe");

    completeSwipeGesture();
}

function willEndSwipeCallback()
{
    log("willEndSwipe");

    shouldBe(false, isFirstPage(), "The swipe should not yet have navigated away from the second page.");
}

function didEndSwipeCallback()
{
    log("didEndSwipe");

    startMeasuringDuration("snapshotRemoval");
}

function didRemoveSwipeSnapshotCallback()
{
    log("didRemoveSwipeSnapshot");
    
    shouldBe(true, isFirstPage(), "The swipe should have navigated back to the first page.");
    measuredDurationShouldBeLessThan("snapshotRemoval", 1000, "Because we're using the page cache, it shouldn't be long between the gesture completing and the snapshot being removed.")

    testComplete();
}

function isFirstPage()
{
    return window.location.href.indexOf("second") == -1;
}

function updateContent()
{
    document.body.innerHTML = isFirstPage() ? "first" : "second";
}

window.onload = function () {
    if (!window.eventSender || !window.testRunner) {
        document.body.innerHTML = "This test must be run in WebKitTestRunner.";
        return;
    }

    updateContent();

    initializeSwipeTest();

    testRunner.installDidBeginSwipeCallback(didBeginSwipeCallback);
    testRunner.installWillEndSwipeCallback(willEndSwipeCallback);
    testRunner.installDidEndSwipeCallback(didEndSwipeCallback);
    testRunner.installDidRemoveSwipeSnapshotCallback(didRemoveSwipeSnapshotCallback);

    testRunner.dumpAsText();
    testRunner.waitUntilDone();

    window.addEventListener("popstate", function(e) {
        updateContent();
    });

    setTimeout(function () { 
        history.pushState(null, null, "/second");
        updateContent();

        setTimeout(function () {
            startSwipeGesture();
        }, 0);
    }, 0);
};
</script>
</head>
<body>
</body>
