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

function runTest()
{
    // The first swipe should fail because we're scrolled to the middle of the document
    // and this is all a single gesture. We can only start swipes if we *begin*
    // pinned to the edge.
    startSwipeGesture(function () {
        completeSwipeGesture(function () {
            testRunner.clearTestRunnerCallbacks();
            testRunner.installDidBeginSwipeCallback(didBeginSwipeCallback);
            testRunner.installWillEndSwipeCallback(willEndSwipeCallback);
            testRunner.installDidEndSwipeCallback(didEndSwipeCallback);
            testRunner.installDidRemoveSwipeSnapshotCallback(didRemoveSwipeSnapshotCallback);    

            // The second swipe should succeed because we are now scrolled to the left edge.
            startSwipeGesture(function () { completeSwipeGesture(); });
        });
    });
}

function didBeginSwipeNotReachedCallback()
{
    log("Failure. Should never begin a swipe, because we were in the middle of a scrolling gesture that started when the main frame was not pinned to the left.");
}

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

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

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

    document.getElementById("large").innerHTML = isFirstPage() ? "first" : "second";

    if (isFirstPage()) {
        initializeSwipeTest();

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

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

        setTimeout(function () {
            window.location.href = window.location.href + "?second";
        }, 0);
        return;
    }

    // Second page loaded.
    window.scrollTo(100, 0);

    runTest();
};
</script>
</head>
<body>
<div id="large" style="width: 2000px; height: 2000px;"></div>
</body>
