dom/events/test/window_wheel_default_action.html

branch
TOR_BUG_9701
changeset 15
b8a032363ba2
equal deleted inserted replaced
-1:000000000000 0:575cd247171c
1 <!DOCTYPE HTML>
2 <html>
3 <head>
4 <title>Test for default action of WheelEvent</title>
5 <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
6 <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
7 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
8 </head>
9 <body>
10 <p id="display"></p>
11 <div id="scrollable" style="overflow: auto; width: 200px; height: 200px;">
12 <div id="clipper" style="margin: 0; padding: 0; overflow: hidden; width: 3000px; height: 3000px;">
13 <div id="scrolled" style="width: 5000px; height: 5000px;">
14 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
15 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
16 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
17 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
18 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
19 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
20 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
21 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
22 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
23 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
24 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
25 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
26 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
27 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
28 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
29 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
30 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
31 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
32 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
33 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
34 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
35 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
36 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
37 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
38 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
39 Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text. Tere is a lot of text.<br>
40 </div>
41 </div>
42 </div>
43 <div id="spacerForBody"></div>
44 <div id="content" style="display: none">
45
46 </div>
47 <pre id="test">
48 <script type="application/javascript">
49
50 SimpleTest.waitForFocus(runTests, window);
51
52 var winUtils = SpecialPowers.getDOMWindowUtils(window);
53 // grab refresh driver
54 winUtils.advanceTimeAndRefresh(100);
55
56 var gScrollableElement = document.getElementById("scrollable");
57 var gScrolledElement = document.getElementById("scrolled");
58 var gSpacerForBodyElement = document.getElementById("spacerForBody");
59
60 function is()
61 {
62 window.opener.is.apply(window.opener, arguments);
63 }
64
65 function ok()
66 {
67 window.opener.ok.apply(window.opener, arguments);
68 }
69
70 function hitEventLoop(aFunc, aTimes)
71 {
72 winUtils.advanceTimeAndRefresh(100);
73
74 if (--aTimes) {
75 setTimeout(hitEventLoop, 0, aFunc, aTimes);
76 } else {
77 setTimeout(aFunc, 20);
78 }
79 }
80
81 function onZoomReset(aCallback) {
82 var topic = "browser-fullZoom:zoomReset";
83 SpecialPowers.addObserver(function observe() {
84 SpecialPowers.removeObserver(observe, topic);
85 SimpleTest.executeSoon(aCallback);
86 }, topic, false);
87 }
88
89 function setDeltaMultiplierSettings(aSettings)
90 {
91 SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_x", aSettings.deltaMultiplierX * 100);
92 SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_y", aSettings.deltaMultiplierY * 100);
93 SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_z", aSettings.deltaMultiplierZ * 100);
94 SpecialPowers.setIntPref("mousewheel.with_alt.delta_multiplier_x", aSettings.deltaMultiplierX * 100);
95 SpecialPowers.setIntPref("mousewheel.with_alt.delta_multiplier_y", aSettings.deltaMultiplierY * 100);
96 SpecialPowers.setIntPref("mousewheel.with_alt.delta_multiplier_z", aSettings.deltaMultiplierZ * 100);
97 SpecialPowers.setIntPref("mousewheel.with_control.delta_multiplier_x", aSettings.deltaMultiplierX * 100);
98 SpecialPowers.setIntPref("mousewheel.with_control.delta_multiplier_y", aSettings.deltaMultiplierY * 100);
99 SpecialPowers.setIntPref("mousewheel.with_control.delta_multiplier_z", aSettings.deltaMultiplierZ * 100);
100 SpecialPowers.setIntPref("mousewheel.with_meta.delta_multiplier_x", aSettings.deltaMultiplierX * 100);
101 SpecialPowers.setIntPref("mousewheel.with_meta.delta_multiplier_y", aSettings.deltaMultiplierY * 100);
102 SpecialPowers.setIntPref("mousewheel.with_meta.delta_multiplier_z", aSettings.deltaMultiplierZ * 100);
103 SpecialPowers.setIntPref("mousewheel.with_shift.delta_multiplier_x", aSettings.deltaMultiplierX * 100);
104 SpecialPowers.setIntPref("mousewheel.with_shift.delta_multiplier_y", aSettings.deltaMultiplierY * 100);
105 SpecialPowers.setIntPref("mousewheel.with_shift.delta_multiplier_z", aSettings.deltaMultiplierZ * 100);
106 SpecialPowers.setIntPref("mousewheel.with_win.delta_multiplier_x", aSettings.deltaMultiplierX * 100);
107 SpecialPowers.setIntPref("mousewheel.with_win.delta_multiplier_y", aSettings.deltaMultiplierY * 100);
108 SpecialPowers.setIntPref("mousewheel.with_win.delta_multiplier_z", aSettings.deltaMultiplierZ * 100);
109 }
110
111 function doTestScroll(aSettings, aCallback)
112 {
113 const kNoScroll = 0x00;
114 const kScrollUp = 0x01;
115 const kScrollDown = 0x02;
116 const kScrollLeft = 0x04;
117 const kScrollRight = 0x08;
118
119 const kTests = [
120 { description: "Scroll to bottom by pixel scroll even if lineOrPageDelta is 0",
121 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
122 deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
123 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
124 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
125 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
126 expected: kScrollDown },
127 { description: "Scroll to bottom by pixel scroll when lineOrPageDelta is 1",
128 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
129 deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
130 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: false,
131 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
132 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
133 expected: kScrollDown },
134 { description: "Scroll to top by pixel scroll even if lineOrPageDelta is 0",
135 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
136 deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
137 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
138 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
139 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
140 expected: kScrollUp },
141 { description: "Scroll to top by pixel scroll when lineOrPageDelta is -1",
142 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
143 deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
144 lineOrPageDeltaX: 0, lineOrPageDeltaY: -1, isMomentum: false,
145 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
146 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
147 expected: kScrollUp },
148 { description: "Scroll to right by pixel scroll even if lineOrPageDelta is 0",
149 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
150 deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
151 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
152 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
153 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
154 expected: kScrollRight },
155 { description: "Scroll to right by pixel scroll when lineOrPageDelta is 1",
156 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
157 deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
158 lineOrPageDeltaX: 1, lineOrPageDeltaY: 0, isMomentum: false,
159 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
160 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
161 expected: kScrollRight },
162 { description: "Scroll to left by pixel scroll even if lineOrPageDelta is 0",
163 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
164 deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
165 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
166 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
167 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
168 expected: kScrollLeft },
169 { description: "Scroll to left by pixel scroll when lineOrPageDelta is -1",
170 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
171 deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
172 lineOrPageDeltaX: -1, lineOrPageDeltaY: 0, isMomentum: false,
173 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
174 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
175 expected: kScrollLeft },
176 { description: "Scroll to bottom-right by pixel scroll",
177 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
178 deltaX: 8.0, deltaY: 8.0, deltaZ: 0.0,
179 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
180 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
181 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
182 expected: kScrollDown | kScrollRight },
183 { description: "Scroll to bottom-left by pixel scroll",
184 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
185 deltaX: -8.0, deltaY: 8.0, deltaZ: 0.0,
186 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
187 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
188 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
189 expected: kScrollDown | kScrollLeft },
190 { description: "Scroll to top-left by pixel scroll",
191 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
192 deltaX: -8.0, deltaY: -8.0, deltaZ: 0.0,
193 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
194 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
195 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
196 expected: kScrollUp | kScrollLeft },
197 { description: "Scroll to top-right by pixel scroll",
198 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
199 deltaX: 8.0, deltaY: -8.0, deltaZ: 0.0,
200 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
201 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
202 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
203 expected: kScrollUp | kScrollRight },
204 { description: "Not Scroll by pixel scroll for z",
205 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
206 deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
207 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
208 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
209 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
210 expected: kNoScroll },
211
212 { description: "Scroll to bottom by line scroll even if lineOrPageDelta is 0",
213 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
214 deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
215 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: false,
216 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
217 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
218 expected: kScrollDown },
219 { description: "Scroll to bottom by line scroll when lineOrPageDelta is 1",
220 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
221 deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
222 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: false,
223 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
224 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
225 expected: kScrollDown },
226 { description: "Scroll to top by line scroll even if lineOrPageDelta is 0",
227 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
228 deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
229 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
230 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
231 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
232 expected: kScrollUp },
233 { description: "Scroll to top by line scroll when lineOrPageDelta is -1",
234 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
235 deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
236 lineOrPageDeltaX: 0, lineOrPageDeltaY: -1, isMomentum: false,
237 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
238 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
239 expected: kScrollUp },
240 { description: "Scroll to right by line scroll even if lineOrPageDelta is 0",
241 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
242 deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
243 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
244 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
245 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
246 expected: kScrollRight },
247 { description: "Scroll to right by line scroll when lineOrPageDelta is 1",
248 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
249 deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
250 lineOrPageDeltaX: 1, lineOrPageDeltaY: 0, isMomentum: false,
251 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
252 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
253 expected: kScrollRight },
254 { description: "Scroll to left by line scroll even if lineOrPageDelta is 0",
255 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
256 deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
257 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
258 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
259 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
260 expected: kScrollLeft },
261 { description: "Scroll to left by line scroll when lineOrPageDelta is -1",
262 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
263 deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
264 lineOrPageDeltaX: -1, lineOrPageDeltaY: 0, isMomentum: false,
265 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
266 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
267 expected: kScrollLeft },
268 { description: "Scroll to bottom-right by line scroll",
269 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
270 deltaX: 0.5, deltaY: 0.5, deltaZ: 0.0,
271 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
272 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
273 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
274 expected: kScrollDown | kScrollRight },
275 { description: "Scroll to bottom-left by line scroll",
276 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
277 deltaX: -0.5, deltaY: 0.5, deltaZ: 0.0,
278 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
279 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
280 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
281 expected: kScrollDown | kScrollLeft },
282 { description: "Scroll to top-left by line scroll",
283 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
284 deltaX: -0.5, deltaY: -0.5, deltaZ: 0.0,
285 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
286 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
287 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
288 expected: kScrollUp | kScrollLeft },
289 { description: "Scroll to top-right by line scroll",
290 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
291 deltaX: 0.5, deltaY: -0.5, deltaZ: 0.0,
292 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
293 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
294 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
295 expected: kScrollUp | kScrollRight },
296 { description: "Not Scroll by line scroll for z",
297 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
298 deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
299 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
300 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
301 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
302 expected: kNoScroll },
303
304 { description: "Scroll to bottom by page scroll even if lineOrPageDelta is 0",
305 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
306 deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
307 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: false,
308 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
309 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
310 expected: kScrollDown },
311 { description: "Scroll to bottom by page scroll when lineOrPageDelta is 1",
312 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
313 deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
314 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: false,
315 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
316 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
317 expected: kScrollDown },
318 { description: "Scroll to top by page scroll even if lineOrPageDelta is 0",
319 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
320 deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
321 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
322 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
323 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
324 expected: kScrollUp },
325 { description: "Scroll to top by page scroll when lineOrPageDelta is -1",
326 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
327 deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
328 lineOrPageDeltaX: 0, lineOrPageDeltaY: -1, isMomentum: false,
329 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
330 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
331 expected: kScrollUp },
332 { description: "Scroll to right by page scroll even if lineOrPageDelta is 0",
333 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
334 deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
335 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
336 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
337 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
338 expected: kScrollRight },
339 { description: "Scroll to right by page scroll when lineOrPageDelta is 1",
340 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
341 deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
342 lineOrPageDeltaX: 1, lineOrPageDeltaY: 0, isMomentum: false,
343 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
344 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
345 expected: kScrollRight },
346 { description: "Scroll to left by page scroll even if lineOrPageDelta is 0",
347 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
348 deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
349 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
350 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
351 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
352 expected: kScrollLeft },
353 { description: "Scroll to left by page scroll when lineOrPageDelta is -1",
354 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
355 deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
356 lineOrPageDeltaX: -1, lineOrPageDeltaY: 0, isMomentum: false,
357 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
358 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
359 expected: kScrollLeft },
360 { description: "Scroll to bottom-right by page scroll",
361 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
362 deltaX: 0.5, deltaY: 0.5, deltaZ: 0.0,
363 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
364 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
365 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
366 expected: kScrollDown | kScrollRight },
367 { description: "Scroll to bottom-left by page scroll",
368 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
369 deltaX: -0.5, deltaY: 0.5, deltaZ: 0.0,
370 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
371 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
372 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
373 expected: kScrollDown | kScrollLeft },
374 { description: "Scroll to top-left by page scroll",
375 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
376 deltaX: -0.5, deltaY: -0.5, deltaZ: 0.0,
377 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
378 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
379 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
380 expected: kScrollUp | kScrollLeft },
381 { description: "Scroll to top-right by page scroll",
382 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
383 deltaX: 0.5, deltaY: -0.5, deltaZ: 0.0,
384 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
385 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
386 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
387 expected: kScrollUp | kScrollRight },
388 { description: "Not Scroll by page scroll for z",
389 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
390 deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
391 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
392 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
393 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
394 expected: kNoScroll },
395
396 // special cases.
397
398 // momentum scroll should cause scroll even if the action is zoom, but if the default action is none,
399 // shouldn't do it.
400 { description: "Scroll to bottom by momentum pixel scroll when lineOrPageDelta is 0, even if the action is zoom",
401 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
402 deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
403 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
404 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
405 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
406 expected: kScrollDown },
407 { description: "Scroll to bottom by momentum pixel scroll when lineOrPageDelta is 1, even if the action is zoom",
408 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
409 deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
410 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: true,
411 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
412 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
413 expected: kScrollDown },
414 { description: "Scroll to top by momentum pixel scroll when lineOrPageDelta is 0, even if the action is zoom",
415 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
416 deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
417 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
418 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
419 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
420 expected: kScrollUp },
421 { description: "Scroll to top by momentum pixel scroll when lineOrPageDelta is -1, even if the action is zoom",
422 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
423 deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
424 lineOrPageDeltaX: 0, lineOrPageDeltaY: -1, isMomentum: true,
425 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
426 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
427 expected: kScrollUp },
428 { description: "Scroll to right by momentum pixel scroll when lineOrPageDelta is 0, even if the action is zoom",
429 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
430 deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
431 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
432 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
433 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
434 expected: kScrollRight },
435 { description: "Scroll to right by momentum pixel scroll when lineOrPageDelta is 1, even if the action is zoom",
436 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
437 deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
438 lineOrPageDeltaX: 1, lineOrPageDeltaY: 0, isMomentum: true,
439 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
440 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
441 expected: kScrollRight },
442 { description: "Scroll to left by momentum pixel scroll when lineOrPageDelta is 0, even if the action is zoom",
443 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
444 deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
445 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
446 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
447 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
448 expected: kScrollLeft },
449 { description: "Scroll to left by momentum pixel scroll when lineOrPageDelta is -1, even if the action is zoom",
450 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
451 deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
452 lineOrPageDeltaX: -1, lineOrPageDeltaY: 0, isMomentum: true,
453 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
454 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
455 expected: kScrollLeft },
456 { description: "Scroll to bottom-right by momentum pixel scroll even if the action is zoom",
457 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
458 deltaX: 8.0, deltaY: 8.0, deltaZ: 0.0,
459 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
460 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
461 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
462 expected: kScrollDown | kScrollRight },
463 { description: "Scroll to bottom-left by momentum pixel scroll even if the action is zoom",
464 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
465 deltaX: -8.0, deltaY: 8.0, deltaZ: 0.0,
466 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
467 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
468 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
469 expected: kScrollDown | kScrollLeft },
470 { description: "Scroll to top-left by momentum pixel scroll even if the action is zoom",
471 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
472 deltaX: -8.0, deltaY: -8.0, deltaZ: 0.0,
473 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
474 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
475 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
476 expected: kScrollUp | kScrollLeft },
477 { description: "Scroll to top-right by momentum pixel scroll even if the action is zoom",
478 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
479 deltaX: 8.0, deltaY: -8.0, deltaZ: 0.0,
480 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
481 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
482 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
483 expected: kScrollUp | kScrollRight },
484 { description: "Not Scroll by momentum pixel scroll for z (action is zoom)",
485 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
486 deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
487 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
488 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
489 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
490 expected: kNoScroll },
491 { description: "Not Scroll by momentum pixel scroll if default action is none (action is zoom)",
492 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
493 deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
494 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
495 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
496 shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
497 expected: kNoScroll,
498 prepare: function () { SpecialPowers.setIntPref("mousewheel.default.action", 0); },
499 cleanup: function () { SpecialPowers.setIntPref("mousewheel.default.action", 1); } },
500
501 // momentum scroll should cause scroll even if the action is history, but if the default action is none,
502 // shouldn't do it.
503 { description: "Scroll to bottom by momentum pixel scroll when lineOrPageDelta is 0, even if the action is history",
504 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
505 deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
506 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
507 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
508 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
509 expected: kScrollDown },
510 { description: "Scroll to bottom by momentum pixel scroll when lineOrPageDelta is 1, even if the action is history",
511 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
512 deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
513 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: true,
514 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
515 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
516 expected: kScrollDown },
517 { description: "Scroll to top by momentum pixel scroll when lineOrPageDelta is 0, even if the action is history",
518 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
519 deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
520 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
521 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
522 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
523 expected: kScrollUp },
524 { description: "Scroll to top by momentum pixel scroll when lineOrPageDelta is -1, even if the action is history",
525 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
526 deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
527 lineOrPageDeltaX: 0, lineOrPageDeltaY: -1, isMomentum: true,
528 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
529 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
530 expected: kScrollUp },
531 { description: "Scroll to right by momentum pixel scroll when lineOrPageDelta is 0, even if the action is history",
532 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
533 deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
534 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
535 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
536 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
537 expected: kScrollRight },
538 { description: "Scroll to right by momentum pixel scroll when lineOrPageDelta is 1, even if the action is history",
539 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
540 deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
541 lineOrPageDeltaX: 1, lineOrPageDeltaY: 0, isMomentum: true,
542 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
543 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
544 expected: kScrollRight },
545 { description: "Scroll to left by momentum pixel scroll when lineOrPageDelta is 0, even if the action is history",
546 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
547 deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
548 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
549 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
550 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
551 expected: kScrollLeft },
552 { description: "Scroll to left by momentum pixel scroll when lineOrPageDelta is -1, even if the action is history",
553 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
554 deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
555 lineOrPageDeltaX: -1, lineOrPageDeltaY: 0, isMomentum: true,
556 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
557 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
558 expected: kScrollLeft },
559 { description: "Scroll to bottom-right by momentum pixel scroll even if the action is history",
560 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
561 deltaX: 8.0, deltaY: 8.0, deltaZ: 0.0,
562 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
563 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
564 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
565 expected: kScrollDown | kScrollRight },
566 { description: "Scroll to bottom-left by momentum pixel scroll even if the action is history",
567 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
568 deltaX: -8.0, deltaY: 8.0, deltaZ: 0.0,
569 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
570 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
571 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
572 expected: kScrollDown | kScrollLeft },
573 { description: "Scroll to top-left by momentum pixel scroll even if the action is history",
574 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
575 deltaX: -8.0, deltaY: -8.0, deltaZ: 0.0,
576 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
577 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
578 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
579 expected: kScrollUp | kScrollLeft },
580 { description: "Scroll to top-right by momentum pixel scroll even if the action is history",
581 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
582 deltaX: 8.0, deltaY: -8.0, deltaZ: 0.0,
583 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
584 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
585 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
586 expected: kScrollUp | kScrollRight },
587 { description: "Not Scroll by momentum pixel scroll for z (action is history)",
588 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
589 deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
590 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
591 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
592 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
593 expected: kNoScroll },
594 { description: "Not Scroll by momentum pixel scroll if default action is none (action is history)",
595 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
596 deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
597 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
598 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
599 shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
600 expected: kNoScroll,
601 prepare: function () { SpecialPowers.setIntPref("mousewheel.default.action", 0); },
602 cleanup: function () { SpecialPowers.setIntPref("mousewheel.default.action", 1); } },
603
604 // Don't scroll along axis whose overflow style is hidden.
605 { description: "Scroll to only bottom by oblique pixel wheel event with overflow-x: hidden",
606 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
607 deltaX: 16.0, deltaY: 16.0, deltaZ: 0.0,
608 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
609 expectedOverflowDeltaX: 1, expectedOverflowDeltaY: 0,
610 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
611 expected: kScrollDown,
612 prepare: function() { gScrollableElement.style.overflowX = "hidden"; } },
613 { description: "Scroll to only bottom by oblique line wheel event with overflow-x: hidden",
614 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
615 deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
616 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
617 expectedOverflowDeltaX: 1, expectedOverflowDeltaY: 0,
618 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
619 expected: kScrollDown },
620 { description: "Scroll to only bottom by oblique page wheel event with overflow-x: hidden",
621 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
622 deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
623 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
624 expectedOverflowDeltaX: 1, expectedOverflowDeltaY: 0,
625 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
626 expected: kScrollDown },
627 { description: "Scroll to only top by oblique pixel wheel event with overflow-x: hidden",
628 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
629 deltaX: -16.0, deltaY: -16.0, deltaZ: 0.0,
630 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
631 expectedOverflowDeltaX: -1, expectedOverflowDeltaY: 0,
632 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
633 expected: kScrollUp },
634 { description: "Scroll to only top by oblique line wheel event with overflow-x: hidden",
635 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
636 deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
637 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
638 expectedOverflowDeltaX: -1, expectedOverflowDeltaY: 0,
639 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
640 expected: kScrollUp },
641 { description: "Scroll to only top by oblique page wheel event with overflow-x: hidden",
642 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
643 deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
644 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
645 expectedOverflowDeltaX: -1, expectedOverflowDeltaY: 0,
646 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
647 expected: kScrollUp,
648 cleanup: function () { gScrollableElement.style.overflowX = "auto"; } },
649 { description: "Scroll to only right by oblique pixel wheel event with overflow-y: hidden",
650 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
651 deltaX: 16.0, deltaY: 16.0, deltaZ: 0.0,
652 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
653 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 1,
654 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
655 expected: kScrollRight,
656 prepare: function() { gScrollableElement.style.overflowY = "hidden"; } },
657 { description: "Scroll to only right by oblique line wheel event with overflow-y: hidden",
658 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
659 deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
660 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
661 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 1,
662 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
663 expected: kScrollRight },
664 { description: "Scroll to only right by oblique page wheel event with overflow-y: hidden",
665 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
666 deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
667 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
668 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 1,
669 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
670 expected: kScrollRight },
671 { description: "Scroll to only left by oblique pixel wheel event with overflow-y: hidden",
672 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
673 deltaX: -16.0, deltaY: -16.0, deltaZ: 0.0,
674 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
675 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: -1,
676 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
677 expected: kScrollLeft },
678 { description: "Scroll to only top by oblique line wheel event with overflow-y: hidden",
679 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
680 deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
681 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
682 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: -1,
683 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
684 expected: kScrollLeft },
685 { description: "Scroll to only top by oblique page wheel event with overflow-y: hidden",
686 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
687 deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
688 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
689 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: -1,
690 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
691 expected: kScrollLeft,
692 cleanup: function () { gScrollableElement.style.overflowY = "auto"; } },
693 { description: "Don't be scrolled by oblique pixel wheel event with overflow: hidden",
694 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
695 deltaX: 16.0, deltaY: 16.0, deltaZ: 0.0,
696 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
697 expectedOverflowDeltaX: 1, expectedOverflowDeltaY: 1,
698 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
699 expected: kNoScroll,
700 prepare: function() { gScrollableElement.style.overflow = "hidden"; } },
701 { description: "Don't be scrolled by oblique line wheel event with overflow: hidden",
702 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
703 deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
704 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
705 expectedOverflowDeltaX: 1, expectedOverflowDeltaY: 1,
706 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
707 expected: kNoScroll },
708 { description: "Don't be scrolled by oblique page wheel event with overflow: hidden",
709 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
710 deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
711 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
712 expectedOverflowDeltaX: 1, expectedOverflowDeltaY: 1,
713 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
714 expected: kNoScroll },
715 { description: "Don't be scrolled by oblique pixel wheel event with overflow: hidden",
716 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
717 deltaX: -16.0, deltaY: -16.0, deltaZ: 0.0,
718 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
719 expectedOverflowDeltaX: -1, expectedOverflowDeltaY: -1,
720 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
721 expected: kNoScroll },
722 { description: "Don't be scrolled by oblique line wheel event with overflow: hidden",
723 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
724 deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
725 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
726 expectedOverflowDeltaX: -1, expectedOverflowDeltaY: -1,
727 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
728 expected: kNoScroll },
729 { description: "Don't be scrolled by oblique page wheel event with overflow: hidden",
730 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
731 deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
732 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
733 expectedOverflowDeltaX: -1, expectedOverflowDeltaY: -1,
734 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
735 expected: kNoScroll,
736 cleanup: function () { gScrollableElement.style.overflow = "auto"; } },
737
738 // Don't scroll along axis whose overflow style is hidden and overflow delta values should
739 // be zero if there is ancestor scrollable element.
740 { description: "Scroll to only bottom by oblique pixel wheel event with overflow-x: hidden (body is scrollable)",
741 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
742 deltaX: 16.0, deltaY: 16.0, deltaZ: 0.0,
743 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
744 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
745 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
746 expected: kScrollDown,
747 prepare: function() {
748 gScrollableElement.style.overflowX = "hidden";
749 gScrollableElement.style.position = "fixed";
750 gScrollableElement.style.top = "30px";
751 gScrollableElement.style.left = "30px";
752 // Make body element scrollable.
753 gSpacerForBodyElement.style.width = "5000px";
754 gSpacerForBodyElement.style.height = "5000px";
755 document.documentElement.scrollTop = 500;
756 document.documentElement.scrollLeft = 500;
757 } },
758 { description: "Scroll to only bottom by oblique line wheel event with overflow-x: hidden (body is scrollable)",
759 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
760 deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
761 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
762 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
763 expected: kScrollDown },
764 { description: "Scroll to only bottom by oblique page wheel event with overflow-x: hidden (body is scrollable)",
765 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
766 deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
767 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
768 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
769 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
770 expected: kScrollDown },
771 { description: "Scroll to only top by oblique pixel wheel event with overflow-x: hidden (body is scrollable)",
772 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
773 deltaX: -16.0, deltaY: -16.0, deltaZ: 0.0,
774 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
775 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
776 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
777 expected: kScrollUp },
778 { description: "Scroll to only top by oblique line wheel event with overflow-x: hidden (body is scrollable)",
779 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
780 deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
781 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
782 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
783 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
784 expected: kScrollUp },
785 { description: "Scroll to only top by oblique page wheel event with overflow-x: hidden (body is scrollable)",
786 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
787 deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
788 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
789 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
790 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
791 expected: kScrollUp,
792 cleanup: function () { gScrollableElement.style.overflowX = "auto"; } },
793 { description: "Scroll to only right by oblique pixel wheel event with overflow-y: hidden (body is scrollable)",
794 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
795 deltaX: 16.0, deltaY: 16.0, deltaZ: 0.0,
796 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
797 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
798 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
799 expected: kScrollRight,
800 prepare: function() { gScrollableElement.style.overflowY = "hidden"; } },
801 { description: "Scroll to only right by oblique line wheel event with overflow-y: hidden (body is scrollable)",
802 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
803 deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
804 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
805 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
806 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
807 expected: kScrollRight },
808 { description: "Scroll to only right by oblique page wheel event with overflow-y: hidden (body is scrollable)",
809 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
810 deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
811 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
812 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
813 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
814 expected: kScrollRight },
815 { description: "Scroll to only left by oblique pixel wheel event with overflow-y: hidden (body is scrollable)",
816 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
817 deltaX: -16.0, deltaY: -16.0, deltaZ: 0.0,
818 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
819 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
820 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
821 expected: kScrollLeft },
822 { description: "Scroll to only top by oblique line wheel event with overflow-y: hidden (body is scrollable)",
823 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
824 deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
825 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
826 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
827 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
828 expected: kScrollLeft },
829 { description: "Scroll to only top by oblique page wheel event with overflow-y: hidden (body is scrollable)",
830 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
831 deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
832 lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
833 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
834 shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
835 expected: kScrollLeft,
836 cleanup: function () {
837 gScrollableElement.style.overflowY = "auto";
838 gScrollableElement.style.position = "static";
839 gSpacerForBodyElement.style.width = "";
840 gSpacerForBodyElement.style.height = "";
841 } },
842 ];
843
844 var description;
845
846 var currentTestIndex = -1;
847 var isXReverted = (aSettings.deltaMultiplierX < 0);
848 var isYReverted = (aSettings.deltaMultiplierY < 0);
849
850 function doNextTest()
851 {
852 if (++currentTestIndex >= kTests.length) {
853 SimpleTest.executeSoon(aCallback);
854 return;
855 }
856
857 gScrollableElement.scrollTop = 1000;
858 gScrollableElement.scrollLeft = 1000;
859
860 var currentTest = kTests[currentTestIndex];
861 description = "doTestScroll(aSettings=" + aSettings.description + "), " + currentTest.description + ": ";
862 if (currentTest.prepare) {
863 currentTest.prepare();
864 }
865
866 synthesizeWheel(gScrollableElement, 10, 10, currentTest.event);
867
868 hitEventLoop(function () {
869 if (currentTest.expected == kNoScroll) {
870 is(gScrollableElement.scrollTop, 1000, description + "scrolled vertical");
871 is(gScrollableElement.scrollLeft, 1000, description + "scrolled horizontal");
872 } else {
873 var scrollUp = !isYReverted ? (currentTest.expected & kScrollUp) :
874 (currentTest.expected & kScrollDown);
875 var scrollDown = !isYReverted ? (currentTest.expected & kScrollDown) :
876 (currentTest.expected & kScrollUp);
877 if (scrollUp) {
878 ok(gScrollableElement.scrollTop < 1000, description + "not scrolled up, got " + gScrollableElement.scrollTop);
879 } else if (scrollDown) {
880 ok(gScrollableElement.scrollTop > 1000, description + "not scrolled down, got " + gScrollableElement.scrollTop);
881 } else {
882 is(gScrollableElement.scrollTop, 1000, description + "scrolled vertical");
883 }
884 var scrollLeft = !isXReverted ? (currentTest.expected & kScrollLeft) :
885 (currentTest.expected & kScrollRight);
886 var scrollRight = !isXReverted ? (currentTest.expected & kScrollRight) :
887 (currentTest.expected & kScrollLeft);
888 if (scrollLeft) {
889 ok(gScrollableElement.scrollLeft < 1000, description + "not scrolled to left, got " + gScrollableElement.scrollLeft);
890 } else if (scrollRight) {
891 ok(gScrollableElement.scrollLeft > 1000, description + "not scrolled to right, got " + gScrollableElement.scrollLeft);
892 } else {
893 is(gScrollableElement.scrollLeft, 1000, description + "scrolled horizontal");
894 }
895 }
896 if (currentTest.cleanup) {
897 currentTest.cleanup();
898 }
899 winUtils.advanceTimeAndRefresh(100);
900 doNextTest();
901 }, 10);
902 }
903 doNextTest();
904 }
905
906 function doTestZoom(aSettings, aCallback)
907 {
908 if ((aSettings.deltaMultiplierX != 1.0 && aSettings.deltaMultiplierX != -1.0) ||
909 (aSettings.deltaMultiplierY != 1.0 && aSettings.deltaMultiplierY != -1.0)) {
910 todo(false, "doTestZoom doesn't support to test with aSettings=" + aSettings.description);
911 SimpleTest.executeSoon(aCallback);
912 return;
913 }
914
915 const kNone = 0x00;
916 const kPositive = 0x01;
917 const kNegative = 0x02;
918 const kUseX = 0x10;
919 const kUseY = 0x20;
920 const kTests = [
921 { description: "by vertical/positive pixel event when its lineOrPageDeltaY is 0",
922 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
923 deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
924 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
925 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
926 expected: kNone },
927 { description: "by vertical/positive pixel event when its lineOrPageDeltaY is 1",
928 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
929 deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
930 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1,
931 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
932 expected: kPositive | kUseY },
933 { description: "by vertical/negative pixel event when its lineOrPageDeltaY is 0",
934 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
935 deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
936 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
937 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
938 expected: kNone },
939 { description: "by vertical/negative pixel event when its lineOrPageDeltaY is -1",
940 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
941 deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
942 lineOrPageDeltaX: 0, lineOrPageDeltaY: -1,
943 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
944 expected: kNegative | kUseY },
945 { description: "by horizotal/positive pixel event when its lineOrPageDeltaX is 0",
946 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
947 deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
948 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
949 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
950 expected: kNone },
951 { description: "by horizotal/positive pixel event when its lineOrPageDeltaX is 1",
952 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
953 deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
954 lineOrPageDeltaX: 1, lineOrPageDeltaY: 0,
955 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
956 expected: kPositive | kUseX },
957 { description: "by horizotal/negative pixel event when its lineOrPageDeltaX is 0",
958 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
959 deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
960 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
961 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
962 expected: kNone },
963 { description: "by horizotal/negative pixel event when its lineOrPageDeltaX is -1",
964 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
965 deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
966 lineOrPageDeltaX: -1, lineOrPageDeltaY: 0,
967 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
968 expected: kNegative | kUseX },
969 { description: "by z pixel event",
970 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
971 deltaX: 0.0, deltaY: 0.0, deltaZ: 16.0,
972 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
973 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
974 expected: kNone },
975
976 { description: "by vertical/positive line event when its lineOrPageDeltaY is 0",
977 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
978 deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
979 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
980 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
981 expected: kNone },
982 { description: "by vertical/positive line event when its lineOrPageDeltaY is 1",
983 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
984 deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
985 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1,
986 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
987 expected: kPositive | kUseY },
988 { description: "by vertical/negative line event when its lineOrPageDeltaY is 0",
989 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
990 deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
991 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
992 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
993 expected: kNone },
994 { description: "by vertical/negative line event when its lineOrPageDeltaY is -1",
995 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
996 deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
997 lineOrPageDeltaX: 0, lineOrPageDeltaY: -1,
998 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
999 expected: kNegative | kUseY },
1000 { description: "by horizotal/positive line event when its lineOrPageDeltaX is 0",
1001 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1002 deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
1003 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
1004 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1005 expected: kNone },
1006 { description: "by horizotal/positive line event when its lineOrPageDeltaX is 1",
1007 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1008 deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
1009 lineOrPageDeltaX: 1, lineOrPageDeltaY: 0,
1010 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1011 expected: kPositive | kUseX },
1012 { description: "by horizotal/negative line event when its lineOrPageDeltaX is 0",
1013 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1014 deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
1015 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
1016 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1017 expected: kNone },
1018 { description: "by horizotal/negative line event when its lineOrPageDeltaX is -1",
1019 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1020 deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
1021 lineOrPageDeltaX: -1, lineOrPageDeltaY: 0,
1022 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1023 expected: kNegative | kUseX },
1024 { description: "by z line event",
1025 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1026 deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
1027 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
1028 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1029 expected: kNone },
1030
1031 { description: "by vertical/positive page event when its lineOrPageDeltaY is 0",
1032 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1033 deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
1034 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
1035 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1036 expected: kNone },
1037 { description: "by vertical/positive page event when its lineOrPageDeltaY is 1",
1038 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1039 deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
1040 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1,
1041 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1042 expected: kPositive | kUseY },
1043 { description: "by vertical/negative page event when its lineOrPageDeltaY is 0",
1044 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1045 deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
1046 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
1047 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1048 expected: kNone },
1049 { description: "by vertical/negative page event when its lineOrPageDeltaY is -1",
1050 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1051 deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
1052 lineOrPageDeltaX: 0, lineOrPageDeltaY: -1,
1053 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1054 expected: kNegative | kUseY },
1055 { description: "by horizotal/positive page event when its lineOrPageDeltaX is 0",
1056 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1057 deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
1058 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
1059 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1060 expected: kNone },
1061 { description: "by horizotal/positive page event when its lineOrPageDeltaX is 1",
1062 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1063 deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
1064 lineOrPageDeltaX: 1, lineOrPageDeltaY: 0,
1065 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1066 expected: kPositive | kUseX },
1067 { description: "by horizotal/negative page event when its lineOrPageDeltaX is 0",
1068 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1069 deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
1070 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
1071 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1072 expected: kNone },
1073 { description: "by horizotal/negative page event when its lineOrPageDeltaX is -1",
1074 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1075 deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
1076 lineOrPageDeltaX: -1, lineOrPageDeltaY: 0,
1077 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1078 expected: kNegative | kUseX },
1079 { description: "by z page event",
1080 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1081 deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
1082 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
1083 expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
1084 expected: kNone },
1085 ];
1086
1087 var description, currentTest;
1088 var currentTestIndex = -1;
1089 var isXReverted = (aSettings.deltaMultiplierX < 0);
1090 var isYReverted = (aSettings.deltaMultiplierY < 0);
1091
1092 function doNextTest()
1093 {
1094 if (++currentTestIndex >= kTests.length) {
1095 SimpleTest.executeSoon(aCallback);
1096 return;
1097 }
1098
1099 gScrollableElement.scrollTop = 1000;
1100 gScrollableElement.scrollLeft = 1000;
1101
1102 currentTest = kTests[currentTestIndex];
1103 description = "doTestZoom(aSettings=" + aSettings.description + "), ";
1104 if (currentTest.expected == kNone) {
1105 description += "Shouldn't ";
1106 } else {
1107 description += "Should ";
1108 }
1109 description += "zoom " + currentTest.description + ": ";
1110
1111 var event = currentTest.event;
1112 event.ctrlKey = true;
1113 synthesizeWheel(gScrollableElement, 10, 10, event);
1114
1115 // NOTE: Zooming might change scrollTop and scrollLeft by rounding fraction.
1116 // This test assume that zoom happens synchronously and scrolling
1117 // happens asynchronously.
1118 var scrollTop = gScrollableElement.scrollTop;
1119 var scrollLeft = gScrollableElement.scrollLeft;
1120
1121 hitEventLoop(function () {
1122 is(gScrollableElement.scrollTop, scrollTop, description + "scrolled vertical");
1123 is(gScrollableElement.scrollLeft, scrollLeft, description + "scrolled horizontal");
1124 if (!(currentTest.expected & (kNegative | kPositive))) {
1125 is(SpecialPowers.getFullZoom(window), 1.0, description + "zoomed");
1126 } else {
1127 var isReverted = (currentTest.expected & kUseX) ? isXReverted :
1128 (currentTest.expected & kUseY) ? isYReverted : false;
1129 if ((!isReverted && (currentTest.expected & kNegative)) ||
1130 (isReverted && (currentTest.expected & kPositive))) {
1131 ok(SpecialPowers.getFullZoom(window) > 1.0,
1132 description + "not zoomed in, got " + SpecialPowers.getFullZoom(window));
1133 } else {
1134 ok(SpecialPowers.getFullZoom(window) < 1.0,
1135 description + "not zoomed out, got " + SpecialPowers.getFullZoom(window));
1136 }
1137 }
1138
1139 synthesizeKey("0", { accelKey: true });
1140 onZoomReset(function () {
1141 hitEventLoop(doNextTest, 20);
1142 });
1143 }, 20);
1144 }
1145 doNextTest();
1146 }
1147
1148 function doTestZoomedScroll(aCallback)
1149 {
1150 var zoom = 1.0;
1151 function setFullZoom(aWindow, aZoom)
1152 {
1153 zoom = aZoom;
1154 SpecialPowers.setFullZoom(aWindow, aZoom);
1155 }
1156
1157 function prepareTestZoomedPixelScroll()
1158 {
1159 // Reset zoom and store the scroll amount into the data.
1160 synthesizeKey("0", { accelKey: true });
1161 zoom = 1.0;
1162 onZoomReset(testZoomedPixelScroll);
1163 }
1164
1165 function testZoomedPixelScroll()
1166 {
1167 gScrollableElement.scrollTop = 1000;
1168 gScrollableElement.scrollLeft = 1000;
1169 // Ensure not to be in reflow.
1170 hitEventLoop(function () {
1171 function mousePixelScrollHandler(aEvent)
1172 {
1173 if (aEvent.axis == MouseScrollEvent.HORIZONTAL_AXIS) {
1174 is(aEvent.detail, 16,
1175 "doTestZoomedScroll: The detail of horizontal MozMousePixelScroll for pixel wheel event is wrong");
1176 } else if (aEvent.axis == MouseScrollEvent.VERTICAL_AXIS) {
1177 is(aEvent.detail, 16,
1178 "doTestZoomedScroll: The detail of vertical MozMousePixelScroll for pixel wheel event is wrong");
1179 } else {
1180 ok(false, "doTestZoomedScroll: The axis of MozMousePixelScroll for pixel wheel event is invalid, got " + aEvent.axis);
1181 }
1182 }
1183 function wheelHandler(aEvent)
1184 {
1185 is(aEvent.deltaX, 16.0 / zoom,
1186 "doTestZoomedScroll: The deltaX of wheel for pixel is wrong");
1187 is(aEvent.deltaY, 16.0 / zoom,
1188 "doTestZoomedScroll: The deltaY of wheel for pixel is wrong");
1189 }
1190 window.addEventListener("MozMousePixelScroll", mousePixelScrollHandler, true);
1191 window.addEventListener("wheel", wheelHandler, true);
1192 synthesizeWheel(gScrollableElement, 10, 10,
1193 { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
1194 deltaX: 16.0, deltaY: 16.0, lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 });
1195 // wait scrolled actually.
1196 hitEventLoop(function () {
1197 var scrolledX = gScrollableElement.scrollLeft;
1198 var scrolledY = gScrollableElement.scrollTop;
1199 ok(scrolledX > 1000,
1200 "doTestZoomedScroll: scrolledX must be larger than 1000 for pixel wheel event, got " + scrolledX);
1201 ok(scrolledY > 1000,
1202 "doTestZoomedScroll: scrolledY must be larger than 1000 for pixel wheel event, got " + scrolledY);
1203
1204 // Zoom
1205 setFullZoom(window, 2.0);
1206 // Ensure not to be in reflow.
1207 hitEventLoop(function () {
1208 gScrollableElement.scrollTop = 1000;
1209 gScrollableElement.scrollLeft = 1000;
1210 synthesizeWheel(gScrollableElement, 10, 10,
1211 { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
1212 deltaX: 16.0, deltaY: 16.0, lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 });
1213 // wait scrolled actually.
1214 hitEventLoop(function () {
1215 ok(Math.abs(gScrollableElement.scrollLeft - (1000 + (scrolledX - 1000) / 2)) <= 1,
1216 "doTestZoomedScroll: zoomed horizontal scroll amount by pixel wheel event is different from normal, scrollLeft=" +
1217 gScrollableElement.scrollLeft + ", scrolledX=" + scrolledX);
1218 ok(Math.abs(gScrollableElement.scrollTop - (1000 + (scrolledY - 1000) / 2)) <= 1,
1219 "doTestZoomedScroll: zoomed vertical scroll amount by pixel wheel event is different from normal, scrollTop=" +
1220 gScrollableElement.scrollTop + ", scrolledY=" + scrolledY);
1221 window.removeEventListener("MozMousePixelScroll", mousePixelScrollHandler, true);
1222 window.removeEventListener("wheel", wheelHandler, true);
1223
1224 synthesizeKey("0", { accelKey: true });
1225 onZoomReset(prepareTestZoomedLineScroll);
1226 }, 20);
1227 }, 20);
1228 }, 20);
1229 }, 20);
1230 }
1231
1232 function prepareTestZoomedLineScroll()
1233 {
1234 // Reset zoom and store the scroll amount into the data.
1235 synthesizeKey("0", { accelKey: true });
1236 zoom = 1.0;
1237 onZoomReset(testZoomedLineScroll);
1238 }
1239 function testZoomedLineScroll()
1240 {
1241 gScrollableElement.scrollTop = 1000;
1242 gScrollableElement.scrollLeft = 1000;
1243 // Ensure not to be in reflow.
1244 hitEventLoop(function () {
1245 var lineHeightX, lineHeightY;
1246 function handler(aEvent)
1247 {
1248 if (aEvent.axis == MouseScrollEvent.HORIZONTAL_AXIS) {
1249 if (lineHeightX == undefined) {
1250 lineHeightX = aEvent.detail;
1251 } else {
1252 ok(Math.abs(aEvent.detail - lineHeightX) <= 1,
1253 "doTestZoomedScroll: The detail of horizontal MozMousePixelScroll for line wheel event is wrong, aEvent.detail=" +
1254 aEvent.detail + ", lineHeightX=" + lineHeightX);
1255 }
1256 } else if (aEvent.axis == MouseScrollEvent.VERTICAL_AXIS) {
1257 if (lineHeightY == undefined) {
1258 lineHeightY = aEvent.detail;
1259 } else {
1260 ok(Math.abs(aEvent.detail - lineHeightY) <= 1,
1261 "doTestZoomedScroll: The detail of vertical MozMousePixelScroll for line wheel event is wrong, aEvent.detail=" +
1262 aEvent.detail + ", lineHeightY=" + lineHeightY);
1263 }
1264 } else {
1265 ok(false, "doTestZoomedScroll: The axis of MozMousePixelScroll for line wheel event is invalid, got " + aEvent.axis);
1266 }
1267 }
1268 window.addEventListener("MozMousePixelScroll", handler, true);
1269 synthesizeWheel(gScrollableElement, 10, 10,
1270 { deltaMode: WheelEvent.DOM_DELTA_LINE,
1271 deltaX: 1.0, deltaY: 1.0, lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 });
1272 // wait scrolled actually.
1273 hitEventLoop(function () {
1274 var scrolledX = gScrollableElement.scrollLeft;
1275 var scrolledY = gScrollableElement.scrollTop;
1276 ok(scrolledX > 1000,
1277 "doTestZoomedScroll: scrolledX must be larger than 1000 for line wheel event, got " + scrolledX);
1278 ok(scrolledY > 1000,
1279 "doTestZoomedScroll: scrolledY must be larger than 1000 for line wheel event, got " + scrolledY);
1280
1281 // Zoom
1282 setFullZoom(window, 2.0);
1283 // Ensure not to be in reflow.
1284 hitEventLoop(function () {
1285 gScrollableElement.scrollTop = 1000;
1286 gScrollableElement.scrollLeft = 1000;
1287 synthesizeWheel(gScrollableElement, 10, 10,
1288 { deltaMode: WheelEvent.DOM_DELTA_LINE,
1289 deltaX: 1.0, deltaY: 1.0, lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 });
1290 // wait scrolled actually.
1291 hitEventLoop(function () {
1292 ok(Math.abs(gScrollableElement.scrollLeft - scrolledX) <= 1,
1293 "doTestZoomedScroll: zoomed horizontal scroll amount by line wheel event is different from normal, scrollLeft=" +
1294 gScrollableElement.scrollLeft + ", scrolledX=" + scrolledX);
1295 ok(Math.abs(gScrollableElement.scrollTop - scrolledY) <= 1,
1296 "doTestZoomedScroll: zoomed vertical scroll amount by line wheel event is different from normal, scrollTop=" +
1297 gScrollableElement.scrollTop + ", scrolledY=" + scrolledY);
1298
1299 window.removeEventListener("MozMousePixelScroll", handler, true);
1300
1301 synthesizeKey("0", { accelKey: true });
1302 onZoomReset(aCallback);
1303 }, 20);
1304 }, 20);
1305 }, 20);
1306 }, 20);
1307 }
1308
1309 // XXX It's too difficult to test page scroll because the page scroll amount
1310 // is computed by complex logic.
1311
1312 prepareTestZoomedPixelScroll();
1313 }
1314
1315 function doTestWholeScroll(aCallback)
1316 {
1317 SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_x", 99999999);
1318 SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_y", 99999999);
1319
1320 const kTests = [
1321 { description: "try whole-scroll to top (line)",
1322 prepare: function () {
1323 gScrollableElement.scrollTop = 1000;
1324 gScrollableElement.scrollLeft = 1000;
1325 },
1326 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1327 deltaX: 0.0, deltaY: -1.0,
1328 lineOrPageDeltaX: 0, lineOrPageDeltaY: -1 },
1329 expectedScrollTop: 0,
1330 expectedScrollLeft: 1000
1331 },
1332 { description: "try whole-scroll to top when scrollTop is already top-most (line)",
1333 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1334 deltaX: 0.0, deltaY: -1.0,
1335 lineOrPageDeltaX: 0, lineOrPageDeltaY: -1 },
1336 expectedScrollTop: 0,
1337 expectedScrollLeft: 1000
1338 },
1339 { description: "try whole-scroll to bottom (line)",
1340 prepare: function () {
1341 gScrollableElement.scrollTop = 1000;
1342 gScrollableElement.scrollLeft = 1000;
1343 },
1344 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1345 deltaX: 0.0, deltaY: 1.0,
1346 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1 },
1347 expectedScrollTop: gScrollableElement.scrollTopMax,
1348 expectedScrollLeft: 1000
1349 },
1350 { description: "try whole-scroll to bottom when scrollTop is already bottom-most (line)",
1351 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1352 deltaX: 0, deltaY: 1.0,
1353 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1 },
1354 expectedScrollTop: gScrollableElement.scrollTopMax,
1355 expectedScrollLeft: 1000
1356 },
1357 { description: "try whole-scroll to left (line)",
1358 prepare: function () {
1359 gScrollableElement.scrollTop = 1000;
1360 gScrollableElement.scrollLeft = 1000;
1361 },
1362 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1363 deltaX: -1.0, deltaY: 0.0,
1364 lineOrPageDeltaX: -1, lineOrPageDeltaY: 0 },
1365 expectedScrollTop: 1000,
1366 expectedScrollLeft: 0
1367 },
1368 { description: "try whole-scroll to left when scrollLeft is already left-most (line)",
1369 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1370 deltaX: -1.0, deltaY: 0,
1371 lineOrPageDeltaX: -1, lineOrPageDeltaY: 0 },
1372 expectedScrollTop: 1000,
1373 expectedScrollLeft: 0
1374 },
1375 { description: "try whole-scroll to right (line)",
1376 prepare: function () {
1377 gScrollableElement.scrollTop = 1000;
1378 gScrollableElement.scrollLeft = 1000;
1379 },
1380 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1381 deltaX: 1.0, deltaY: 0.0,
1382 lineOrPageDeltaX: 1, lineOrPageDeltaY: 0 },
1383 expectedScrollTop: 1000,
1384 expectedScrollLeft: gScrollableElement.scrollLeftMax
1385 },
1386 { description: "try whole-scroll to right when scrollLeft is already right-most (line)",
1387 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1388 deltaX: 1.0, deltaY: 0.0,
1389 lineOrPageDeltaX: 1, lineOrPageDeltaY: 0 },
1390 expectedScrollTop: 1000,
1391 expectedScrollLeft: gScrollableElement.scrollLeftMax
1392 },
1393
1394
1395 { description: "try whole-scroll to top (pixel)",
1396 prepare: function () {
1397 gScrollableElement.scrollTop = 1000;
1398 gScrollableElement.scrollLeft = 1000;
1399 },
1400 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
1401 deltaX: 0.0, deltaY: -1.0,
1402 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
1403 expectedScrollTop: 0,
1404 expectedScrollLeft: 1000
1405 },
1406 { description: "try whole-scroll to top when scrollTop is already top-most (pixel)",
1407 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
1408 deltaX: 0.0, deltaY: -1.0,
1409 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
1410 expectedScrollTop: 0,
1411 expectedScrollLeft: 1000
1412 },
1413 { description: "try whole-scroll to bottom (pixel)",
1414 prepare: function () {
1415 gScrollableElement.scrollTop = 1000;
1416 gScrollableElement.scrollLeft = 1000;
1417 },
1418 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
1419 deltaX: 0.0, deltaY: 1.0,
1420 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
1421 expectedScrollTop: gScrollableElement.scrollTopMax,
1422 expectedScrollLeft: 1000
1423 },
1424 { description: "try whole-scroll to bottom when scrollTop is already bottom-most (pixel)",
1425 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
1426 deltaX: 0, deltaY: 1.0,
1427 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
1428 expectedScrollTop: gScrollableElement.scrollTopMax,
1429 expectedScrollLeft: 1000
1430 },
1431 { description: "try whole-scroll to left (pixel)",
1432 prepare: function () {
1433 gScrollableElement.scrollTop = 1000;
1434 gScrollableElement.scrollLeft = 1000;
1435 },
1436 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
1437 deltaX: -1.0, deltaY: 0.0,
1438 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
1439 expectedScrollTop: 1000,
1440 expectedScrollLeft: 0
1441 },
1442 { description: "try whole-scroll to left when scrollLeft is already left-most (pixel)",
1443 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
1444 deltaX: -1.0, deltaY: 0,
1445 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
1446 expectedScrollTop: 1000,
1447 expectedScrollLeft: 0
1448 },
1449 { description: "try whole-scroll to right (pixel)",
1450 prepare: function () {
1451 gScrollableElement.scrollTop = 1000;
1452 gScrollableElement.scrollLeft = 1000;
1453 },
1454 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
1455 deltaX: 1.0, deltaY: 0.0,
1456 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
1457 expectedScrollTop: 1000,
1458 expectedScrollLeft: gScrollableElement.scrollLeftMax
1459 },
1460 { description: "try whole-scroll to right when scrollLeft is already right-most (pixel)",
1461 event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
1462 deltaX: 1.0, deltaY: 0.0,
1463 lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
1464 expectedScrollTop: 1000,
1465 expectedScrollLeft: gScrollableElement.scrollLeftMax
1466 },
1467
1468
1469 { description: "try whole-scroll to top (page)",
1470 prepare: function () {
1471 gScrollableElement.scrollTop = 1000;
1472 gScrollableElement.scrollLeft = 1000;
1473 },
1474 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1475 deltaX: 0.0, deltaY: -1.0,
1476 lineOrPageDeltaX: 0, lineOrPageDeltaY: -1 },
1477 expectedScrollTop: 0,
1478 expectedScrollLeft: 1000
1479 },
1480 { description: "try whole-scroll to top when scrollTop is already top-most (page)",
1481 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1482 deltaX: 0.0, deltaY: -1.0,
1483 lineOrPageDeltaX: 0, lineOrPageDeltaY: -1 },
1484 expectedScrollTop: 0,
1485 expectedScrollLeft: 1000
1486 },
1487 { description: "try whole-scroll to bottom (page)",
1488 prepare: function () {
1489 gScrollableElement.scrollTop = 1000;
1490 gScrollableElement.scrollLeft = 1000;
1491 },
1492 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1493 deltaX: 0.0, deltaY: 1.0,
1494 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1 },
1495 expectedScrollTop: gScrollableElement.scrollTopMax,
1496 expectedScrollLeft: 1000
1497 },
1498 { description: "try whole-scroll to bottom when scrollTop is already bottom-most (page)",
1499 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1500 deltaX: 0, deltaY: 1.0,
1501 lineOrPageDeltaX: 0, lineOrPageDeltaY: 1 },
1502 expectedScrollTop: gScrollableElement.scrollTopMax,
1503 expectedScrollLeft: 1000
1504 },
1505 { description: "try whole-scroll to left (page)",
1506 prepare: function () {
1507 gScrollableElement.scrollTop = 1000;
1508 gScrollableElement.scrollLeft = 1000;
1509 },
1510 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1511 deltaX: -1.0, deltaY: 0.0,
1512 lineOrPageDeltaX: -1, lineOrPageDeltaY: 0 },
1513 expectedScrollTop: 1000,
1514 expectedScrollLeft: 0
1515 },
1516 { description: "try whole-scroll to left when scrollLeft is already left-most (page)",
1517 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1518 deltaX: -1.0, deltaY: 0,
1519 lineOrPageDeltaX: -1, lineOrPageDeltaY: 0 },
1520 expectedScrollTop: 1000,
1521 expectedScrollLeft: 0
1522 },
1523 { description: "try whole-scroll to right (page)",
1524 prepare: function () {
1525 gScrollableElement.scrollTop = 1000;
1526 gScrollableElement.scrollLeft = 1000;
1527 },
1528 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1529 deltaX: 1.0, deltaY: 0.0,
1530 lineOrPageDeltaX: 1, lineOrPageDeltaY: 0 },
1531 expectedScrollTop: 1000,
1532 expectedScrollLeft: gScrollableElement.scrollLeftMax
1533 },
1534 { description: "try whole-scroll to right when scrollLeft is already right-most (page)",
1535 event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
1536 deltaX: 1.0, deltaY: 0.0,
1537 lineOrPageDeltaX: 1, lineOrPageDeltaY: 0 },
1538 expectedScrollTop: 1000,
1539 expectedScrollLeft: gScrollableElement.scrollLeftMax
1540 },
1541 ];
1542
1543 var index = 0;
1544
1545 function doIt()
1546 {
1547 const kTest = kTests[index];
1548 if (kTest.prepare) {
1549 kTest.prepare();
1550 }
1551 synthesizeWheel(gScrollableElement, 10, 10, kTest.event);
1552 hitEventLoop(function () {
1553 is(gScrollableElement.scrollTop, kTest.expectedScrollTop,
1554 "doTestWholeScroll, " + kTest.description + ": unexpected scrollTop");
1555 is(gScrollableElement.scrollLeft, kTest.expectedScrollLeft,
1556 "doTestWholeScroll, " + kTest.description + ": unexpected scrollLeft");
1557 if (++index == kTests.length) {
1558 SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_x");
1559 SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_y");
1560 SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_z");
1561 SimpleTest.executeSoon(aCallback);
1562 } else {
1563 doIt();
1564 }
1565 }, 20);
1566 }
1567 doIt();
1568 }
1569
1570 function doTestActionOverride(aCallback)
1571 {
1572 const kNoScroll = 0x00;
1573 const kScrollUp = 0x01;
1574 const kScrollDown = 0x02;
1575 const kScrollLeft = 0x04;
1576 const kScrollRight = 0x08;
1577
1578 const kTests = [
1579 { action: 1, override_x: -1,
1580 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1581 deltaX: 1.0, deltaY: 1.0,
1582 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1583 expected: kScrollDown | kScrollRight
1584 },
1585 { action: 1, override_x: 0,
1586 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1587 deltaX: 1.0, deltaY: 1.0,
1588 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1589 expected: kScrollDown | kScrollRight
1590 },
1591 { action: 1, override_x: 1,
1592 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1593 deltaX: 1.0, deltaY: 1.0,
1594 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1595 expected: kScrollDown | kScrollRight
1596 },
1597 { action: 0, override_x: -1,
1598 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1599 deltaX: 1.0, deltaY: 1.0,
1600 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1601 expected: kNoScroll
1602 },
1603 { action: 0, override_x: 0,
1604 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1605 deltaX: 1.0, deltaY: 1.0,
1606 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1607 expected: kNoScroll
1608 },
1609 { action: 0, override_x: 1,
1610 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1611 deltaX: 1.0, deltaY: 1.0,
1612 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1613 expected: kNoScroll
1614 },
1615 { action: 1, override_x: -1,
1616 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1617 deltaX: 1.0, deltaY: 0.5,
1618 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1619 expected: kScrollDown | kScrollRight
1620 },
1621 { action: 1, override_x: 0,
1622 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1623 deltaX: 1.0, deltaY: 0.5,
1624 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1625 expected: kNoScroll
1626 },
1627 { action: 1, override_x: 1,
1628 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1629 deltaX: 1.0, deltaY: 0.5,
1630 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1631 expected: kScrollDown | kScrollRight
1632 },
1633 { action: 0, override_x: -1,
1634 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1635 deltaX: 1.0, deltaY: 0.5,
1636 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1637 expected: kNoScroll
1638 },
1639 { action: 0, override_x: 0,
1640 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1641 deltaX: 1.0, deltaY: 0.5,
1642 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1643 expected: kNoScroll
1644 },
1645 { action: 0, override_x: 1,
1646 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1647 deltaX: 1.0, deltaY: 0.5,
1648 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1649 expected: kScrollDown | kScrollRight
1650 },
1651 { action: 1, override_x: -1,
1652 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1653 deltaX: 0.5, deltaY: 1.0,
1654 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1655 expected: kScrollDown | kScrollRight
1656 },
1657 { action: 1, override_x: 0,
1658 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1659 deltaX: 0.5, deltaY: 1.0,
1660 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1661 expected: kScrollDown | kScrollRight
1662 },
1663 { action: 1, override_x: 1,
1664 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1665 deltaX: 0.5, deltaY: 1.0,
1666 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1667 expected: kScrollDown | kScrollRight
1668 },
1669 { action: 0, override_x: -1,
1670 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1671 deltaX: 0.5, deltaY: 1.0,
1672 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1673 expected: kNoScroll
1674 },
1675 { action: 0, override_x: 0,
1676 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1677 deltaX: 0.5, deltaY: 1.0,
1678 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1679 expected: kNoScroll
1680 },
1681 { action: 0, override_x: 1,
1682 event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
1683 deltaX: 0.5, deltaY: 1.0,
1684 lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
1685 expected: kNoScroll
1686 },
1687 ];
1688
1689 var index = 0;
1690
1691 function doIt()
1692 {
1693 const kTest = kTests[index];
1694 description = "doTestActionOverride(action=" + kTest.action + ", " +
1695 "override_x=" + kTest.override_x + ", " +
1696 "deltaX=" + kTest.event.deltaX + ", " +
1697 "deltaY=" + kTest.event.deltaY + "): ";
1698 SpecialPowers.setIntPref("mousewheel.default.action", kTest.action);
1699 SpecialPowers.setIntPref("mousewheel.default.action.override_x", kTest.override_x);
1700 gScrollableElement.scrollTop = 1000;
1701 gScrollableElement.scrollLeft = 1000;
1702 synthesizeWheel(gScrollableElement, 10, 10, kTest.event);
1703 hitEventLoop(function () {
1704 if (kTest.expected & kScrollUp) {
1705 ok(gScrollableElement.scrollTop < 1000, description + "not scrolled up, got " + gScrollableElement.scrollTop);
1706 } else if (kTest.expected & kScrollDown) {
1707 ok(gScrollableElement.scrollTop > 1000, description + "not scrolled down, got " + gScrollableElement.scrollTop);
1708 } else {
1709 is(gScrollableElement.scrollTop, 1000, description + "scrolled vertical");
1710 }
1711 if (kTest.expected & kScrollLeft) {
1712 ok(gScrollableElement.scrollLeft < 1000, description + "not scrolled to left, got " + gScrollableElement.scrollLeft);
1713 } else if (kTest.expected & kScrollRight) {
1714 ok(gScrollableElement.scrollLeft > 1000, description + "not scrolled to right, got " + gScrollableElement.scrollLeft);
1715 } else {
1716 is(gScrollableElement.scrollLeft, 1000, description + "scrolled horizontal");
1717 }
1718 if (++index == kTests.length) {
1719 SpecialPowers.setIntPref("mousewheel.default.action", 1);
1720 SpecialPowers.setIntPref("mousewheel.default.action.override_x", -1);
1721 SimpleTest.executeSoon(aCallback);
1722 } else {
1723 doIt();
1724 }
1725 }, 20);
1726 }
1727 doIt();
1728 }
1729
1730 function runTests()
1731 {
1732 SpecialPowers.setBoolPref("general.smoothScroll", false);
1733
1734 SpecialPowers.setIntPref("mousewheel.default.action", 1); // scroll
1735 SpecialPowers.setIntPref("mousewheel.default.action.override_x", -1);
1736 SpecialPowers.setIntPref("mousewheel.with_shift.action", 2); // history
1737 SpecialPowers.setIntPref("mousewheel.with_shift.action.override_x", -1);
1738 SpecialPowers.setIntPref("mousewheel.with_control.action", 3); // zoom
1739 SpecialPowers.setIntPref("mousewheel.with_control.action.override_x", -1);
1740
1741 const kSettings = [
1742 { description: "all delta values are not customized",
1743 deltaMultiplierX: 1.0, deltaMultiplierY: 1.0, deltaMultiplierZ: 1.0 },
1744 { description: "deltaX is reverted",
1745 deltaMultiplierX: -1.0, deltaMultiplierY: 1.0, deltaMultiplierZ: 1.0 },
1746 { description: "deltaY is reverted",
1747 deltaMultiplierX: 1.0, deltaMultiplierY: -1.0, deltaMultiplierZ: 1.0 },
1748 { description: "deltaZ is reverted",
1749 deltaMultiplierX: 1.0, deltaMultiplierY: 1.0, deltaMultiplierZ: -1.0 },
1750 { description: "deltaX is 2.0",
1751 deltaMultiplierX: 2.0, deltaMultiplierY: 1.0, deltaMultiplierZ: 1.0 },
1752 { description: "deltaY is 2.0",
1753 deltaMultiplierX: 1.0, deltaMultiplierY: 2.0, deltaMultiplierZ: 1.0 },
1754 { description: "deltaZ is 2.0",
1755 deltaMultiplierX: 1.0, deltaMultiplierY: 1.0, deltaMultiplierZ: 2.0 },
1756 { description: "deltaX is -2.0",
1757 deltaMultiplierX: -2.0, deltaMultiplierY: 1.0, deltaMultiplierZ: 1.0 },
1758 { description: "deltaY is -2.0",
1759 deltaMultiplierX: 1.0, deltaMultiplierY: -2.0, deltaMultiplierZ: 1.0 },
1760 { description: "deltaZ is -2.0",
1761 deltaMultiplierX: 1.0, deltaMultiplierY: 1.0, deltaMultiplierZ: -2.0 },
1762 ];
1763
1764 var index = 0;
1765
1766 function doTest() {
1767 setDeltaMultiplierSettings(kSettings[index]);
1768 doTestScroll(kSettings[index], function () {
1769 doTestZoom(kSettings[index], function() {
1770 if (++index == kSettings.length) {
1771 setDeltaMultiplierSettings(kSettings[0]);
1772 doTestZoomedScroll(function() {
1773 doTestWholeScroll(function() {
1774 doTestActionOverride(function() {
1775 finishTests();
1776 });
1777 });
1778 });
1779 } else {
1780 doTest();
1781 }
1782 });
1783 });
1784 }
1785 doTest();
1786 }
1787
1788 function finishTests()
1789 {
1790 SpecialPowers.clearUserPref("general.smoothScroll");
1791
1792 SpecialPowers.clearUserPref("mousewheel.default.action");
1793 SpecialPowers.clearUserPref("mousewheel.default.action.override_x");
1794 SpecialPowers.clearUserPref("mousewheel.with_shift.action");
1795 SpecialPowers.clearUserPref("mousewheel.with_shift.action.override_x");
1796 SpecialPowers.clearUserPref("mousewheel.with_control.action");
1797 SpecialPowers.clearUserPref("mousewheel.with_control.action.override_x");
1798
1799 SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_x");
1800 SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_y");
1801 SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_z");
1802 SpecialPowers.clearUserPref("mousewheel.with_alt.delta_multiplier_x");
1803 SpecialPowers.clearUserPref("mousewheel.with_alt.delta_multiplier_y");
1804 SpecialPowers.clearUserPref("mousewheel.with_alt.delta_multiplier_z");
1805 SpecialPowers.clearUserPref("mousewheel.with_control.delta_multiplier_x");
1806 SpecialPowers.clearUserPref("mousewheel.with_control.delta_multiplier_y");
1807 SpecialPowers.clearUserPref("mousewheel.with_control.delta_multiplier_z");
1808 SpecialPowers.clearUserPref("mousewheel.with_meta.delta_multiplier_x");
1809 SpecialPowers.clearUserPref("mousewheel.with_meta.delta_multiplier_y");
1810 SpecialPowers.clearUserPref("mousewheel.with_meta.delta_multiplier_z");
1811 SpecialPowers.clearUserPref("mousewheel.with_shift.delta_multiplier_x");
1812 SpecialPowers.clearUserPref("mousewheel.with_shift.delta_multiplier_y");
1813 SpecialPowers.clearUserPref("mousewheel.with_shift.delta_multiplier_z");
1814 SpecialPowers.clearUserPref("mousewheel.with_win.delta_multiplier_x");
1815 SpecialPowers.clearUserPref("mousewheel.with_win.delta_multiplier_y");
1816 SpecialPowers.clearUserPref("mousewheel.with_win.delta_multiplier_z");
1817
1818 winUtils.restoreNormalRefresh();
1819
1820 window.opener.finish();
1821 }
1822
1823 </script>
1824 </pre>
1825 </body>
1826 </html>

mercurial