summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/dom/events/scrolling/scrollend-event-not-fired-on-no-scroll.html
blob: 870e15546f54d26c9a6e44d35303cd16ee4f96d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<!DOCTYPE HTML>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
<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>
  #spacer {
    height: 100vh;
    width: 100px;
    position: relative;
  }

  #targetDiv {
    width: 200px;
    height: 200px;
    overflow: scroll;
  }

  #innerDiv {
    width: 400px;
    height: 400px;
  }
</style>

<body style="margin:0" onload=runTest()>
  <div id="targetDiv">
    <!-- This test uses button elements as a consistent mechanism for
      ensuring that focus is on the correct scrolling element when
      scrolling via keys -->
    <button id="targetButton">target</button>
    <div id="innerDiv"></div>
  </div>
  <button id="docButton">doc</button>
  <div id="spacer"></div>
</body>

<script>
  var target_div = document.getElementById('targetDiv');

  async function resetScrollers(test) {
    await waitForScrollReset(test, target_div);
    await waitForScrollReset(test, document.scrollingElement);
  }

  function getBoundingClientRect(element) {
    if (element == document) {
      return document.documentElement.getBoundingClientRect();
    }
    return element.getBoundingClientRect();
  }

  async function upwardScroll(scrolling_element, button_element, scroll_type) {
    if (scroll_type == "wheel") {
      let x = 0;
      let y = 0;
      let delta_x = 0;
      let delta_y = -50;
      let actions = new test_driver.Actions()
      .scroll(x, y, delta_x, delta_y, {origin: scrolling_element});
      await actions.send();
    } else if (scroll_type == "keys") {
      const num_keydowns = 5;
      const arrowUp = '\uE013';
      for (let i = 0; i < num_keydowns; i++) {
        await test_driver.send_keys(button_element, arrowUp);
      }
    }
  }

  async function testScrollendNotFiredOnNoScroll(test, scrolling_element,
                                                 listening_element,
                                                 button_element, scroll_type) {
    await resetScrollers(test);
    await waitForCompositorCommit();

    assert_greater_than(scrolling_element.scrollHeight,
                        scrolling_element.clientHeight);
    assert_equals(scrolling_element.scrollTop, 0);

    let scrollend_promise = waitForScrollendEvent(test, listening_element).then(
      (/*resolve*/) => {
        assert_true(false, "no scroll, so no scrollend expected");
      },
      (/*reject*/) => { /* Did not see scrollend, which is okay. */ }
    );
    await upwardScroll(scrolling_element, button_element, scroll_type);
    await scrollend_promise;
  }

  function runTest() {
    promise_test(async (t) => {
      await testScrollendNotFiredOnNoScroll(t, target_div, target_div,
                                            targetButton, "wheel");
    }, "No scroll via wheel on div shouldn't fire scrollend.");

    promise_test(async (t) => {
      await testScrollendNotFiredOnNoScroll(t, target_div, target_div,
                                            targetButton, "keys");
    }, "No scroll via keys on div shouldn't fire scrollend.");

    promise_test(async (t) => {
      await testScrollendNotFiredOnNoScroll(t, document.scrollingElement,
                                            document, docButton, "wheel");
    }, "No scroll via wheel on document shouldn't fire scrollend.");

    promise_test(async (t) => {
      await testScrollendNotFiredOnNoScroll(t, document.scrollingElement,
                                            document, docButton, "keys");
    }, "No scroll via keys on document shouldn't fire scrollend.")
  }
</script>