tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

overscroll-deltas.tentative.html (6175B)


      1 <!DOCTYPE HTML>
      2 <script src="/resources/testharness.js"></script>
      3 <script src="/resources/testharnessreport.js"></script>
      4 <script src="/resources/testdriver.js"></script>
      5 <script src="/resources/testdriver-actions.js"></script>
      6 <script src="/resources/testdriver-vendor.js"></script>
      7 <script src="scroll_support.js"></script>
      8 <style>
      9  #hspacer {
     10    height: 100px;
     11    width: 100vw;
     12    top: 0;
     13    /* on the right edge of targetDiv */
     14    left: 200px;
     15    position: absolute;
     16  }
     17 
     18  #vspacer {
     19    height: 100vh;
     20    width: 100px;
     21    position: absolute;
     22  }
     23 
     24  #targetDiv {
     25    width: 200px;
     26    height: 200px;
     27    overflow: scroll;
     28  }
     29 
     30  #innerDiv {
     31    width: 400px;
     32    height: 400px;
     33  }
     34 </style>
     35 
     36 <body style="margin:0" onload=runTest()>
     37  <div id="targetDiv">
     38    <div id="innerDiv"></div>
     39  </div>
     40  <div id="hspacer"></div>
     41  <div id="vspacer"></div>
     42 </body>
     43 
     44 <script>
     45  var target_div = document.getElementById('targetDiv');
     46  var overscrolled_x_deltas = [];
     47  var overscrolled_y_deltas = [];
     48  var scrollend_received = false;
     49 
     50  function onOverscroll(event) {
     51    overscrolled_x_deltas.push(event.deltaX);
     52    overscrolled_y_deltas.push(event.deltaY);
     53  }
     54 
     55  async function resetScrollers(test) {
     56    await waitForScrollReset(test, target_div);
     57    await waitForScrollReset(test, document.scrollingElement);
     58  }
     59 
     60  function resetOverScrollDeltas() {
     61    overscrolled_x_deltas = [];
     62    overscrolled_y_deltas = [];
     63  }
     64 
     65  function waitForOverscrollEventWithMinDelta(target, min_x = 0, min_y = 0) {
     66    return new Promise((resolve) => {
     67      target.addEventListener("overscroll", (evt) => {
     68        if (evt.deltaX >= min_x && evt.deltaY >= min_y) {
     69          resolve();
     70        }
     71      });
     72    });
     73  }
     74 
     75  function unreachedScrollendListener() {
     76    assert_unreached('Unexpected scrollend event');
     77  }
     78 
     79  document.addEventListener("overscroll", onOverscroll);
     80 
     81  function runTest() {
     82    promise_test(async (t) => {
     83      await resetScrollers(t);
     84      await waitForCompositorCommit();
     85      resetOverScrollDeltas();
     86 
     87      assert_equals(document.scrollingElement.scrollTop, 0,
     88        "document should not be scrolled");
     89 
     90      let scrollend_promise = waitForScrollendEvent(t, target_div);
     91      let max_target_div_scroll_top = target_div.scrollHeight - target_div.clientHeight;
     92      target_div.scrollTop = target_div.scrollHeight;
     93      await scrollend_promise;
     94      assert_equals(target_div.scrollTop, max_target_div_scroll_top,
     95      "target_div should be fully scrolled down");
     96 
     97      // Even though we request 300 extra pixels of scroll, the API above doesn't
     98      // guarantee how much scroll delta will be generated - different browsers
     99      // can consume different amounts for "touch slop" (for example). Ensure the
    100      // overscroll reaches at least 250 pixels which is a fairly conservative
    101      // value.
    102      let overscroll_promise = waitForOverscrollEventWithMinDelta(document,
    103          /*min_x*/0, /*min_y*/250);
    104      scrollend_promise = waitForScrollendEvent(t, document, 2000);
    105      target_div.addEventListener("scrollend", unreachedScrollendListener);
    106      // Scroll target div vertically and wait for the doc to get scrollend event.
    107      await scrollElementDown(target_div, target_div.clientHeight + 300);
    108      await waitForCompositorCommit();
    109      await overscroll_promise;
    110      await scrollend_promise;
    111 
    112      target_div.removeEventListener("scrollend", unreachedScrollendListener);
    113      assert_greater_than(overscrolled_y_deltas.length, 0, "There should be at least one overscroll events when overscrolling.");
    114      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.");
    115      assert_less_than_equal(Math.max(...overscrolled_y_deltas), 300, "The deltaY attribute must be <= the number of pixels overscrolled (300)");
    116      assert_greater_than(document.scrollingElement.scrollTop, target_div.clientHeight - 1,
    117        "document is scrolled by the height of target_div");
    118    }, "testing, vertical");
    119 
    120    promise_test(async (t) => {
    121      await resetScrollers(t);
    122      await waitForCompositorCommit();
    123      resetOverScrollDeltas();
    124 
    125      assert_equals(document.scrollingElement.scrollLeft, 0,
    126        "document should not be scrolled");
    127 
    128      let scrollend_promise = waitForScrollendEvent(t, target_div);
    129      let max_target_div_scroll_left = target_div.scrollWidth - target_div.clientWidth;
    130      target_div.scrollLeft = target_div.scrollWidth;
    131      await scrollend_promise;
    132      assert_equals(target_div.scrollLeft, max_target_div_scroll_left,
    133        "target_div should be fully scrolled right");
    134 
    135      let overscroll_promise = waitForOverscrollEventWithMinDelta(document,
    136          /*min_x*/250, /*min_y*/ 0);
    137      scrollend_promise = waitForScrollendEvent(t, document, 2000);
    138      target_div.addEventListener("scrollend", unreachedScrollendListener);
    139      // Scroll target div horizontally and wait for the doc to get scrollend event.
    140      await scrollElementLeft(target_div, target_div.clientWidth + 300);
    141      await waitForCompositorCommit();
    142      await overscroll_promise;
    143      await scrollend_promise;
    144 
    145      target_div.removeEventListener("scrollend", unreachedScrollendListener);
    146      assert_greater_than(document.scrollingElement.scrollLeft, target_div.clientWidth - 1,
    147        "document is scrolled by the height of target_div");
    148      // TODO(bokan): It looks like Chrome inappropriately filters some scroll
    149      // events despite |overscroll-behavior| being set to none. The overscroll
    150      // amount here has been loosened but this should be fixed in Chrome.
    151      // https://crbug.com/1112183.
    152      assert_greater_than(overscrolled_x_deltas.length, 0, "There should be at least one overscroll events when overscrolling.");
    153      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.");
    154      assert_less_than_equal(Math.max(...overscrolled_x_deltas), 300, "The deltaX attribute must be <= number of pixels overscrolled (300)");
    155    }, "testing, horizontal");
    156  }
    157 </script>