[Pointer Events WPT] Provide iOS testdriver
authorgraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Apr 2019 19:13:35 +0000 (19:13 +0000)
committergraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Apr 2019 19:13:35 +0000 (19:13 +0000)
https://bugs.webkit.org/show_bug.cgi?id=197101
<rdar://problem/50044834>

Reviewed by Dean Jackson.

Add support for the "none" action source and for the "touch" pointer type. This allows us to run the touch-specific
WPT tests for Pointer Events and add some baseline expectations for those tests.

* web-platform-tests/pointerevents/pointerevent_change-touch-action-onpointerdown_touch-expected.txt: Added.
* web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt: Added.
* web-platform-tests/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-expected.txt: Added.
* web-platform-tests/pointerevents/pointerevent_pointerout_after_pointercancel_touch-expected.txt: Added.
* web-platform-tests/pointerevents/pointerevent_releasepointercapture_onpointercancel_touch-expected.txt: Added.
* web-platform-tests/pointerevents/pointerevent_touch-action-auto-css_touch-expected.txt: Added.
* web-platform-tests/pointerevents/pointerevent_touch-action-inherit_highest-parent-none_touch-expected.txt: Added.
* web-platform-tests/pointerevents/pointerevent_touch-action-pan-x-pan-y_touch-expected.txt: Added.
* web-platform-tests/resources/testdriver-vendor.js:
(logDebug): Take a callback so that we don't run code for the purpose of logging unless we're in debug mode.
(dispatchMouseActions):
(dispatchTouchActions): Use testRunner.runUIScript() to compile an event stream based on the input from the WPT tests.
(window.test_driver_internal.action_sequence): Handle the "none" source to insert "pause" commands in the pointer source.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244460 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_change-touch-action-onpointerdown_touch-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerout_after_pointercancel_touch-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_releasepointercapture_onpointercancel_touch-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_touch-action-auto-css_touch-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_touch-action-inherit_highest-parent-none_touch-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_touch-action-pan-x-pan-y_touch-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/resources/testdriver-vendor.js

index 465e02b..108156a 100644 (file)
@@ -1,3 +1,28 @@
+2019-04-19  Antoine Quint  <graouts@apple.com>
+
+        [Pointer Events WPT] Provide iOS testdriver
+        https://bugs.webkit.org/show_bug.cgi?id=197101
+        <rdar://problem/50044834>
+
+        Reviewed by Dean Jackson.
+
+        Add support for the "none" action source and for the "touch" pointer type. This allows us to run the touch-specific
+        WPT tests for Pointer Events and add some baseline expectations for those tests.
+
+        * web-platform-tests/pointerevents/pointerevent_change-touch-action-onpointerdown_touch-expected.txt: Added.
+        * web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt: Added.
+        * web-platform-tests/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-expected.txt: Added.
+        * web-platform-tests/pointerevents/pointerevent_pointerout_after_pointercancel_touch-expected.txt: Added.
+        * web-platform-tests/pointerevents/pointerevent_releasepointercapture_onpointercancel_touch-expected.txt: Added.
+        * web-platform-tests/pointerevents/pointerevent_touch-action-auto-css_touch-expected.txt: Added.
+        * web-platform-tests/pointerevents/pointerevent_touch-action-inherit_highest-parent-none_touch-expected.txt: Added.
+        * web-platform-tests/pointerevents/pointerevent_touch-action-pan-x-pan-y_touch-expected.txt: Added.
+        * web-platform-tests/resources/testdriver-vendor.js:
+        (logDebug): Take a callback so that we don't run code for the purpose of logging unless we're in debug mode.
+        (dispatchMouseActions):
+        (dispatchTouchActions): Use testRunner.runUIScript() to compile an event stream based on the input from the WPT tests.
+        (window.test_driver_internal.action_sequence): Handle the "none" source to insert "pause" commands in the pointer source.
+
 2019-04-18  Sihui Liu  <sihui_liu@apple.com>
 
         Blob type cannot be stored correctly in IDB when IDBObjectStore has autoIncrement and keyPath options
diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_change-touch-action-onpointerdown_touch-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_change-touch-action-onpointerdown_touch-expected.txt
new file mode 100644 (file)
index 0000000..ef3e9ef
--- /dev/null
@@ -0,0 +1,78 @@
+Pointer Events touch-action attribute support
+
+Test Description: Press and hold your touch. Try to scroll text in any direction. Then release your touch and try to scroll again. Expected: no panning.
+
+Note: this test is for touch-devices only
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+touch-action: auto to none
+
+The following pointer types were detected: touch.
+
+
+PASS touch-action was changed 
+PASS scroll should be received before the test finishes 
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointercancel_touch-expected.txt
new file mode 100644 (file)
index 0000000..edc0cbb
--- /dev/null
@@ -0,0 +1,15 @@
+pointercancel test
+
+Warning: this test works properly only for devices that have touchscreen
+
+Test Description: This test checks if pointercancel event triggers.
+Start touch over the black rectangle and then move your finger to scroll the page.
+
+
+Pointer Events pointercancel Tests
+
+The following pointer types were detected: touch.
+
+
+FAIL pointercancel event received assert_equals: isPrimary should be the same for pointerdown and pointercancel expected true but got false
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerleave_after_pointercancel_touch-expected.txt
new file mode 100644 (file)
index 0000000..0738983
--- /dev/null
@@ -0,0 +1,13 @@
+pointerleave after pointercancel
+
+Test Description: This test checks if pointerleave event triggers after pointercancel. Start touch on the black rectangle and move your touch to scroll in any direction.
+
+Note: this test is for touch devices only
+
+Pointer Events pointerleave tests
+
+The following pointer types were detected: (none).
+
+
+FAIL pointerleave event received assert_true: pointerleave should be received before the test finishes expected true got false
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerout_after_pointercancel_touch-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_pointerout_after_pointercancel_touch-expected.txt
new file mode 100644 (file)
index 0000000..ba524c0
--- /dev/null
@@ -0,0 +1,13 @@
+pointerout
+
+Test Description: This test checks if pointerout event triggers after pointercancel. Start touch on the black rectangle and move your touch to scroll in any direction.
+
+Note: this test is for touch devices only
+
+Pointer Events pointerout tests
+
+The following pointer types were detected: (none).
+
+
+FAIL pointerout event received assert_true: pointerout should be received before the test finishes expected true got false
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_releasepointercapture_onpointercancel_touch-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_releasepointercapture_onpointercancel_touch-expected.txt
new file mode 100644 (file)
index 0000000..eebb3b3
--- /dev/null
@@ -0,0 +1,18 @@
+Pointer Events Capture Test - release capture on pointercancel
+
+Test Description: This test checks if setCapture/releaseCapture functions works properly. Complete the following actions:
+Touch black rectangle and do not release your touch
+Move your touch to scroll the page. "lostpointercapture" should be logged inside of the black rectangle immediately after "pointercancel"
+
+Test passes if the proper behavior of the events is observed.
+Pointer Events Capture Test
+
+Test complete: Scroll to Summary to view Pass/Fail Results.
+
+The following pointer types were detected: touch.
+
+The following events were logged: gotpointercapture@target0, pointercancel@target0, lostpointercapture@target0.
+
+
+PASS pointer capture is released on pointercancel 
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_touch-action-auto-css_touch-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_touch-action-auto-css_touch-expected.txt
new file mode 100644 (file)
index 0000000..01aac38
--- /dev/null
@@ -0,0 +1,77 @@
+Pointer Events touch-action attribute support
+
+Test Description: Try to scroll text RIGHT.
+
+Note: this test is for touch-devices only
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+touch-action: auto
+
+The following pointer types were detected: touch.
+
+
+FAIL touch-action attribute test assert_true: x-scroll and y-scroll should be received before the test finishes expected true got false
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_touch-action-inherit_highest-parent-none_touch-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_touch-action-inherit_highest-parent-none_touch-expected.txt
new file mode 100644 (file)
index 0000000..2b9bf7d
--- /dev/null
@@ -0,0 +1,77 @@
+Pointer Events touch-action attribute support
+
+Test Description: Try to scroll text RIGHT.
+
+Note: this test is for touch-devices only
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+behaviour: auto
+
+The following pointer types were detected: touch.
+
+
+FAIL touch-action attribute test assert_true: x-scroll and y-scroll should be received before the test finishes expected true got false
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_touch-action-pan-x-pan-y_touch-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_touch-action-pan-x-pan-y_touch-expected.txt
new file mode 100644 (file)
index 0000000..ceef2b0
--- /dev/null
@@ -0,0 +1,77 @@
+Pointer Events touch-action attribute support
+
+Test Description: Try to scroll text RIGHT.
+
+Note: this test is for touch-devices only
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+Lorem ipsum dolor sit amet...
+
+touch-action: pan-x pan-y
+
+The following pointer types were detected: touch.
+
+
+FAIL touch-action attribute test assert_true: x-scroll and y-scroll should be received before the test finishes expected true got false
+
index bc556d5..8c65ebb 100644 (file)
@@ -1,10 +1,10 @@
 
 const isDebug = false;
 
-function logDebug(message)
+function logDebug(callback)
 {
     if (isDebug)
-        console.log(message);
+        console.log(callback());
 }
 
 function dispatchMouseActions(actions)
@@ -12,7 +12,7 @@ function dispatchMouseActions(actions)
     if (!window.eventSender)
         return Promise.reject(new Error("window.eventSender is undefined."));
 
-    return new Promise(function(resolve, reject) {
+    return new Promise(resolve => {
         setTimeout(() => {
             for (let action of actions) {
                 switch (action.type) {
@@ -20,21 +20,21 @@ function dispatchMouseActions(actions)
                     let origin = { x: 0, y: 0 };
                     if (action.origin instanceof Element) {
                         const bounds = action.origin.getBoundingClientRect();
-                        logDebug(`${action.origin.id} [${bounds.left}, ${bounds.top}, ${bounds.width}, ${bounds.height}]`);
+                        logDebug(() => `${action.origin.id} [${bounds.left}, ${bounds.top}, ${bounds.width}, ${bounds.height}]`);
                         origin.x = bounds.left + 1;
                         origin.y = bounds.top + 1;
                     }
-                    logDebug(`eventSender.mouseMoveTo(${action.x + origin.x}, ${action.y + origin.y})`);
+                    logDebug(() => `eventSender.mouseMoveTo(${action.x + origin.x}, ${action.y + origin.y})`);
                     eventSender.mouseMoveTo(action.x + origin.x, action.y + origin.y);
                     break;
                 case "pointerDown":
                     // FIXME: what to do with "button"?
-                    logDebug(`eventSender.mouseDown()`);
+                    logDebug(() => `eventSender.mouseDown()`);
                     eventSender.mouseDown();
                     break;
                 case "pointerUp":
                     // FIXME: what to do with "button"?
-                    logDebug(`eventSender.mouseUp()`);
+                    logDebug(() => `eventSender.mouseUp()`);
                     eventSender.mouseUp();
                     break;
                 default:
@@ -46,20 +46,119 @@ function dispatchMouseActions(actions)
     });
 }
 
+function dispatchTouchActions(actions)
+{
+    if (!window.testRunner || typeof window.testRunner.runUIScript !== "function")
+        return Promise.reject(new Error("window.testRunner.runUIScript() is undefined."));
+
+    let x = 0;
+    let y = 0;
+    let timeOffset = 0;
+
+    const events = actions.map(action => {
+        const touch = {
+            inputType : "finger",
+            id : 1,
+            x : action.x,
+            y : action.y,
+            pressure : 0
+        };
+
+        const command = {
+            inputType : "hand",
+            coordinateSpace : "content",
+            touches : [touch],
+            timeOffset
+        };
+
+        let timeOffsetIncrease = 0.05;
+
+        switch (action.type) {
+        case "pointerMove":
+            touch.phase = "moved";
+            if (action.origin instanceof Element) {
+                const bounds = action.origin.getBoundingClientRect();
+                touch.x += bounds.left + 1;
+                touch.y += bounds.top + 1;
+            }
+            break;
+        case "pointerDown":
+            touch.phase = "began";
+            break;
+        case "pointerUp":
+            touch.phase = "ended";
+            touch.x = x;
+            touch.y = y;
+            break;
+        case "pause":
+            timeOffsetIncrease = action.duration / 1000;
+            touch.phase = "stationary";
+            break;
+        default:
+            return Promise.reject(new Error(`Unknown action type "${action.type}".`));
+        }
+
+        x = touch.x;
+        y = touch.y;
+        timeOffset += timeOffsetIncrease;
+
+        return command;
+    });
+
+    const stream = JSON.stringify({ events });
+    logDebug(() => stream);
+
+    return new Promise(resolve => testRunner.runUIScript(`(function() {
+        (function() { uiController.sendEventStream('${stream}') })();
+        uiController.uiScriptComplete();
+    })();`, resolve));
+}
+
 if (window.test_driver_internal === undefined)
     window.test_driver_internal = { };
 
-window.test_driver_internal.action_sequence = function(actions)
+window.test_driver_internal.action_sequence = function(sources)
 {
-    const action = actions[0];
+    // https://w3c.github.io/webdriver/#processing-actions    
 
-    if (action.type !== "pointer")
-        return Promise.reject(new Error(`Unknown action type "${action.type}".`));
+    let noneSource;
+    let pointerSource;
+    for (let source of sources) {
+        switch (source.type) {
+        case "none":
+            noneSource = source;
+            break;
+        case "pointer":
+            pointerSource = source;
+            break;
+        default:
+            return Promise.reject(new Error(`Unknown source type "${action.type}".`));
+        }
+    }
 
-    if (action.parameters.pointerType !== "mouse")
+    if (!pointerSource)
         return Promise.reject(new Error(`Unknown pointer type pointer type "${action.parameters.pointerType}".`));
 
-    // FIXME: Handle iOS.
-    // FIXME: what do with "id" property?
-    return dispatchMouseActions(action.actions);
+    const pointerType = pointerSource.parameters.pointerType;
+    if (pointerType !== "mouse" && pointerType !== "touch")
+        return Promise.reject(new Error(`Unknown pointer type "${pointerType}".`));
+
+    // If we have a "none" source, let's inject any pause with non-zero durations into the pointer source
+    // after the matching action in the pointer source.
+    if (noneSource) {
+        let injectedActions = 0;
+        noneSource.actions.forEach((action, index) => {
+            if (action.duration > 0) {
+                pointerSource.actions.splice(index + injectedActions + 1, 0, action);
+                injectedActions++;
+            }
+        });
+    }
+
+    logDebug(() => JSON.stringify(pointerSource));
+
+    if (pointerType === "mouse")
+        return dispatchMouseActions(pointerSource.actions);
+    if (pointerType === "touch")
+        return dispatchTouchActions(pointerSource.actions);
 };