<!-- webkit-test-runner [ enableBackForwardCache=true ] -->
<head>
<style>
html {
    font-size: 32pt;
}
</style>
<script src="resources/swipe-test.js"></script>
<script>
function runTest()
{
    playEventStream(`[{
        "relativeTimeMS" : 0,
        "kCGEventScrollGestureFlagBits" : 1,
        "kCGEventGestureHIDType" : 6,
        "kCGSEventTypeField" : 29,
        "kCGEventGesturePhase" : 128,
        "windowLocation" : "{400, 300}"
      },
      {
        "relativeTimeMS" : 8,
        "kCGEventGestureHIDType" : 61,
        "kCGSEventTypeField" : 29,
        "kCGEventGestureStartEndSeriesType" : 6,
        "windowLocation" : "{0, 0}"
      },
      {
        "kCGEventGestureHIDType" : 6,
        "relativeTimeMS" : 8,
        "windowLocation" : "{400, 300}",
        "kCGEventGesturePhase" : 1,
        "kCGEventScrollGestureFlagBits" : 1,
        "kCGSEventTypeField" : 29,
        "kCGEventGestureScrollX" : 2
      },
      {
        "relativeTimeMS" : 8,
        "windowLocation" : "{400, 300}",
        "kCGScrollWheelEventScrollPhase" : 1,
        "kCGScrollWheelEventIsContinuous" : 1,
        "kCGScrollWheelEventPointDeltaAxis2" : 1,
        "kCGSEventTypeField" : 22
      }]`, goBack);
}

function goBack()
{
    window.history.back();

    setTimeout(continueTest, 0);
}

function continueTest()
{
    playEventStream(`[
      {
        "relativeTimeMS" : 0,
        "windowLocation" : "{400, 300}",
        "kCGScrollWheelEventScrollPhase" : 1,
        "kCGScrollWheelEventIsContinuous" : 1,
        "kCGScrollWheelEventPointDeltaAxis2" : 20,
        "kCGSEventTypeField" : 22
      }]`, function () {
        completeTest();
      });
}

function completeTest()
{
    completeSwipeGesture(testComplete);
}

function didBeginSwipeCallback()
{
    log("Failed. Should not begin swipe; we've already navigated away from the item where the swipe started, and there is no other back item.");
}

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.dumpAsText();
    testRunner.waitUntilDone();

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

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

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