Accumulate overscroll deltas

Based on the latest proposal accumulate the overscroll deltas
and expose the accumulation to the js.

Bug: 907601
Change-Id: I28b154799bfa003ad2e206e0742c5b5ab0a73b43
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2012807
Reviewed-by: David Bokan <bokan@chromium.org>
Commit-Queue: Navid Zolghadr <nzolghadr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#742195}
diff --git a/dom/events/scrolling/overscroll-deltas.html b/dom/events/scrolling/overscroll-deltas.html
new file mode 100644
index 0000000..287987c3
--- /dev/null
+++ b/dom/events/scrolling/overscroll-deltas.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML>
+<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>
+<script src="scroll_support.js"></script>
+<style>
+#targetDiv {
+  width: 500px;
+  height: 500px;
+  background: red;
+}
+
+</style>
+
+<body style="margin:0;" onload=runTest()>
+<div id="targetDiv">
+</div>
+</body>
+
+<script>
+var target_div = document.getElementById('targetDiv');
+var overscrolled_x_deltas = [];
+var overscrolled_y_deltas = [];
+var scrollend_received = false;
+
+function onOverscroll(event) {
+  overscrolled_x_deltas.push(event.deltaX);
+  overscrolled_y_deltas.push(event.deltaY);
+}
+
+function onScrollend(event) {
+  scrollend_received = true;
+}
+
+document.addEventListener("overscroll", onOverscroll);
+document.addEventListener("scrollend", onScrollend);
+
+function runTest() {
+  promise_test (async (t) => {
+    await waitForCompositorCommit();
+
+    // Scroll up on target div and wait for the doc to get overscroll event.
+    await touchScrollInTarget(300, target_div, 'up');
+    await waitFor(() => { return scrollend_received; },
+        'Document did not receive scrollend event.');
+
+    assert_greater_than(overscrolled_y_deltas.length, 0, "There should be at least one overscroll events when overscrolling.");
+    assert_equals(Math.max(...overscrolled_x_deltas), 0, "The deltaX attribute must be 0 when there is no scrolling in x direction.");
+    assert_less_than_equal(Math.max(...overscrolled_y_deltas), 0, "The deltaY attribute must be <= 0 when there is overscrolling in up direction.");
+    assert_less_than_equal(Math.min(...overscrolled_y_deltas),-100, "The deltaY attribute must be the number of pixels overscrolled.");
+
+    await waitForCompositorCommit();
+    overscrolled_x_deltas = [];
+    overscrolled_y_deltas = [];
+    scrollend_received = false;
+
+    // Scroll left on target div and wait for the doc to get overscroll event.
+    await touchScrollInTarget(300, target_div, 'left');
+    await waitFor(() => { return scrollend_received; },
+        'Document did not receive scrollend event.');
+
+    assert_greater_than(overscrolled_y_deltas.length, 0, "There should be at least one overscroll events when overscrolling.");
+    assert_equals(Math.max(...overscrolled_y_deltas), 0, "The deltaY attribute must be 0 when there is no scrolling in y direction.");
+    assert_less_than_equal(Math.max(...overscrolled_x_deltas), 0, "The deltaX attribute must be <= 0 when there is overscrolling in left direction.");
+    assert_less_than_equal(Math.min(...overscrolled_x_deltas),-100, "The deltaX attribute must be the number of pixels overscrolled.");
+
+  }, 'Tests that the document gets overscroll event with right deltaX/Y attributes.');
+}
+</script>