1bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvar div = document.createElement("div");
2bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsendiv.id = "touchtarget";
3bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsendiv.style.width = "100px";
4bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsendiv.style.height = "100px";
5bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsendiv.style.backgroundColor = "blue";
6bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
7bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvar lastEvent = null;
8bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvar touchEventsReceived = 0;
9bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvar EXPECTED_TOUCH_EVENTS_TOTAL = 3;
10bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
11bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenfunction touchEventCallback() {
12bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (window.eventSender) {
13bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        lastEvent = event;
14bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        verifyTouch(touchEventsReceived++);
15bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    } else {
16bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        debug(event.type);
17bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
18bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
19bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (window.layoutTestController && touchEventsReceived == EXPECTED_TOUCH_EVENTS_TOTAL) {
20bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // If we've got here, we can safely say we were successfully parsed :) We need to
21bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // call the isSucccessfullyParsed function to output the correct TEST COMPLETE
22bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // footer message.
23bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        successfullyParsed = true;
24bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        isSuccessfullyParsed();
25bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        layoutTestController.notifyDone();
26bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
27bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
28bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
29bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsendiv.addEventListener("touchstart", touchEventCallback, false);
30bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsendiv.addEventListener("touchmove", touchEventCallback, false);
31bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsendiv.addEventListener("touchend", touchEventCallback, false);
32bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsendocument.body.insertBefore(div, document.body.firstChild);
33bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
34bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenfunction verifyTouchEvent(type, totalTouchCount, changedTouchCount, targetTouchCount)
35bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
36bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    shouldBeEqualToString("lastEvent.type", type);
37bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    shouldBe("lastEvent.touches.length", totalTouchCount.toString());
38bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    shouldBe("lastEvent.changedTouches.length", changedTouchCount.toString());
39bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    shouldBe("lastEvent.targetTouches.length", targetTouchCount.toString());
40bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    shouldBe("lastEvent.pageX", "0");
41bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    shouldBe("lastEvent.pageY", "0");
42bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
43bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
44bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenfunction verifyTouchPoint(list, point, x, y, id)
45bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
46bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    shouldBe("lastEvent." + list + "[" + point + "].pageX", x.toString());
47bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    shouldBe("lastEvent." + list + "[" + point + "].pageY", y.toString());
48bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    shouldBe("lastEvent." + list + "[" + point + "].clientX", x.toString());
49bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    shouldBe("lastEvent." + list + "[" + point + "].clientY", y.toString());
50bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    shouldBe("lastEvent." + list + "[" + point + "].identifier", id.toString());
51bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
52bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
53bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenfunction verifyTouch(which) {
54bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    switch (which) {
55bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        case 0:
56bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchEvent("touchstart", 2, 2, 2);
57bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("touches", 0, 10, 10, 0);
58bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("touches", 1, 20, 30, 1);
59bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("changedTouches", 0, 10, 10, 0);
60bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("changedTouches", 1, 20, 30, 1);
61bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("targetTouches", 0, 10, 10, 0);
62bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("targetTouches", 1, 20, 30, 1);
63bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        break;
64bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        case 1:
65bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchEvent("touchmove", 2, 2, 2);
66bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("touches", 0, 15, 15, 0);
67bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("touches", 1, 25, 35, 1);
68bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("changedTouches", 0, 15, 15, 0);
69bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("changedTouches", 1, 25, 35, 1);
70bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("targetTouches", 0, 15, 15, 0);
71bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("targetTouches", 1, 25, 35, 1);
72bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        break;
73bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        case 2:
74bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchEvent("touchend", 0, 2, 0);
75bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("changedTouches", 0, 15, 15, 0);
76bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            verifyTouchPoint("changedTouches", 1, 25, 35, 1);
77bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        break;
78bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
79bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        default: testFailed("Wrong number of touch events! (" + which + ")");
80bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
81bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
82bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
83bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenfunction multiTouchSequence()
84bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
85bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    eventSender.addTouchPoint(10, 10);
86bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    eventSender.addTouchPoint(20, 30);
87bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    eventSender.touchStart();
88bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
89bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    eventSender.updateTouchPoint(0, 15, 15);
90bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    eventSender.updateTouchPoint(1, 25, 35);
91bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    eventSender.touchMove();
92bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
93bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    eventSender.releaseTouchPoint(0);
94bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    eventSender.releaseTouchPoint(1);
95bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    eventSender.touchEnd();
96bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
97bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
98bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenif (window.eventSender) {
99bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    description("This tests basic multi touch event support. This is a limited version of test basic-multi-touch-events.html that avoids the situation where one touch point is released while another is maintained.");
100bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
101bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    lastEvent = null;
102bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    eventSender.clearTouchPoints();
103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    multiTouchSequence();
104bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} else {
105bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    debug("This test requires DumpRenderTree.  Tap on the blue rect to log.")
106bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
107bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
108bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvar successfullyParsed = true;
109