Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(125)

Side by Side Diff: LayoutTests/fast/scroll-behavior/scroll-customization/touch-scroll-customization.html

Issue 1057603002: Expose scroll customization for touch to JS (behind REF). (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix case where documentElement was added to scroll chain twice. Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="utf-8">
5 <title>ScrollState constructor behaves correctly</title>
Rick Byers 2015/04/10 14:51:44 update title
tdresser 2015/05/08 18:23:01 Done.
6 <script src="../../../resources/testharness.js"></script>
7 <script src="../../../resources/testharnessreport.js"></script>
8 <style>
9
10 * {
11 margin:0;
12 padding:0;
13 }
14
15 *::-webkit-scrollbar {
16 width: 0 !important;
17 height: 0 !important;
18 }
19
20 #a {
21 height:400px;
22 width:400px;
23 overflow:scroll;
24 }
25
26 #b {
27 height:500px;
28 width:500px;
29 background-color:purple;
30 }
31
32 #c {
33 height:300px;
34 width:300px;
35 overflow:scroll;
36 }
37
38 #d {
39 height:400px;
40 width:400px;
41 background-color:green;
42 }
43
44 body {
45 height:3000px;
46 }
47
48 </style>
49 </head>
50 <body>
51
52 <div id="a">
53 <div id="b">
54 <div id="c">
55 <div id="d">
56 </div>
57 </div>
58 </div>
59 </div>
60
61 <script>
62
63 if (!window.internals || !window.internals.runtimeFlags.scrollCustomizationEnabl ed || !window.eventSender) {
64 console.log("These tests only work with window.internals and " +
65 "window.eventSender exposed, and require scroll customization.");
Rick Byers 2015/04/10 14:51:44 Do you think we should be making these tests expli
tdresser 2015/05/08 18:23:01 Done.
66 done();
67 }
68
69 var originalApplyScroll = Element.prototype.applyScroll;
70 var originalDistributeScroll = Element.prototype.distributeScroll;
71 var deltas = [-85, -75, -65, -55, -45];
72
73 var elements = [
74 document.getElementById("d"),
75 document.getElementById("c"),
76 document.getElementById("b"),
77 document.getElementById("a"),
78 document.body,
79 document.documentElement];
80
81 document.body.id = "body";
82 document.documentElement.id = "document";
83
84 function reset() {
85 for (var i = 0; i < elements.length; ++i) {
86 elements[i].scrollTop = 0;
87 elements[i].unappliedDeltaY = [];
88 elements[i].distributedDeltaY = [];
89 elements[i].numberOfScrollBegins = 0;
90 elements[i].numberOfScrollEnds = 0;
91 }
92
93 Element.prototype.applyScroll = function(scrollState) {
Rick Byers 2015/04/10 14:51:44 Perhaps you should use the likely more common patt
tdresser 2015/05/08 18:23:02 Now that we're using attributes, setting the metho
tdresser 2015/06/08 15:37:36 I'm not sure how I would use the super keyword whe
94 originalApplyScroll.call(this, scrollState);
95 if (!scrollState.isEnding && !scrollState.isBeginning)
96 this.unappliedDeltaY.push(scrollState.deltaY);
97 }
98
99 Element.prototype.distributeScroll = function(scrollState) {
100 if (scrollState.isBeginning)
101 this.numberOfScrollBegins++;
102 else if (scrollState.isEnding)
103 this.numberOfScrollEnds++;
104 else
105 this.distributedDeltaY.push(scrollState.deltaY);
106 originalDistributeScroll.call(this, scrollState);
107 }
108 }
109
110 function applyDelta(d) {
111 eventSender.gestureScrollBegin(10, 10);
112 eventSender.gestureScrollUpdate(0, d);
113 eventSender.gestureScrollEnd(0, 0);
114 }
115
116 test(function() {
117 reset();
118
119 // Scroll five times, with four scrollable elements.
120 var cScrollTop = [85, 100, 100, 100, 100];
121 var aScrollTop = [0, 0, 65, 100, 100];
122 var bodyScrollTop = [0, 0, 0, 0, 45];
123
124 for (var i = 0; i < deltas.length; ++i) {
125 applyDelta(deltas[i]);
126 assert_equals(a.scrollTop, aScrollTop[i], "For id 'a' on step " + i);
127 assert_equals(c.scrollTop, cScrollTop[i], "For id 'c' on step " + i);
128 assert_equals(document.body.scrollTop, bodyScrollTop[i], "For body on step " + i);
Rick Byers 2015/04/10 14:51:44 nit: use documentElement instead of body. body.sc
tdresser 2015/05/08 18:23:01 Done, though I had to enable ScrollTopLeftInterop
tdresser 2015/05/08 19:38:34 Correction, I just had to switch to using scrollin
129 }
130 }, "Scroll offsets are modified correctly.");
131
132 test(function() {
133 reset();
134
135 // Scroll five times, with six elements.
136 var unapplied = [
137 // d, the innermost element, never applies any scroll.
138 [-85, -75, -65, -55, -45],
139 // c applies the first two scrolls, and then hits its scroll extents.
140 [0, 0, -65, -55, -45],
141 // b doesn't scroll, and so leaves the same deltas unapplied as c.
142 [0, 0, -65, -55, -45],
143 // a hits its scroll extent on the second last step.
144 [0, 0, 0, 0, -45],
145 // body doesn't scroll (it's the documentElement that scrolls, but the body' s
146 // scrollTop updates), and so leaves the same deltas unapplied as a.
147 [0, 0, 0, 0, -45],
148 // The documentElement performs the frame scroll.
149 [0, 0, 0, 0, 0]];
150
151 for (var i = 0; i < deltas.length; ++i)
152 applyDelta(deltas[i]);
153
154 for (var i = 0; i < elements.length; ++i) {
155 var el = elements[i];
156 // Every element sees the same deltas being distributed.
157 assert_array_equals(el.distributedDeltaY, deltas, "distributed delta for " + el.id);
158 assert_array_equals(el.unappliedDeltaY, unapplied[i], "unapplied delta for " + el.id);
159 }
160
161 // Ensure that the document leaves scroll unapplied when appropriate.
162 var documentUnapplied = document.documentElement.unappliedDeltaY;
163 applyDelta(-4000);
164 assert_equals(documentUnapplied[documentUnapplied.length - 1], 0);
165 applyDelta(-4000);
166 assert_equals(documentUnapplied[documentUnapplied.length - 1], -4000);
167 }, "Correct amount of delta is consumed.");
168
169 test(function() {
170 reset();
171
172 // Consume one pixel of delta per call to applyScroll.
173 var applyScroll = Element.prototype.applyScroll;
174 Element.prototype.applyScroll = function(scrollState) {
175 if (scrollState.deltaY !== 0)
176 scrollState.consumeDelta(0, -1);
177 applyScroll.call(this, scrollState);
178 }
179
180 // Scroll five times, with four scrollable elements.
181 // The scroll distance is decreased more the higher up the scroll chain the el ement is.
182 var cScrollTop = [85 - 2, 100, 100, 100, 100];
183 var aScrollTop = [0, 0, 65 - 4, 100, 100];
184 var bodyScrollTop = [0, 0, 0, 0, 45 - 6];
185
186 for (var i = 0; i < deltas.length; ++i) {
187 applyDelta(deltas[i]);
188 assert_equals(c.scrollTop, cScrollTop[i], "For id 'c' on step " + i);
189 assert_equals(a.scrollTop, aScrollTop[i], "For id 'a' on step " + i);
190 assert_equals(document.body.scrollTop, bodyScrollTop[i], "For body on step " + i);
191 }
192 }, "Consuming deltas prevents scrolling.");
193
194 test(function() {
195 reset();
196
197 for (var i = 0; i < deltas.length; ++i)
198 applyDelta(deltas[i]);
199
200 for (var i = 0; i < elements.length; ++i) {
201 assert_equals(elements[i].numberOfScrollEnds, deltas.length);
202 assert_equals(elements[i].numberOfScrollBegins, deltas.length);
203 }
204 }, "Correct number of scroll end and begin events observed.");
205
206 {
207 var flingTest = async_test("Touchscreen fling doesn't propagate.");
208 reset();
209
210 function assertScrollTops(cTop, aTop, bodyTop, step) {
211 assert_equals(c.scrollTop, cTop, "For id 'c' on step " + step);
212 assert_equals(a.scrollTop, aTop, "For id 'a' on step " + step);
213 assert_equals(document.body.scrollTop, bodyTop, "For body on step " + step);
214 };
215
216 var frame_actions = [
217 function() {
218 eventSender.gestureFlingStart(10, 10, -1000000, -1000000, "touchscreen");
219 },
220 flingTest.step_func(function() {
221 assertScrollTops(0, 0, 0, 1);
222 }),
223 flingTest.step_func(function() {
224 assertScrollTops(100, 0, 0, 2);
225 }),
226 flingTest.step_func(function() {
227 assertScrollTops(100, 0, 0, 3);
228 }),
229 flingTest.step_func(function() {
230 assertScrollTops(100, 0, 0, 4);
231 flingTest.done();
232 })
233 ]
234
235 function executeFrameActions(frame_actions) {
236 var frame = 0;
237 function raf() {
238 frame_actions[frame]();
239 frame++;
240 if (frame >= frame_actions.length)
241 return;
242 window.requestAnimationFrame(raf);
243 }
244 window.requestAnimationFrame(raf);
245 }
246
247 executeFrameActions(frame_actions);
248 }
249 </script>
250 </body>
251 </html>
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698