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