Deflake overscroll-delta test

This test is flaking with failures because the max overscroll delta seen
is less than the (arbitrarily chosen) expected value.
This could be because we  only wait for the first overscroll event seen
(overscroll events report a running total of the delta) before
continuing with the test.
Instead we can ensure that we wait for an overscroll event with a
sufficiently large accumulated overscroll delta.

Bug: 1430215
Change-Id: Iacf5b59018aecab966a6d48a00e0cba984cfe2a5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4892667
Reviewed-by: Kevin Ellis <kevers@chromium.org>
Commit-Queue: David Awogbemila <awogbemila@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1201565}
diff --git a/dom/events/scrolling/overscroll-deltas.html b/dom/events/scrolling/overscroll-deltas.html
index 6574a56..e13e9f1 100644
--- a/dom/events/scrolling/overscroll-deltas.html
+++ b/dom/events/scrolling/overscroll-deltas.html
@@ -62,8 +62,18 @@
     overscrolled_y_deltas = [];
   }
 
-  function fail() {
-    assert_true(false);
+  function waitForOverscrollEventWithMinDelta(target, min_x = 0, min_y = 0) {
+    return new Promise((resolve) => {
+      target.addEventListener("overscroll", (evt) => {
+        if (evt.deltaX >= min_x && evt.deltaY >= min_y) {
+          resolve();
+        }
+      });
+    });
+  }
+
+  function unreachedScrollendListener() {
+    assert_unreached('Unexpected scrollend event');
   }
 
   document.addEventListener("overscroll", onOverscroll);
@@ -84,25 +94,25 @@
       assert_equals(target_div.scrollTop, max_target_div_scroll_top,
       "target_div should be fully scrolled down");
 
-      let overscroll_promise = waitForOverscrollEvent(t, document, 2000);
+      // Even though we request 300 extra pixels of scroll, the API above doesn't
+      // guarantee how much scroll delta will be generated - different browsers
+      // can consume different amounts for "touch slop" (for example). Ensure the
+      // overscroll reaches at least 250 pixels which is a fairly conservative
+      // value.
+      let overscroll_promise = waitForOverscrollEventWithMinDelta(document,
+          /*min_x*/0, /*min_y*/250);
       scrollend_promise = waitForScrollendEvent(t, document, 2000);
-      target_div.addEventListener("scrollend", fail);
+      target_div.addEventListener("scrollend", unreachedScrollendListener);
       // Scroll target div vertically and wait for the doc to get scrollend event.
       await scrollElementDown(target_div, target_div.clientHeight + 300);
       await waitForCompositorCommit();
       await overscroll_promise;
       await scrollend_promise;
 
-      target_div.removeEventListener("scrollend", fail);
-      // Even though we request 300 extra pixels of scroll, the API above doesn't
-      // guarantee how much scroll delta will be generated - different browsers
-      // can consume different amounts for "touch slop" (for example). Ensure the
-      // overscroll reaches at least 250 pixels which is a fairly conservative
-      // value.
+      target_div.removeEventListener("scrollend", unreachedScrollendListener);
       assert_greater_than(overscrolled_y_deltas.length, 0, "There should be at least one overscroll events when overscrolling.");
       assert_equals(overscrolled_x_deltas.filter(function (x) { return x != 0; }).length, 0, "The deltaX attribute must be 0 when there is no scrolling in x direction.");
       assert_less_than_equal(Math.max(...overscrolled_y_deltas), 300, "The deltaY attribute must be <= the number of pixels overscrolled (300)");
-      assert_greater_than_equal(Math.max(...overscrolled_y_deltas), 250, "The deltaY attribute should be reasonably close to number of pixels overscrolled (300)");
       assert_greater_than(document.scrollingElement.scrollTop, target_div.clientHeight - 1,
         "document is scrolled by the height of target_div");
     }, "testing, vertical");
@@ -122,16 +132,17 @@
       assert_equals(target_div.scrollLeft, max_target_div_scroll_left,
         "target_div should be fully scrolled right");
 
-      let overscroll_promise = waitForOverscrollEvent(t, document, 2000);
+      let overscroll_promise = waitForOverscrollEventWithMinDelta(document,
+          /*min_x*/250, /*min_y*/ 0);
       scrollend_promise = waitForScrollendEvent(t, document, 2000);
-      target_div.addEventListener("scrollend", fail);
+      target_div.addEventListener("scrollend", unreachedScrollendListener);
       // Scroll target div horizontally and wait for the doc to get scrollend event.
       await scrollElementLeft(target_div, target_div.clientWidth + 300);
       await waitForCompositorCommit();
       await overscroll_promise;
       await scrollend_promise;
 
-      target_div.removeEventListener("scrollend", fail);
+      target_div.removeEventListener("scrollend", unreachedScrollendListener);
       assert_greater_than(document.scrollingElement.scrollLeft, target_div.clientWidth - 1,
         "document is scrolled by the height of target_div");
       // TODO(bokan): It looks like Chrome inappropriately filters some scroll
@@ -141,7 +152,6 @@
       assert_greater_than(overscrolled_x_deltas.length, 0, "There should be at least one overscroll events when overscrolling.");
       assert_equals(overscrolled_y_deltas.filter(function(x){ return x!=0; }).length, 0, "The deltaY attribute must be 0 when there is no scrolling in y direction.");
       assert_less_than_equal(Math.max(...overscrolled_x_deltas), 300, "The deltaX attribute must be <= number of pixels overscrolled (300)");
-      assert_greater_than_equal(Math.max(...overscrolled_x_deltas), 250, "The deltaX attribute should be reasonably close to the number of pixels overscrolled (300)");
     }, "testing, horizontal");
   }
 </script>
diff --git a/dom/events/scrolling/scroll_support.js b/dom/events/scrolling/scroll_support.js
index e8792cc..f05251c 100644
--- a/dom/events/scrolling/scroll_support.js
+++ b/dom/events/scrolling/scroll_support.js
@@ -20,10 +20,6 @@
   });
 }
 
-async function waitForOverscrollEvent(test, target, timeoutMs = 500) {
-  return waitForEvent("overscroll", test, target, timeoutMs);
-}
-
 async function waitForPointercancelEvent(test, target, timeoutMs = 500) {
   return waitForEvent("pointercancel", test, target, timeoutMs);
 }