<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../../resources/js-test-pre.js"></script>
<style type="text/css">
#touchtarget {
  width: 100px;
  height: 100px;
  background: blue;
}
</style>
</head>
<body onload="runTest();">
<div id="touchtarget">

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

<script>
var clickEventsReceived = 0;
var expectedMouseEvents = 4;
var mouseEventsReceived = 0;
var eventTypes = [ 'mousemove', 'mousedown', 'mouseup', 'click' ];

function gestureEventCallback(event)
{
    if (window.eventSender) {
        shouldBeEqualToString('event.type', eventTypes[mouseEventsReceived]);
        shouldBe('event.clientX', '20');
        shouldBe('event.clientY', '24');
        shouldBe("event.shiftKey", "false");
        shouldBe("event.altKey", "false");
        shouldBe("event.ctrlKey", "false");
        shouldBe("event.metaKey", "false");
        mouseEventsReceived++;
    } else {
        debug(event.type);
        debug(event.clientX);
        debug(event.clientY);
    }
}

// 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();
}

// Log that we still got the touch events.
function touchEventCallback(event) {
    touchEventsReceived++;
    debug('have received: ' + touchEventsReceived + ' touch events');
    return true;
}

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

function runTest() {
    if (window.internals) {
        window.internals.setPageScaleFactor(0.5, 0, 0);
    }

    var div = document.getElementById('touchtarget');
    div.addEventListener("mousedown", gestureEventCallback, false);
    div.addEventListener("click", gestureEventCallback, false);
    div.addEventListener("mouseup", gestureEventCallback, false);
    div.addEventListener("mousemove", gestureEventCallback, false);
    document.addEventListener("keydown", quitKeyToEndTest, false);

    if (window.testRunner)
        testRunner.waitUntilDone();

    if (window.eventSender) {
        description("This tests basic single touch gesture generation.");
        if (eventSender.clearTouchPoints) {
            eventSender.gestureTap(10, 12);
            eventSender.leapForward(10);
            eventSender.keyDown(' ');
        } else {
            endTest();
        }
    } else {
        debug("This test requires DumpRenderTree.  Tap on the blue rect to log.")
    }
}
</script>
</body>
</html>
