<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../../../resources/js-test-pre.js"></script>
</head>
<body onload="runTest();">
<div id="gesture">

<p id="description"></p>
<div id="console"></div>

<script>
var expectedEvents = [
  {type: 'mousemove', x: 10, y: 12, detail: 0 },
  {type: 'mousedown', x: 10, y: 12, detail: 1 },
  {type: 'mouseup', x: 10, y: 12, detail: 1 },
  {type: 'click', x: 10, y: 12, detail: 1 },
  {type: 'mousemove', x: 11, y: 12, detail: 0 },
  {type: 'mousedown', x: 11, y: 12, detail: 2 },
  {type: 'mouseup', x: 11, y: 12, detail: 2 },
  {type: 'click', x: 11, y: 12, detail: 2 },
  {type: 'dblclick', x: 11, y: 12, detail: 2 },
  ];

var mouseEventsReceived = 0;

function gestureEventCallback(event)
{
    if (window.eventSender) {
        shouldBeEqualToString('event.type', expectedEvents[mouseEventsReceived].type);
        shouldEvaluateTo('event.clientX', expectedEvents[mouseEventsReceived].x);
        shouldEvaluateTo('event.clientY', expectedEvents[mouseEventsReceived].y);
        shouldEvaluateTo('event.detail', expectedEvents[mouseEventsReceived].detail);
        mouseEventsReceived++;
    } else {
        debug(event.type);
        debug(event.clientX);
        debug(event.clientY);
        debug(event.detail);
    }
}

// Because we may not have a gesture recognizer, we send a key press
// event to end the test without temporal flakiness.
function quitKeyToEndTest(event) {
    endTest();
}

function endTest()
{
    if (mouseEventsReceived < expectedEvents.length) {
        debug('Gesture manager not implemented on this platform.');
    }
    // Bail.
    isSuccessfullyParsed();
    testRunner.notifyDone();
}

function runTest() {
    var div = document.getElementById('gesture');
    div.addEventListener("mousedown", gestureEventCallback, false);
    div.addEventListener("click", gestureEventCallback, false);
    div.addEventListener("dblclick", gestureEventCallback, false);
    div.addEventListener("mouseup", gestureEventCallback, false);
    div.addEventListener("mousemove", gestureEventCallback, false);
    document.addEventListener("keydown", quitKeyToEndTest, false);

    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    if (window.eventSender) {
        description("This tests gesture callbacks for a double tap sequence of gestures.");
        eventSender.gestureTap(10, 12);
        eventSender.leapForward(10);
        eventSender.gestureTap(11, 12, 2);
        eventSender.leapForward(50);
        eventSender.keyDown(' ');
    } else {
        debug("This test requires DumpRenderTree.")
    }
}
</script>
</body>
</html>
