summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/feature-policy/experimental-features/vertical-scroll-wheel-block-manual.tentative.html
blob: 398aa1f5afd4a41a998eae290a584f4555006e9c (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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<!doctype html>
<title>vertical-scroll test for 'mousewheel'</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/feature-policy/experimental-features/resources/common.js"></script>
<script src="/feature-policy/experimental-features/resources/vertical-scroll.js"></script>
<style>
html, body {
  height: 100%;
  width: 100%;
}

iframe {
  width: 90%;
  height: 90%;
  margin: 0;
  padding: 0;
}

.spacer {
  width: 100%;
  height: 100%;
  margin: 100%;
}

</style>
<iframe></iframe>
<br/>
<p>Spacers below to make page scrollable</p>
<br/>
<div class="spacer"></div>
<div class="spacer"></div>
<p> EOF </p>
<script>
  "use strict";

  let url = url_base + "vertical-scroll-wheel-block.html";
  function iframeElement() {
    return document.querySelector("iframe");
  }

  // Used as the polling interval when waiting for a specific condition.
  let verify_scroll_offset_delay = 5;
  let no_scroll_timout = 50;

  function waitUntilSatisfied(testInstance, predicate) {
    return new Promise((r) => {
      function testPredicate() {
        if (predicate()) {
          r();
        } else {
          testInstance.step_timeout(testPredicate, verify_scroll_offset_delay);
        }
      }
      testPredicate();
    });
  }

  function resetScroll(testInstance) {
    window.scrollTo({top: 0, left: 0, behavior: "instant"});
    return waitUntilSatisfied(testInstance, () => {
      return window.scrollX === 0 && window.scrollY === 0;
    });
  }

  function waitForMinimumScrollOffset(testInstance, minX, minY) {
    return waitUntilSatisfied(testInstance, () => {
      return window.scrollX >= minX && window.scrollY >= minY;
    });
  }

  function waitFor(testInstance, delay) {
    let checked_once = false;
    return waitUntilSatisfied(testInstance, () => {
      if (checked_once)
        return true;
      checked_once = true;
      return false;
    });
  }

  // Wait for the helper scripts to load.
  promise_test(async() => {
    if (window.input_api_ready)
      return Promise.resolve();
    await new Promise((r) => {
      window.resolve_on_input_api_ready = r;
    });
  }, "Make sure input injection API is ready.");

  // Sanity-check: Test API for scrolling along y-axis works as expected.
  promise_test(async(testInstance) => {
    await resetScroll(testInstance);
    await inject_wheel_scroll("down");
    await waitForMinimumScrollOffset(testInstance, 0, 1);
    assert_greater_than(window.scrollY, 0, "Expected vertical scroll.");
  }, "Sanity-check: the page scrolls vertically in response to vertical wheel.");

  // Sanity-check: Test API for scrolling along x-axis works as expected.
  promise_test(async(testInstance) => {
    await resetScroll(testInstance);
    await inject_wheel_scroll("right");
    await waitForMinimumScrollOffset(testInstance, 1, 0);
    assert_greater_than(window.scrollX, 0, "Expected horizontal scroll.");
  }, "Sanity-check: the page scrolls horizontally in response to horizontal wheel.");

  // Test that when 'vertical-scroll' is enabled, vertical scroll can be
  // blocked by canceling 'wheel' event.
  promise_test(async(testInstance) => {
    setFeatureState(iframeElement(), "vertical-scroll", "*");
    await loadUrlInIframe(iframeElement(), url);

    await resetScroll(testInstance);
    await inject_wheel_scroll("down")
    await waitFor(testInstance, no_scroll_timout);
    assert_equals(window.scrollY, 0, "Did not expected vertical scroll.");
  }, "When 'vertical-scroll' is enabled canceling vertical 'wheel' " +
     "blocks vertical scrolling.");

  // Test that when 'vertical-scroll' is disabled, vertical scroll cannot
  // be blocked by canceling 'wheel' event.
  promise_test(async(testInstance) => {
    setFeatureState(iframeElement(), "vertical-scroll", "'none'");
    await loadUrlInIframe(iframeElement(), url);

    await resetScroll(testInstance);
    await inject_wheel_scroll("down");
    await waitForMinimumScrollOffset(testInstance, 0, 1);
    assert_greater_than(window.scrollY, 0, "Expected vertical scroll.");
  }, "When 'vertical-scroll' is disabled canceling vertical 'wheel' " +
     "does not block vertical scrolling.");

  // Test that when 'vertical-scroll' is disabled, horizontal scroll can be
  // blocked by canceling 'wheel' event.
  promise_test(async(testInstance) => {
    setFeatureState(iframeElement(), "vertical-scroll", "'none'");
    await loadUrlInIframe(iframeElement(), url);

    await resetScroll(testInstance);
    await inject_wheel_scroll("right");
    await waitFor(testInstance, no_scroll_timout);
    assert_equals(window.scrollX, 0, "Did not expect horizontal scroll.");
  }, "When 'vertical-scroll' is disabled canceling horizontal 'wheel' " +
     "blocks horizontal scrolling.");
</script>