|
1 <!DOCTYPE HTML> |
|
2 <html style="font-size: 32px;"> |
|
3 <head> |
|
4 <title>Test for D3E 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="font-family: monospace; font-size: 16px; line-height: 1; overflow: auto; width: 200px; height: 200px;"> |
|
12 <div id="scrolled" style="font-size: 64px; width: 5000px; height: 5000px;"> |
|
13 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> |
|
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 </div> |
|
40 </div> |
|
41 <div id="content" style="display: none"> |
|
42 |
|
43 </div> |
|
44 <pre id="test"> |
|
45 <script type="application/javascript"> |
|
46 |
|
47 SimpleTest.waitForExplicitFinish(); |
|
48 SimpleTest.waitForFocus(runTests, window); |
|
49 |
|
50 var gScrollableElement = document.getElementById("scrollable"); |
|
51 var gScrolledElement = document.getElementById("scrolled"); |
|
52 |
|
53 var gLineHeight = 0; |
|
54 var gHorizontalLine = 0; |
|
55 var gPageHeight = 0; |
|
56 var gPageWidth = 0; |
|
57 |
|
58 function prepareScrollUnits() |
|
59 { |
|
60 var result = -1; |
|
61 function handler(aEvent) |
|
62 { |
|
63 result = aEvent.detail; |
|
64 aEvent.preventDefault(); |
|
65 } |
|
66 window.addEventListener("MozMousePixelScroll", handler, true); |
|
67 |
|
68 synthesizeWheel(gScrollableElement, 10, 10, |
|
69 { deltaMode: WheelEvent.DOM_DELTA_LINE, |
|
70 deltaY: 1.0, lineOrPageDeltaY: 1 }); |
|
71 gLineHeight = result; |
|
72 ok(gLineHeight > 10 && gLineHeight < 25, "prepareScrollUnits: gLineHeight may be illegal value, got " + gLineHeight); |
|
73 |
|
74 result = -1; |
|
75 synthesizeWheel(gScrollableElement, 10, 10, |
|
76 { deltaMode: WheelEvent.DOM_DELTA_LINE, |
|
77 deltaX: 1.0, lineOrPageDeltaX: 1 }); |
|
78 gHorizontalLine = result; |
|
79 ok(gHorizontalLine > 5 && gHorizontalLine < 16, "prepareScrollUnits: gHorizontalLine may be illegal value, got " + gHorizontalLine); |
|
80 |
|
81 result = -1; |
|
82 synthesizeWheel(gScrollableElement, 10, 10, |
|
83 { deltaMode: WheelEvent.DOM_DELTA_PAGE, |
|
84 deltaY: 1.0, lineOrPageDeltaY: 1 }); |
|
85 gPageHeight = result; |
|
86 // XXX Cannot we know the actual scroll port size? |
|
87 ok(gPageHeight >= 150 && gPageHeight <= 200, |
|
88 "prepareScrollUnits: gPageHeight is strange value, got " + gPageHeight); |
|
89 |
|
90 result = -1; |
|
91 synthesizeWheel(gScrollableElement, 10, 10, |
|
92 { deltaMode: WheelEvent.DOM_DELTA_PAGE, |
|
93 deltaX: 1.0, lineOrPageDeltaX: 1 }); |
|
94 gPageWidth = result; |
|
95 ok(gPageWidth >= 150 && gPageWidth <= 200, |
|
96 "prepareScrollUnits: gPageWidth is strange value, got " + gPageWidth); |
|
97 |
|
98 window.removeEventListener("MozMousePixelScroll", handler, true); |
|
99 } |
|
100 |
|
101 function testMakingUntrustedEvent() |
|
102 { |
|
103 const kCreateEventArgs = [ |
|
104 "WheelEvent", "wheelevent", "wheelEvent", "Wheelevent" |
|
105 ]; |
|
106 |
|
107 for (var i = 0; i < kCreateEventArgs.length; i++) { |
|
108 try { |
|
109 // We never support WheelEvent construction with document.createEvent(). |
|
110 var event = document.createEvent(kCreateEventArgs[i]); |
|
111 ok(false, "document.createEvent(" + kCreateEventArgs[i] + ") should throw an error"); |
|
112 } catch (e) { |
|
113 ok(true, "document.createEvent(" + kCreateEventArgs[i] + ") threw an error"); |
|
114 } |
|
115 } |
|
116 |
|
117 var wheelEvent = new WheelEvent("wheel"); |
|
118 ok(wheelEvent instanceof WheelEvent, |
|
119 "new WheelEvent() should create an instance of WheelEvent"); |
|
120 ok(typeof(wheelEvent.initWheelEvent) != "function", |
|
121 "WheelEvent must not have initWheelEvent()"); |
|
122 } |
|
123 |
|
124 // delta_multiplier prefs should cause changing delta values of trusted events only. |
|
125 // And also legacy events' detail value should be changed too. |
|
126 function testDeltaMultiplierPrefs() |
|
127 { |
|
128 const kModifierAlt = 0x01; |
|
129 const kModifierControl = 0x02; |
|
130 const kModifierMeta = 0x04; |
|
131 const kModifierShift = 0x08; |
|
132 const kModifierWin = 0x10; |
|
133 |
|
134 const kTests = [ |
|
135 { name: "default", |
|
136 expected: [ 0, kModifierShift | kModifierAlt, kModifierShift | kModifierControl, |
|
137 kModifierShift | kModifierMeta, kModifierShift | kModifierWin, |
|
138 kModifierControl | kModifierAlt, kModifierMeta | kModifierAlt ], |
|
139 unexpected: [ kModifierAlt, kModifierControl, kModifierMeta, kModifierShift, kModifierWin ] }, |
|
140 { name: "with_alt", |
|
141 expected: [ kModifierAlt ], |
|
142 unexpected: [0, kModifierControl, kModifierMeta, kModifierShift, kModifierWin, |
|
143 kModifierShift | kModifierAlt, kModifierControl | kModifierAlt, |
|
144 kModifierMeta | kModifierAlt ] }, |
|
145 { name: "with_control", |
|
146 expected: [ kModifierControl ], |
|
147 unexpected: [0, kModifierAlt, kModifierMeta, kModifierShift, kModifierWin, |
|
148 kModifierShift | kModifierControl, kModifierControl | kModifierAlt, |
|
149 kModifierMeta | kModifierControl ] }, |
|
150 { name: "with_meta", |
|
151 expected: [ kModifierMeta ], |
|
152 unexpected: [0, kModifierAlt, kModifierControl, kModifierShift, kModifierWin, |
|
153 kModifierShift | kModifierMeta, kModifierControl | kModifierMeta, |
|
154 kModifierMeta | kModifierAlt ] }, |
|
155 { name: "with_shift", |
|
156 expected: [ kModifierShift ], |
|
157 unexpected: [0, kModifierAlt, kModifierControl, kModifierMeta, kModifierWin, |
|
158 kModifierShift | kModifierAlt, kModifierControl | kModifierShift, |
|
159 kModifierMeta | kModifierShift ] }, |
|
160 { name: "with_win", |
|
161 expected: [ kModifierWin ], |
|
162 unexpected: [0, kModifierAlt, kModifierControl, kModifierMeta, kModifierShift, |
|
163 kModifierShift | kModifierWin ] }, |
|
164 ]; |
|
165 |
|
166 // Note that this test doesn't support complicated lineOrPageDelta values which are computed with |
|
167 // accumulated delta values by the prefs. If you need to test the lineOrPageDelta accumulation, |
|
168 // use test_continuous_dom_wheel_event.html. |
|
169 const kEvents = [ |
|
170 { deltaMode: WheelEvent.DOM_DELTA_PIXEL, |
|
171 deltaX: gHorizontalLine, deltaY: gLineHeight, deltaZ: gLineHeight, lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 }, |
|
172 { deltaMode: WheelEvent.DOM_DELTA_LINE, |
|
173 deltaX: 1.0, deltaY: 1.0, deltaZ: 1.0, lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 }, |
|
174 { deltaMode: WheelEvent.DOM_DELTA_PAGE, |
|
175 deltaX: 1.0, deltaY: 1.0, deltaZ: 1.0, lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 }, |
|
176 { deltaMode: WheelEvent.DOM_DELTA_PIXEL, |
|
177 deltaX: -gHorizontalLine, deltaY: -gLineHeight, deltaZ: -gLineHeight, lineOrPageDeltaX: -1, lineOrPageDeltaY: -1 }, |
|
178 { deltaMode: WheelEvent.DOM_DELTA_LINE, |
|
179 deltaX: -1.0, deltaY: -1.0, deltaZ: -1.0, lineOrPageDeltaX: -1, lineOrPageDeltaY: -1 }, |
|
180 { deltaMode: WheelEvent.DOM_DELTA_PAGE, |
|
181 deltaX: -1.0, deltaY: -1.0, deltaZ: -1.0, lineOrPageDeltaX: -1, lineOrPageDeltaY: -1 }, |
|
182 ]; |
|
183 |
|
184 const kDeltaMultiplierPrefs = [ |
|
185 "delta_multiplier_x", "delta_multiplier_y", "delta_multiplier_z" |
|
186 ]; |
|
187 |
|
188 const kPrefValues = [ |
|
189 200, 50, 0, -50, -150 |
|
190 ]; |
|
191 |
|
192 var currentTest, currentModifiers, currentEvent, currentPref, currentMultiplier, testingExpected; |
|
193 var description; |
|
194 var calledHandlers = { wheel: false, |
|
195 DOMMouseScroll: { horizontal: false, vertical: false }, |
|
196 MozMousePixelScroll: { horizontal: false, vertical: false } }; |
|
197 |
|
198 function wheelEventHandler(aEvent) { |
|
199 calledHandlers.wheel = true; |
|
200 |
|
201 var expectedDeltaX = currentEvent.deltaX; |
|
202 var expectedDeltaY = currentEvent.deltaY; |
|
203 var expectedDeltaZ = currentEvent.deltaZ; |
|
204 |
|
205 if (testingExpected) { |
|
206 switch (currentPref.charAt(currentPref.length - 1)) { |
|
207 case "x": |
|
208 expectedDeltaX *= currentMultiplier; |
|
209 break; |
|
210 case "y": |
|
211 expectedDeltaY *= currentMultiplier; |
|
212 break; |
|
213 case "z": |
|
214 expectedDeltaZ *= currentMultiplier; |
|
215 break; |
|
216 } |
|
217 } |
|
218 is(aEvent.deltaX, expectedDeltaX, description + "deltaX (" + currentEvent.deltaX + ") was invaild"); |
|
219 is(aEvent.deltaY, expectedDeltaY, description + "deltaY (" + currentEvent.deltaY + ") was invaild"); |
|
220 is(aEvent.deltaZ, expectedDeltaZ, description + "deltaZ (" + currentEvent.deltaZ + ") was invaild"); |
|
221 } |
|
222 |
|
223 function legacyEventHandler(aEvent) { |
|
224 var isHorizontal = (aEvent.axis == MouseScrollEvent.HORIZONTAL_AXIS); |
|
225 var isScrollEvent = (aEvent.type == "DOMMouseScroll"); |
|
226 if (isScrollEvent) { |
|
227 if (isHorizontal) { |
|
228 calledHandlers.DOMMouseScroll.horizontal = true; |
|
229 } else { |
|
230 calledHandlers.DOMMouseScroll.vertical = true; |
|
231 } |
|
232 } else { |
|
233 if (isHorizontal) { |
|
234 calledHandlers.MozMousePixelScroll.horizontal = true; |
|
235 } else { |
|
236 calledHandlers.MozMousePixelScroll.vertical = true; |
|
237 } |
|
238 } |
|
239 var eventName = (isHorizontal ? "Horizontal " : "Vertical ") + aEvent.type + " "; |
|
240 var expectedDetail; |
|
241 if (isScrollEvent) { |
|
242 expectedDetail = isHorizontal ? currentEvent.lineOrPageDeltaX : currentEvent.lineOrPageDeltaY; |
|
243 if (currentEvent.deltaMode == WheelEvent.DOM_DELTA_PAGE && expectedDetail) { |
|
244 expectedDetail = ((expectedDetail > 0) ? UIEvent.SCROLL_PAGE_DOWN : UIEvent.SCROLL_PAGE_UP); |
|
245 } |
|
246 } else { |
|
247 expectedDetail = isHorizontal ? currentEvent.deltaX : currentEvent.deltaY; |
|
248 if (expectedDetail) { |
|
249 if (currentEvent.deltaMode == WheelEvent.DOM_DELTA_LINE) { |
|
250 expectedDetail *= (isHorizontal ? gHorizontalLine : gLineHeight); |
|
251 } else if (currentEvent.deltaMode == WheelEvent.DOM_DELTA_PAGE) { |
|
252 if (expectedDetail > 0) { |
|
253 expectedDetail = (isHorizontal ? gPageWidth : gPageHeight); |
|
254 } else { |
|
255 expectedDetail = (isHorizontal ? -gPageWidth : -gPageHeight); |
|
256 } |
|
257 } |
|
258 } |
|
259 } |
|
260 if (testingExpected) { |
|
261 if ((isHorizontal && currentPref.charAt(currentPref.length - 1) == "x") || |
|
262 (!isHorizontal && currentPref.charAt(currentPref.length - 1) == "y")) { |
|
263 // If it's a page scroll event, the detail value is UIEvent.SCROLL_PAGE_DOWN or |
|
264 // UIEvent.SCROLL_PAGE_UP. If the delta value sign is reverted, we need to |
|
265 // revert the expected detail value too. Otherwise, don't touch it. |
|
266 if (isScrollEvent && currentEvent.deltaMode == WheelEvent.DOM_DELTA_PAGE) { |
|
267 if (currentMultiplier < 0) { |
|
268 expectedDetail = ((expectedDetail == UIEvent.SCROLL_PAGE_UP) ? UIEvent.SCROLL_PAGE_DOWN : UIEvent.SCROLL_PAGE_UP); |
|
269 } |
|
270 } else { |
|
271 expectedDetail *= currentMultiplier; |
|
272 expectedDetail = expectedDetail < 0 ? Math.ceil(expectedDetail) : Math.floor(expectedDetail); |
|
273 } |
|
274 } |
|
275 } |
|
276 is(aEvent.detail, expectedDetail, description + eventName + "detail was invalid"); |
|
277 |
|
278 aEvent.preventDefault(); |
|
279 } |
|
280 |
|
281 window.addEventListener("wheel", wheelEventHandler, true); |
|
282 window.addEventListener("DOMMouseScroll", legacyEventHandler, true); |
|
283 window.addEventListener("MozMousePixelScroll", legacyEventHandler, true); |
|
284 |
|
285 function dispatchEvent(aIsExpected) { |
|
286 for (var i = 0; i < kEvents.length; i++) { |
|
287 currentEvent = kEvents[i]; |
|
288 currentEvent.shiftKey = (currentModifiers & kModifierShift) != 0; |
|
289 currentEvent.ctrlKey = (currentModifiers & kModifierControl) != 0; |
|
290 currentEvent.altKey = (currentModifiers & kModifierAlt) != 0; |
|
291 currentEvent.metaKey = (currentModifiers & kModifierMeta) != 0; |
|
292 currentEvent.osKey = (currentModifiers & kModifierWin) != 0; |
|
293 var modifierList = ""; |
|
294 if (currentEvent.shiftKey) { |
|
295 modifierList += "Shift "; |
|
296 } |
|
297 if (currentEvent.ctrlKey) { |
|
298 modifierList += "Control "; |
|
299 } |
|
300 if (currentEvent.altKey) { |
|
301 modifierList += "Alt "; |
|
302 } |
|
303 if (currentEvent.metaKey) { |
|
304 modifierList += "Meta "; |
|
305 } |
|
306 if (currentEvent.osKey) { |
|
307 modifierList += "Win "; |
|
308 } |
|
309 |
|
310 for (var j = 0; j < kPrefValues.length; j++) { |
|
311 currentMultiplier = kPrefValues[j] / 100; |
|
312 for (var k = 0; k < kDeltaMultiplierPrefs.length; k++) { |
|
313 currentPref = "mousewheel." + currentTest.name + "." + kDeltaMultiplierPrefs[k]; |
|
314 |
|
315 SpecialPowers.setIntPref(currentPref, kPrefValues[j]); |
|
316 |
|
317 gScrollableElement.scrollTop = gScrollableElement.scrollBottom = 1000; |
|
318 |
|
319 // trusted event's delta valuses should be reverted by the pref. |
|
320 testingExpected = aIsExpected; |
|
321 |
|
322 description = "testDeltaMultiplierPrefs, pref: " + currentPref + "=" + kPrefValues[j] + |
|
323 ", deltaMode: " + currentEvent.deltaMode + ", modifiers: \"" + modifierList + "\", (trusted event): "; |
|
324 synthesizeWheel(gScrollableElement, 10, 10, currentEvent); |
|
325 |
|
326 var expectedProps = { |
|
327 deltaX: currentEvent.deltaX * currentMultiplier, |
|
328 deltaY: currentEvent.deltaY * currentMultiplier, |
|
329 dletaZ: currentEvent.deltaZ * currentMultiplier, |
|
330 lineOrPageDeltaX: currentEvent.lineOrPageDeltaX * currentMultiplier, |
|
331 lineOrPageDeltaY: currentEvent.lineOrPageDeltaY * currentMultiplier, |
|
332 }; |
|
333 |
|
334 is(calledHandlers.wheel, |
|
335 expectedProps.deltaX != 0 || expectedProps.deltaY != 0 || expectedProps.deltaZ != 0, |
|
336 description + "wheel event was (not) fired"); |
|
337 is(calledHandlers.DOMMouseScroll.horizontal, |
|
338 expectedProps.lineOrPageDeltaX >= 1 || expectedProps.lineOrPageDeltaX <= -1, |
|
339 description + "Horizontal DOMMouseScroll event was (not) fired"); |
|
340 is(calledHandlers.DOMMouseScroll.vertical, |
|
341 expectedProps.lineOrPageDeltaY >= 1 || expectedProps.lineOrPageDeltaY <= -1, |
|
342 description + "Vertical DOMMouseScroll event was (not) fired"); |
|
343 is(calledHandlers.MozMousePixelScroll.horizontal, |
|
344 expectedProps.deltaY >= 1 || expectedProps.deltaY <= -1, |
|
345 description + "Horizontal MozMousePixelScroll event was (not) fired"); |
|
346 is(calledHandlers.MozMousePixelScroll.vertical, |
|
347 expectedProps.deltaY >= 1 || expectedProps.deltaY <= -1, |
|
348 description + "Vertical MozMousePixelScroll event was (not) fired"); |
|
349 |
|
350 calledHandlers = { wheel: false, |
|
351 DOMMouseScroll: { horizontal: false, vertical: false }, |
|
352 MozMousePixelScroll: { horizontal: false, vertical: false } }; |
|
353 |
|
354 // untrusted event's delta values shouldn't be reverted by the pref. |
|
355 testingExpected = false; |
|
356 var props = { |
|
357 bubbles: true, |
|
358 cancelable: true, |
|
359 shiftKey: currentEvent.shiftKey, |
|
360 ctrlKey: currentEvent.ctrlKey, |
|
361 altKey: currentEvent.altKey, |
|
362 metaKey: currentEvent.metaKey, |
|
363 deltaX: currentEvent.deltaX, |
|
364 deltaY: currentEvent.deltaY, |
|
365 deltaZ: currentEvent.deltaZ, |
|
366 deltaMode: currentEvent.deltaMode, |
|
367 }; |
|
368 var untrustedEvent = new WheelEvent("wheel", props); |
|
369 |
|
370 description = "testDeltaMultiplierPrefs, pref: " + currentPref + "=" + kPrefValues[j] + |
|
371 ", deltaMode: " + currentEvent.deltaMode + ", modifiers: \"" + modifierList + "\", (untrusted event): "; |
|
372 gScrollableElement.dispatchEvent(untrustedEvent); |
|
373 |
|
374 ok(calledHandlers.wheel, description + "wheel event was not fired for untrusted event"); |
|
375 ok(!calledHandlers.DOMMouseScroll.horizontal, |
|
376 description + "Horizontal DOMMouseScroll event was fired for untrusted event"); |
|
377 ok(!calledHandlers.DOMMouseScroll.vertical, |
|
378 description + "Vertical DOMMouseScroll event was fired for untrusted event"); |
|
379 ok(!calledHandlers.MozMousePixelScroll.horizontal, |
|
380 description + "Horizontal MozMousePixelScroll event was fired for untrusted event"); |
|
381 ok(!calledHandlers.MozMousePixelScroll.vertical, |
|
382 description + "Vertical MozMousePixelScroll event was fired for untrusted event"); |
|
383 |
|
384 SpecialPowers.setIntPref(currentPref, 100); |
|
385 |
|
386 calledHandlers = { wheel: false, |
|
387 DOMMouseScroll: { horizontal: false, vertical: false }, |
|
388 MozMousePixelScroll: { horizontal: false, vertical: false } }; |
|
389 |
|
390 } |
|
391 // We should skip other value tests if testing with modifier key. |
|
392 // If we didn't do so, it would test too many times, but we don't need to do so. |
|
393 if (kTests.name != "default") { |
|
394 break; |
|
395 } |
|
396 } |
|
397 } |
|
398 } |
|
399 |
|
400 for (var i = 0; i < kTests.length; i++) { |
|
401 currentTest = kTests[i]; |
|
402 for (var j = 0; j < currentTest.expected.length; j++) { |
|
403 currentModifiers = currentTest.expected[j]; |
|
404 dispatchEvent(true); |
|
405 } |
|
406 for (var k = 0; k < currentTest.unexpected.length; k++) { |
|
407 currentModifiers = currentTest.unexpected[k]; |
|
408 dispatchEvent(false); |
|
409 } |
|
410 } |
|
411 |
|
412 window.removeEventListener("wheel", wheelEventHandler, true); |
|
413 window.removeEventListener("DOMMouseScroll", legacyEventHandler, true); |
|
414 window.removeEventListener("MozMousePixelScroll", legacyEventHandler, true); |
|
415 } |
|
416 |
|
417 // Untrusted wheel events shouldn't cause legacy mouse scroll events. |
|
418 function testDispatchingUntrustEvent() |
|
419 { |
|
420 var descriptionBase = "testDispatchingUntrustEvent, "; |
|
421 var description, wheelEventFired; |
|
422 function wheelEventHandler(aEvent) |
|
423 { |
|
424 wheelEventFired = true; |
|
425 } |
|
426 |
|
427 function legacyEventHandler(aEvent) |
|
428 { |
|
429 ok(false, aEvent.type + " must not be fired"); |
|
430 } |
|
431 |
|
432 window.addEventListener("wheel", wheelEventHandler, true); |
|
433 window.addEventListener("DOMMouseScroll", legacyEventHandler, true); |
|
434 window.addEventListener("MozMousePixelScroll", legacyEventHandler, true); |
|
435 |
|
436 description = descriptionBase + "dispatching a pixel wheel event: "; |
|
437 wheelEventFired = false; |
|
438 var untrustedPixelEvent = new WheelEvent("wheel", { |
|
439 bubbles: true, cancelable: true, |
|
440 deltaX: 24.0, deltaY: 24.0, |
|
441 deltaMode: WheelEvent.DOM_DELTA_PIXEL, |
|
442 }); |
|
443 gScrolledElement.dispatchEvent(untrustedPixelEvent); |
|
444 ok(wheelEventFired, description + "wheel event wasn't fired"); |
|
445 |
|
446 description = descriptionBase + "dispatching a line wheel event: "; |
|
447 wheelEventFired = false; |
|
448 var untrustedLineEvent = new WheelEvent("wheel", { |
|
449 bubbles: true, cancelable: true, |
|
450 deltaX: 3.0, deltaY: 3.0, |
|
451 deltaMode: WheelEvent.DOM_DELTA_LINE, |
|
452 }); |
|
453 gScrolledElement.dispatchEvent(untrustedLineEvent); |
|
454 ok(wheelEventFired, description + "wheel event wasn't fired"); |
|
455 |
|
456 description = descriptionBase + "dispatching a page wheel event: "; |
|
457 wheelEventFired = false; |
|
458 var untrustedPageEvent = new WheelEvent("wheel", { |
|
459 bubbles: true, cancelable: true, |
|
460 deltaX: 1.0, deltaY: 1.0, |
|
461 deltaMode: WheelEvent.DOM_DELTA_PAGE, |
|
462 }); |
|
463 gScrolledElement.dispatchEvent(untrustedPageEvent); |
|
464 ok(wheelEventFired, description + "wheel event wasn't fired"); |
|
465 |
|
466 window.removeEventListener("wheel", wheelEventHandler, true); |
|
467 window.removeEventListener("DOMMouseScroll", legacyEventHandler, true); |
|
468 window.removeEventListener("MozMousePixelScroll", legacyEventHandler, true); |
|
469 } |
|
470 |
|
471 function testEventOrder() |
|
472 { |
|
473 const kWheelEvent = 0x0001; |
|
474 const kDOMMouseScrollEvent = 0x0002; |
|
475 const kMozMousePixelScrollEvent = 0x0004; |
|
476 const kVerticalScrollEvent = 0x0010; |
|
477 const kHorizontalScrollEvent = 0x0020; |
|
478 const kInSystemGroup = 0x0100; |
|
479 const kDefaultPrevented = 0x1000; |
|
480 |
|
481 var currentTest; |
|
482 |
|
483 const kTests = [ |
|
484 { |
|
485 description: "Testing the order of the events without preventDefault()", |
|
486 expectedEvents: [ kWheelEvent, |
|
487 kDOMMouseScrollEvent | kVerticalScrollEvent, |
|
488 kDOMMouseScrollEvent | kVerticalScrollEvent | kInSystemGroup, |
|
489 kMozMousePixelScrollEvent | kVerticalScrollEvent, |
|
490 kMozMousePixelScrollEvent | kVerticalScrollEvent | kInSystemGroup, |
|
491 kDOMMouseScrollEvent | kHorizontalScrollEvent, |
|
492 kDOMMouseScrollEvent | kHorizontalScrollEvent | kInSystemGroup, |
|
493 kMozMousePixelScrollEvent | kHorizontalScrollEvent, |
|
494 kMozMousePixelScrollEvent | kHorizontalScrollEvent | kInSystemGroup, |
|
495 kWheelEvent | kInSystemGroup], |
|
496 resultEvents: [], |
|
497 doPreventDefaultAt: 0, |
|
498 }, |
|
499 { |
|
500 description: "Testing the order of the events, calling preventDefault() at default group wheel event", |
|
501 expectedEvents: [ kWheelEvent, |
|
502 kWheelEvent | kInSystemGroup | kDefaultPrevented], |
|
503 resultEvents: [], |
|
504 doPreventDefaultAt: kWheelEvent, |
|
505 }, |
|
506 { |
|
507 description: "Testing the order of the events, calling preventDefault() at default group DOMMouseScroll event", |
|
508 expectedEvents: [ kWheelEvent, |
|
509 kDOMMouseScrollEvent | kVerticalScrollEvent, |
|
510 kDOMMouseScrollEvent | kVerticalScrollEvent | kInSystemGroup | kDefaultPrevented, |
|
511 kMozMousePixelScrollEvent | kVerticalScrollEvent | kDefaultPrevented, |
|
512 kMozMousePixelScrollEvent | kVerticalScrollEvent | kInSystemGroup | kDefaultPrevented, |
|
513 kDOMMouseScrollEvent | kHorizontalScrollEvent, |
|
514 kDOMMouseScrollEvent | kHorizontalScrollEvent | kInSystemGroup, |
|
515 kMozMousePixelScrollEvent | kHorizontalScrollEvent, |
|
516 kMozMousePixelScrollEvent | kHorizontalScrollEvent | kInSystemGroup, |
|
517 kWheelEvent | kInSystemGroup | kDefaultPrevented], |
|
518 resultEvents: [], |
|
519 doPreventDefaultAt: kDOMMouseScrollEvent | kVerticalScrollEvent, |
|
520 }, |
|
521 { |
|
522 description: "Testing the order of the events, calling preventDefault() at default group MozMousePixelScroll event", |
|
523 expectedEvents: [ kWheelEvent, |
|
524 kDOMMouseScrollEvent | kVerticalScrollEvent, |
|
525 kDOMMouseScrollEvent | kVerticalScrollEvent | kInSystemGroup, |
|
526 kMozMousePixelScrollEvent | kVerticalScrollEvent, |
|
527 kMozMousePixelScrollEvent | kVerticalScrollEvent | kInSystemGroup | kDefaultPrevented, |
|
528 kDOMMouseScrollEvent | kHorizontalScrollEvent, |
|
529 kDOMMouseScrollEvent | kHorizontalScrollEvent | kInSystemGroup, |
|
530 kMozMousePixelScrollEvent | kHorizontalScrollEvent, |
|
531 kMozMousePixelScrollEvent | kHorizontalScrollEvent | kInSystemGroup, |
|
532 kWheelEvent | kInSystemGroup | kDefaultPrevented], |
|
533 resultEvents: [], |
|
534 doPreventDefaultAt: kMozMousePixelScrollEvent | kVerticalScrollEvent, |
|
535 }, |
|
536 { |
|
537 description: "Testing the order of the events, calling preventDefault() at system group DOMMouseScroll event", |
|
538 expectedEvents: [ kWheelEvent, |
|
539 kDOMMouseScrollEvent | kVerticalScrollEvent, |
|
540 kDOMMouseScrollEvent | kVerticalScrollEvent | kInSystemGroup, |
|
541 kMozMousePixelScrollEvent | kVerticalScrollEvent | kDefaultPrevented, |
|
542 kMozMousePixelScrollEvent | kVerticalScrollEvent | kInSystemGroup | kDefaultPrevented, |
|
543 kDOMMouseScrollEvent | kHorizontalScrollEvent, |
|
544 kDOMMouseScrollEvent | kHorizontalScrollEvent | kInSystemGroup, |
|
545 kMozMousePixelScrollEvent | kHorizontalScrollEvent, |
|
546 kMozMousePixelScrollEvent | kHorizontalScrollEvent | kInSystemGroup, |
|
547 kWheelEvent | kInSystemGroup | kDefaultPrevented], |
|
548 resultEvents: [], |
|
549 doPreventDefaultAt: kDOMMouseScrollEvent | kVerticalScrollEvent | kInSystemGroup, |
|
550 }, |
|
551 { |
|
552 description: "Testing the order of the events, calling preventDefault() at system group MozMousePixelScroll event", |
|
553 expectedEvents: [ kWheelEvent, |
|
554 kDOMMouseScrollEvent | kVerticalScrollEvent, |
|
555 kDOMMouseScrollEvent | kVerticalScrollEvent | kInSystemGroup, |
|
556 kMozMousePixelScrollEvent | kVerticalScrollEvent, |
|
557 kMozMousePixelScrollEvent | kVerticalScrollEvent | kInSystemGroup, |
|
558 kDOMMouseScrollEvent | kHorizontalScrollEvent, |
|
559 kDOMMouseScrollEvent | kHorizontalScrollEvent | kInSystemGroup, |
|
560 kMozMousePixelScrollEvent | kHorizontalScrollEvent, |
|
561 kMozMousePixelScrollEvent | kHorizontalScrollEvent | kInSystemGroup, |
|
562 kWheelEvent | kInSystemGroup | kDefaultPrevented], |
|
563 resultEvents: [], |
|
564 doPreventDefaultAt: kMozMousePixelScrollEvent | kVerticalScrollEvent | kInSystemGroup, |
|
565 }, |
|
566 ]; |
|
567 |
|
568 function getEventDescription(aEvent) |
|
569 { |
|
570 var result = ""; |
|
571 if (aEvent & kWheelEvent) { |
|
572 result = "wheel" |
|
573 } else { |
|
574 if (aEvent & kDOMMouseScrollEvent) { |
|
575 result = "DOMMouseScroll"; |
|
576 } else if (aEvent & kMozMousePixelScrollEvent) { |
|
577 result = "MozMousePixelScroll"; |
|
578 } |
|
579 if (aEvent & kVerticalScrollEvent) { |
|
580 result += ", vertical"; |
|
581 } else { |
|
582 result += ", horizontal"; |
|
583 } |
|
584 } |
|
585 if (aEvent & kInSystemGroup) { |
|
586 result += ", system group"; |
|
587 } |
|
588 if (aEvent & kDefaultPrevented) { |
|
589 result += ", defaultPrevented"; |
|
590 } |
|
591 return result; |
|
592 } |
|
593 |
|
594 function pushEvent(aEvent, aIsSystemGroup) |
|
595 { |
|
596 var event = 0; |
|
597 if (aEvent.type == "wheel") { |
|
598 event = kWheelEvent; |
|
599 } else { |
|
600 if (aEvent.type == "DOMMouseScroll") { |
|
601 event = kDOMMouseScrollEvent; |
|
602 } else if (aEvent.type == "MozMousePixelScroll") { |
|
603 event = kMozMousePixelScrollEvent; |
|
604 } |
|
605 if (aEvent.axis == MouseScrollEvent.HORIZONTAL_AXIS) { |
|
606 event |= kHorizontalScrollEvent; |
|
607 } else { |
|
608 event |= kVerticalScrollEvent; |
|
609 } |
|
610 } |
|
611 if (aIsSystemGroup) { |
|
612 event |= kInSystemGroup; |
|
613 } |
|
614 if (aEvent.defaultPrevented) { |
|
615 event |= kDefaultPrevented; |
|
616 } |
|
617 currentTest.resultEvents.push(event); |
|
618 return event; |
|
619 } |
|
620 |
|
621 function handler(aEvent) |
|
622 { |
|
623 if (pushEvent(aEvent, false) == currentTest.doPreventDefaultAt) { |
|
624 aEvent.preventDefault(); |
|
625 } |
|
626 } |
|
627 |
|
628 function systemHandler(aEvent) |
|
629 { |
|
630 if (pushEvent(aEvent, true) == currentTest.doPreventDefaultAt) { |
|
631 aEvent.preventDefault(); |
|
632 } |
|
633 } |
|
634 |
|
635 window.addEventListener("wheel", handler, true); |
|
636 window.addEventListener("DOMMouseScroll", handler, true); |
|
637 window.addEventListener("MozMousePixelScroll", handler, true); |
|
638 |
|
639 SpecialPowers.addSystemEventListener(window, "wheel", systemHandler, true); |
|
640 SpecialPowers.addSystemEventListener(window, "DOMMouseScroll", systemHandler, true); |
|
641 SpecialPowers.addSystemEventListener(window, "MozMousePixelScroll", systemHandler, true); |
|
642 |
|
643 for (var i = 0; i < kTests.length; i++) { |
|
644 currentTest = kTests[i]; |
|
645 synthesizeWheel(gScrollableElement, 10, 10, |
|
646 { deltaMode: WheelEvent.DOM_DELTA_LINE, deltaX: 1.0, deltaY: 1.0 }); |
|
647 |
|
648 for (var j = 0; j < currentTest.expectedEvents.length; j++) { |
|
649 if (currentTest.resultEvents.length == j) { |
|
650 ok(false, currentTest.description + ": " + |
|
651 getEventDescription(currentTest.expectedEvents[j]) + " wasn't fired"); |
|
652 break; |
|
653 } |
|
654 is(getEventDescription(currentTest.resultEvents[j]), |
|
655 getEventDescription(currentTest.expectedEvents[j]), |
|
656 currentTest.description + ": " + (j + 1) + "th event is mismatched"); |
|
657 } |
|
658 if (currentTest.expectedEvents.length < currentTest.resultEvents.length) { |
|
659 ok(false, currentTest.description + ": " + |
|
660 getEventDescription(currentTest.resultEvents[currentTest.expectedEvents.length]) + |
|
661 " was fired unexpectedly"); |
|
662 } |
|
663 } |
|
664 |
|
665 window.removeEventListener("wheel", handler, true); |
|
666 window.removeEventListener("DOMMouseScroll", handler, true); |
|
667 window.removeEventListener("MozMousePixelScroll", handler, true); |
|
668 |
|
669 SpecialPowers.removeSystemEventListener(window, "wheel", systemHandler, true); |
|
670 SpecialPowers.removeSystemEventListener(window, "DOMMouseScroll", systemHandler, true); |
|
671 SpecialPowers.removeSystemEventListener(window, "MozMousePixelScroll", systemHandler, true); |
|
672 } |
|
673 |
|
674 var gOnWheelAttrHandled = new Array; |
|
675 |
|
676 function testOnWheelAttr() |
|
677 { |
|
678 document.documentElement.setAttribute("onwheel", "gOnWheelAttrHandled['html'] = true;"); |
|
679 document.body.setAttribute("onwheel", "gOnWheelAttrHandled['body'] = true;"); |
|
680 gScrollableElement.setAttribute("onwheel", "gOnWheelAttrHandled['div'] = true;"); |
|
681 var target = document.getElementById("onwheel"); |
|
682 synthesizeWheel(gScrollableElement, 10, 10, |
|
683 { deltaMode: WheelEvent.DOM_DELTA_LINE, |
|
684 deltaX: 1.0, deltaY: 2.0 }); |
|
685 ok(gOnWheelAttrHandled['html'], "html element's onwheel attribute isn't performed"); |
|
686 ok(gOnWheelAttrHandled['body'], "body element's onwheel attribute isn't performed"); |
|
687 ok(gOnWheelAttrHandled['div'], "div element's onwheel attribute isn't performed"); |
|
688 } |
|
689 |
|
690 var gOnWheelPropHandled = new Array; |
|
691 |
|
692 function testOnWheelProperty() |
|
693 { |
|
694 window.onwheel = function (e) { gOnWheelPropHandled["window"] = true; } |
|
695 document.onwheel = function (e) { gOnWheelPropHandled["document"] = true; } |
|
696 document.documentElement.onwheel = function (e) { gOnWheelPropHandled["html"] = true; }; |
|
697 document.body.onwheel = function (e) { gOnWheelPropHandled["body"] = true; }; |
|
698 gScrollableElement.onwheel = function (e) { gOnWheelPropHandled["div"] = true; }; |
|
699 var target = document.getElementById("onwheel"); |
|
700 synthesizeWheel(gScrollableElement, 10, 10, |
|
701 { deltaMode: WheelEvent.DOM_DELTA_LINE, |
|
702 deltaX: 1.0, deltaY: 2.0 }); |
|
703 ok(gOnWheelPropHandled['window'], "window's onwheel property isn't performed"); |
|
704 ok(gOnWheelPropHandled['document'], "document's onwheel property isn't performed"); |
|
705 ok(gOnWheelPropHandled['html'], "html element's onwheel property isn't performed"); |
|
706 ok(gOnWheelPropHandled['body'], "body element's onwheel property isn't performed"); |
|
707 ok(gOnWheelPropHandled['div'], "div element's onwheel property isn't performed"); |
|
708 } |
|
709 |
|
710 function runTests() |
|
711 { |
|
712 SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_x", 100); |
|
713 SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_y", 100); |
|
714 SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_z", 100); |
|
715 SpecialPowers.setIntPref("mousewheel.with_alt.delta_multiplier_x", 100); |
|
716 SpecialPowers.setIntPref("mousewheel.with_alt.delta_multiplier_y", 100); |
|
717 SpecialPowers.setIntPref("mousewheel.with_alt.delta_multiplier_z", 100); |
|
718 SpecialPowers.setIntPref("mousewheel.with_control.delta_multiplier_x", 100); |
|
719 SpecialPowers.setIntPref("mousewheel.with_control.delta_multiplier_y", 100); |
|
720 SpecialPowers.setIntPref("mousewheel.with_control.delta_multiplier_z", 100); |
|
721 SpecialPowers.setIntPref("mousewheel.with_meta.delta_multiplier_x", 100); |
|
722 SpecialPowers.setIntPref("mousewheel.with_meta.delta_multiplier_y", 100); |
|
723 SpecialPowers.setIntPref("mousewheel.with_meta.delta_multiplier_z", 100); |
|
724 SpecialPowers.setIntPref("mousewheel.with_shift.delta_multiplier_x", 100); |
|
725 SpecialPowers.setIntPref("mousewheel.with_shift.delta_multiplier_y", 100); |
|
726 SpecialPowers.setIntPref("mousewheel.with_shift.delta_multiplier_z", 100); |
|
727 SpecialPowers.setIntPref("mousewheel.with_win.delta_multiplier_x", 100); |
|
728 SpecialPowers.setIntPref("mousewheel.with_win.delta_multiplier_y", 100); |
|
729 SpecialPowers.setIntPref("mousewheel.with_win.delta_multiplier_z", 100); |
|
730 |
|
731 prepareScrollUnits(); |
|
732 testMakingUntrustedEvent(); |
|
733 testDeltaMultiplierPrefs(); |
|
734 testDispatchingUntrustEvent(); |
|
735 testEventOrder(); |
|
736 testOnWheelAttr(); |
|
737 testOnWheelProperty(); |
|
738 |
|
739 SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_x"); |
|
740 SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_y"); |
|
741 SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_z"); |
|
742 SpecialPowers.clearUserPref("mousewheel.with_alt.delta_multiplier_x"); |
|
743 SpecialPowers.clearUserPref("mousewheel.with_alt.delta_multiplier_y"); |
|
744 SpecialPowers.clearUserPref("mousewheel.with_alt.delta_multiplier_z"); |
|
745 SpecialPowers.clearUserPref("mousewheel.with_control.delta_multiplier_x"); |
|
746 SpecialPowers.clearUserPref("mousewheel.with_control.delta_multiplier_y"); |
|
747 SpecialPowers.clearUserPref("mousewheel.with_control.delta_multiplier_z"); |
|
748 SpecialPowers.clearUserPref("mousewheel.with_meta.delta_multiplier_x"); |
|
749 SpecialPowers.clearUserPref("mousewheel.with_meta.delta_multiplier_y"); |
|
750 SpecialPowers.clearUserPref("mousewheel.with_meta.delta_multiplier_z"); |
|
751 SpecialPowers.clearUserPref("mousewheel.with_shift.delta_multiplier_x"); |
|
752 SpecialPowers.clearUserPref("mousewheel.with_shift.delta_multiplier_y"); |
|
753 SpecialPowers.clearUserPref("mousewheel.with_shift.delta_multiplier_z"); |
|
754 SpecialPowers.clearUserPref("mousewheel.with_win.delta_multiplier_x"); |
|
755 SpecialPowers.clearUserPref("mousewheel.with_win.delta_multiplier_y"); |
|
756 SpecialPowers.clearUserPref("mousewheel.with_win.delta_multiplier_z"); |
|
757 |
|
758 SimpleTest.finish(); |
|
759 } |
|
760 |
|
761 </script> |
|
762 </pre> |
|
763 </body> |
|
764 </html> |