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