Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
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">
43 </div>
44 <pre id="test">
45 <script type="application/javascript">
47 SimpleTest.waitForExplicitFinish();
48 SimpleTest.waitForFocus(runTests, window);
50 var gScrollableElement = document.getElementById("scrollable");
51 var gScrolledElement = document.getElementById("scrolled");
53 var gLineHeight = 0;
54 var gHorizontalLine = 0;
55 var gPageHeight = 0;
56 var gPageWidth = 0;
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);
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);
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);
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);
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);
98 window.removeEventListener("MozMousePixelScroll", handler, true);
99 }
101 function testMakingUntrustedEvent()
102 {
103 const kCreateEventArgs = [
104 "WheelEvent", "wheelevent", "wheelEvent", "Wheelevent"
105 ];
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 }
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 }
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;
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 ];
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 ];
184 const kDeltaMultiplierPrefs = [
185 "delta_multiplier_x", "delta_multiplier_y", "delta_multiplier_z"
186 ];
188 const kPrefValues = [
189 200, 50, 0, -50, -150
190 ];
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 } };
198 function wheelEventHandler(aEvent) {
199 calledHandlers.wheel = true;
201 var expectedDeltaX = currentEvent.deltaX;
202 var expectedDeltaY = currentEvent.deltaY;
203 var expectedDeltaZ = currentEvent.deltaZ;
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 }
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");
278 aEvent.preventDefault();
279 }
281 window.addEventListener("wheel", wheelEventHandler, true);
282 window.addEventListener("DOMMouseScroll", legacyEventHandler, true);
283 window.addEventListener("MozMousePixelScroll", legacyEventHandler, true);
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 }
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];
315 SpecialPowers.setIntPref(currentPref, kPrefValues[j]);
317 gScrollableElement.scrollTop = gScrollableElement.scrollBottom = 1000;
319 // trusted event's delta valuses should be reverted by the pref.
320 testingExpected = aIsExpected;
322 description = "testDeltaMultiplierPrefs, pref: " + currentPref + "=" + kPrefValues[j] +
323 ", deltaMode: " + currentEvent.deltaMode + ", modifiers: \"" + modifierList + "\", (trusted event): ";
324 synthesizeWheel(gScrollableElement, 10, 10, currentEvent);
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 };
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");
350 calledHandlers = { wheel: false,
351 DOMMouseScroll: { horizontal: false, vertical: false },
352 MozMousePixelScroll: { horizontal: false, vertical: false } };
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);
370 description = "testDeltaMultiplierPrefs, pref: " + currentPref + "=" + kPrefValues[j] +
371 ", deltaMode: " + currentEvent.deltaMode + ", modifiers: \"" + modifierList + "\", (untrusted event): ";
372 gScrollableElement.dispatchEvent(untrustedEvent);
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");
384 SpecialPowers.setIntPref(currentPref, 100);
386 calledHandlers = { wheel: false,
387 DOMMouseScroll: { horizontal: false, vertical: false },
388 MozMousePixelScroll: { horizontal: false, vertical: false } };
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 }
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 }
412 window.removeEventListener("wheel", wheelEventHandler, true);
413 window.removeEventListener("DOMMouseScroll", legacyEventHandler, true);
414 window.removeEventListener("MozMousePixelScroll", legacyEventHandler, true);
415 }
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 }
427 function legacyEventHandler(aEvent)
428 {
429 ok(false, aEvent.type + " must not be fired");
430 }
432 window.addEventListener("wheel", wheelEventHandler, true);
433 window.addEventListener("DOMMouseScroll", legacyEventHandler, true);
434 window.addEventListener("MozMousePixelScroll", legacyEventHandler, true);
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");
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");
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");
466 window.removeEventListener("wheel", wheelEventHandler, true);
467 window.removeEventListener("DOMMouseScroll", legacyEventHandler, true);
468 window.removeEventListener("MozMousePixelScroll", legacyEventHandler, true);
469 }
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;
481 var currentTest;
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 ];
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 }
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 }
621 function handler(aEvent)
622 {
623 if (pushEvent(aEvent, false) == currentTest.doPreventDefaultAt) {
624 aEvent.preventDefault();
625 }
626 }
628 function systemHandler(aEvent)
629 {
630 if (pushEvent(aEvent, true) == currentTest.doPreventDefaultAt) {
631 aEvent.preventDefault();
632 }
633 }
635 window.addEventListener("wheel", handler, true);
636 window.addEventListener("DOMMouseScroll", handler, true);
637 window.addEventListener("MozMousePixelScroll", handler, true);
639 SpecialPowers.addSystemEventListener(window, "wheel", systemHandler, true);
640 SpecialPowers.addSystemEventListener(window, "DOMMouseScroll", systemHandler, true);
641 SpecialPowers.addSystemEventListener(window, "MozMousePixelScroll", systemHandler, true);
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 });
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 }
665 window.removeEventListener("wheel", handler, true);
666 window.removeEventListener("DOMMouseScroll", handler, true);
667 window.removeEventListener("MozMousePixelScroll", handler, true);
669 SpecialPowers.removeSystemEventListener(window, "wheel", systemHandler, true);
670 SpecialPowers.removeSystemEventListener(window, "DOMMouseScroll", systemHandler, true);
671 SpecialPowers.removeSystemEventListener(window, "MozMousePixelScroll", systemHandler, true);
672 }
674 var gOnWheelAttrHandled = new Array;
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 }
690 var gOnWheelPropHandled = new Array;
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 }
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);
731 prepareScrollUnits();
732 testMakingUntrustedEvent();
733 testDeltaMultiplierPrefs();
734 testDispatchingUntrustEvent();
735 testEventOrder();
736 testOnWheelAttr();
737 testOnWheelProperty();
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");
758 SimpleTest.finish();
759 }
761 </script>
762 </pre>
763 </body>
764 </html>