Add pause to wait for scroll stop in WPT pointerevent touch test

In order to run the web-platform-tests automatically, we will use
testdriver Action API in all the wpt to simulate inputs. Here we are
changing some pointerevent touch input tests which are doing scrolling.

We are using "pause" action in the action sequence to  wait for the
scroll to stop to avoid fling and the memory leak.

Bug: 606367
Change-Id: Ic55144000c710789639e0996a3a3fab5ce3bdd42
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1503899
Commit-Queue: Lan Wei <lanwei@chromium.org>
Reviewed-by: Navid Zolghadr <nzolghadr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#641698}
diff --git a/pointerevents/pointerevent_pointercancel_touch-manual.html b/pointerevents/pointerevent_pointercancel_touch.html
similarity index 86%
rename from pointerevents/pointerevent_pointercancel_touch-manual.html
rename to pointerevents/pointerevent_pointercancel_touch.html
index 70a65ee..a645033 100644
--- a/pointerevents/pointerevent_pointercancel_touch-manual.html
+++ b/pointerevents/pointerevent_pointercancel_touch.html
@@ -5,6 +5,9 @@
         <meta name="viewport" content="width=device-width">
         <script src="/resources/testharness.js"></script>
         <script src="/resources/testharnessreport.js"></script>
+        <script src="/resources/testdriver.js"></script>
+        <script src="/resources/testdriver-actions.js"></script>
+        <script src="/resources/testdriver-vendor.js"></script>
         <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
         <!-- Additional helper script for common checks across event types -->
         <script type="text/javascript" src="pointerevent_support.js"></script>
@@ -28,6 +31,7 @@
 
             var pointerdown_event = null;
             var pointercancel_event = null;
+            var received_pointerleave = false;
 
             function run() {
                 var target0 = document.getElementById("target0");
@@ -64,6 +68,14 @@
                         assert_equals(event.pointerType, pointerdown_event.pointerType, "pointerType should be the same for pointerleave and pointercancel");
                         assert_equals(event.isPrimary, pointerdown_event.isPrimary, "isPrimary should be the same for pointerleave and pointercancel");
                     });
+                    received_pointerleave = true;
+                });
+
+                // Inject touch inputs and wait for all the actions finish to end the test.
+                touchScrollInTarget(target0, 'down').then(function() {
+                    test_pointerEvent.step(function () {
+                        assert_true(received_pointerleave, "pointerleave should be received before the test finished");
+                    });
                     test_pointerEvent.done();
                 });
             }
diff --git a/pointerevents/pointerevent_support.js b/pointerevents/pointerevent_support.js
index 5c35e01..e8c847b 100644
--- a/pointerevents/pointerevent_support.js
+++ b/pointerevents/pointerevent_support.js
@@ -252,3 +252,36 @@
 function checkPointerEventType(event) {
     assert_equals(event.pointerType, expectedPointerType, "pointerType should be the same as the requested device.");
 }
+
+function touchScrollInTarget(target, direction) {
+    var x_delta = 0;
+    var y_delta = 0;
+    if (direction == "down") {
+        x_delta = 0;
+        y_delta = -10;
+    } else if (direction == "up") {
+        x_delta = 0;
+        y_delta = 10;
+    } else if (direction == "right") {
+        x_delta = -10;
+        y_delta = 0;
+    } else if (direction == "left") {
+        x_delta = 10;
+        y_delta = 0;
+    } else {
+        throw("scroll direction '" + direction + "' is not expected, direction should be 'down', 'up', 'left' or 'right'");
+    }
+    return new test_driver.Actions()
+                   .addPointer("pointer1", "touch")
+                   .pointerMove(0, 0, {origin: target})
+                   .pointerDown()
+                   .pointerMove(x_delta, y_delta, {origin: target})
+                   .pointerMove(2 * x_delta, 2 * y_delta, {origin: target})
+                   .pointerMove(3 * x_delta, 3 * y_delta, {origin: target})
+                   .pointerMove(4 * x_delta, 4 * y_delta, {origin: target})
+                   .pointerMove(5 * x_delta, 5 * y_delta, {origin: target})
+                   .pointerMove(6 * x_delta, 6 * y_delta, {origin: target})
+                   .pause(100)
+                   .pointerUp()
+                   .send();
+}