1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/events/test/test_dom_wheel_event.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,764 @@ 1.4 +<!DOCTYPE HTML> 1.5 +<html style="font-size: 32px;"> 1.6 +<head> 1.7 + <title>Test for D3E WheelEvent</title> 1.8 + <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> 1.9 + <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script> 1.10 + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 1.11 +</head> 1.12 +<body> 1.13 +<p id="display"></p> 1.14 +<div id="scrollable" style="font-family: monospace; font-size: 16px; line-height: 1; overflow: auto; width: 200px; height: 200px;"> 1.15 + <div id="scrolled" style="font-size: 64px; width: 5000px; height: 5000px;"> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.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> 1.40 + 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> 1.41 + 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> 1.42 + </div> 1.43 +</div> 1.44 +<div id="content" style="display: none"> 1.45 + 1.46 +</div> 1.47 +<pre id="test"> 1.48 +<script type="application/javascript"> 1.49 + 1.50 +SimpleTest.waitForExplicitFinish(); 1.51 +SimpleTest.waitForFocus(runTests, window); 1.52 + 1.53 +var gScrollableElement = document.getElementById("scrollable"); 1.54 +var gScrolledElement = document.getElementById("scrolled"); 1.55 + 1.56 +var gLineHeight = 0; 1.57 +var gHorizontalLine = 0; 1.58 +var gPageHeight = 0; 1.59 +var gPageWidth = 0; 1.60 + 1.61 +function prepareScrollUnits() 1.62 +{ 1.63 + var result = -1; 1.64 + function handler(aEvent) 1.65 + { 1.66 + result = aEvent.detail; 1.67 + aEvent.preventDefault(); 1.68 + } 1.69 + window.addEventListener("MozMousePixelScroll", handler, true); 1.70 + 1.71 + synthesizeWheel(gScrollableElement, 10, 10, 1.72 + { deltaMode: WheelEvent.DOM_DELTA_LINE, 1.73 + deltaY: 1.0, lineOrPageDeltaY: 1 }); 1.74 + gLineHeight = result; 1.75 + ok(gLineHeight > 10 && gLineHeight < 25, "prepareScrollUnits: gLineHeight may be illegal value, got " + gLineHeight); 1.76 + 1.77 + result = -1; 1.78 + synthesizeWheel(gScrollableElement, 10, 10, 1.79 + { deltaMode: WheelEvent.DOM_DELTA_LINE, 1.80 + deltaX: 1.0, lineOrPageDeltaX: 1 }); 1.81 + gHorizontalLine = result; 1.82 + ok(gHorizontalLine > 5 && gHorizontalLine < 16, "prepareScrollUnits: gHorizontalLine may be illegal value, got " + gHorizontalLine); 1.83 + 1.84 + result = -1; 1.85 + synthesizeWheel(gScrollableElement, 10, 10, 1.86 + { deltaMode: WheelEvent.DOM_DELTA_PAGE, 1.87 + deltaY: 1.0, lineOrPageDeltaY: 1 }); 1.88 + gPageHeight = result; 1.89 + // XXX Cannot we know the actual scroll port size? 1.90 + ok(gPageHeight >= 150 && gPageHeight <= 200, 1.91 + "prepareScrollUnits: gPageHeight is strange value, got " + gPageHeight); 1.92 + 1.93 + result = -1; 1.94 + synthesizeWheel(gScrollableElement, 10, 10, 1.95 + { deltaMode: WheelEvent.DOM_DELTA_PAGE, 1.96 + deltaX: 1.0, lineOrPageDeltaX: 1 }); 1.97 + gPageWidth = result; 1.98 + ok(gPageWidth >= 150 && gPageWidth <= 200, 1.99 + "prepareScrollUnits: gPageWidth is strange value, got " + gPageWidth); 1.100 + 1.101 + window.removeEventListener("MozMousePixelScroll", handler, true); 1.102 +} 1.103 + 1.104 +function testMakingUntrustedEvent() 1.105 +{ 1.106 + const kCreateEventArgs = [ 1.107 + "WheelEvent", "wheelevent", "wheelEvent", "Wheelevent" 1.108 + ]; 1.109 + 1.110 + for (var i = 0; i < kCreateEventArgs.length; i++) { 1.111 + try { 1.112 + // We never support WheelEvent construction with document.createEvent(). 1.113 + var event = document.createEvent(kCreateEventArgs[i]); 1.114 + ok(false, "document.createEvent(" + kCreateEventArgs[i] + ") should throw an error"); 1.115 + } catch (e) { 1.116 + ok(true, "document.createEvent(" + kCreateEventArgs[i] + ") threw an error"); 1.117 + } 1.118 + } 1.119 + 1.120 + var wheelEvent = new WheelEvent("wheel"); 1.121 + ok(wheelEvent instanceof WheelEvent, 1.122 + "new WheelEvent() should create an instance of WheelEvent"); 1.123 + ok(typeof(wheelEvent.initWheelEvent) != "function", 1.124 + "WheelEvent must not have initWheelEvent()"); 1.125 +} 1.126 + 1.127 +// delta_multiplier prefs should cause changing delta values of trusted events only. 1.128 +// And also legacy events' detail value should be changed too. 1.129 +function testDeltaMultiplierPrefs() 1.130 +{ 1.131 + const kModifierAlt = 0x01; 1.132 + const kModifierControl = 0x02; 1.133 + const kModifierMeta = 0x04; 1.134 + const kModifierShift = 0x08; 1.135 + const kModifierWin = 0x10; 1.136 + 1.137 + const kTests = [ 1.138 + { name: "default", 1.139 + expected: [ 0, kModifierShift | kModifierAlt, kModifierShift | kModifierControl, 1.140 + kModifierShift | kModifierMeta, kModifierShift | kModifierWin, 1.141 + kModifierControl | kModifierAlt, kModifierMeta | kModifierAlt ], 1.142 + unexpected: [ kModifierAlt, kModifierControl, kModifierMeta, kModifierShift, kModifierWin ] }, 1.143 + { name: "with_alt", 1.144 + expected: [ kModifierAlt ], 1.145 + unexpected: [0, kModifierControl, kModifierMeta, kModifierShift, kModifierWin, 1.146 + kModifierShift | kModifierAlt, kModifierControl | kModifierAlt, 1.147 + kModifierMeta | kModifierAlt ] }, 1.148 + { name: "with_control", 1.149 + expected: [ kModifierControl ], 1.150 + unexpected: [0, kModifierAlt, kModifierMeta, kModifierShift, kModifierWin, 1.151 + kModifierShift | kModifierControl, kModifierControl | kModifierAlt, 1.152 + kModifierMeta | kModifierControl ] }, 1.153 + { name: "with_meta", 1.154 + expected: [ kModifierMeta ], 1.155 + unexpected: [0, kModifierAlt, kModifierControl, kModifierShift, kModifierWin, 1.156 + kModifierShift | kModifierMeta, kModifierControl | kModifierMeta, 1.157 + kModifierMeta | kModifierAlt ] }, 1.158 + { name: "with_shift", 1.159 + expected: [ kModifierShift ], 1.160 + unexpected: [0, kModifierAlt, kModifierControl, kModifierMeta, kModifierWin, 1.161 + kModifierShift | kModifierAlt, kModifierControl | kModifierShift, 1.162 + kModifierMeta | kModifierShift ] }, 1.163 + { name: "with_win", 1.164 + expected: [ kModifierWin ], 1.165 + unexpected: [0, kModifierAlt, kModifierControl, kModifierMeta, kModifierShift, 1.166 + kModifierShift | kModifierWin ] }, 1.167 + ]; 1.168 + 1.169 + // Note that this test doesn't support complicated lineOrPageDelta values which are computed with 1.170 + // accumulated delta values by the prefs. If you need to test the lineOrPageDelta accumulation, 1.171 + // use test_continuous_dom_wheel_event.html. 1.172 + const kEvents = [ 1.173 + { deltaMode: WheelEvent.DOM_DELTA_PIXEL, 1.174 + deltaX: gHorizontalLine, deltaY: gLineHeight, deltaZ: gLineHeight, lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 }, 1.175 + { deltaMode: WheelEvent.DOM_DELTA_LINE, 1.176 + deltaX: 1.0, deltaY: 1.0, deltaZ: 1.0, lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 }, 1.177 + { deltaMode: WheelEvent.DOM_DELTA_PAGE, 1.178 + deltaX: 1.0, deltaY: 1.0, deltaZ: 1.0, lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 }, 1.179 + { deltaMode: WheelEvent.DOM_DELTA_PIXEL, 1.180 + deltaX: -gHorizontalLine, deltaY: -gLineHeight, deltaZ: -gLineHeight, lineOrPageDeltaX: -1, lineOrPageDeltaY: -1 }, 1.181 + { deltaMode: WheelEvent.DOM_DELTA_LINE, 1.182 + deltaX: -1.0, deltaY: -1.0, deltaZ: -1.0, lineOrPageDeltaX: -1, lineOrPageDeltaY: -1 }, 1.183 + { deltaMode: WheelEvent.DOM_DELTA_PAGE, 1.184 + deltaX: -1.0, deltaY: -1.0, deltaZ: -1.0, lineOrPageDeltaX: -1, lineOrPageDeltaY: -1 }, 1.185 + ]; 1.186 + 1.187 + const kDeltaMultiplierPrefs = [ 1.188 + "delta_multiplier_x", "delta_multiplier_y", "delta_multiplier_z" 1.189 + ]; 1.190 + 1.191 + const kPrefValues = [ 1.192 + 200, 50, 0, -50, -150 1.193 + ]; 1.194 + 1.195 + var currentTest, currentModifiers, currentEvent, currentPref, currentMultiplier, testingExpected; 1.196 + var description; 1.197 + var calledHandlers = { wheel: false, 1.198 + DOMMouseScroll: { horizontal: false, vertical: false }, 1.199 + MozMousePixelScroll: { horizontal: false, vertical: false } }; 1.200 + 1.201 + function wheelEventHandler(aEvent) { 1.202 + calledHandlers.wheel = true; 1.203 + 1.204 + var expectedDeltaX = currentEvent.deltaX; 1.205 + var expectedDeltaY = currentEvent.deltaY; 1.206 + var expectedDeltaZ = currentEvent.deltaZ; 1.207 + 1.208 + if (testingExpected) { 1.209 + switch (currentPref.charAt(currentPref.length - 1)) { 1.210 + case "x": 1.211 + expectedDeltaX *= currentMultiplier; 1.212 + break; 1.213 + case "y": 1.214 + expectedDeltaY *= currentMultiplier; 1.215 + break; 1.216 + case "z": 1.217 + expectedDeltaZ *= currentMultiplier; 1.218 + break; 1.219 + } 1.220 + } 1.221 + is(aEvent.deltaX, expectedDeltaX, description + "deltaX (" + currentEvent.deltaX + ") was invaild"); 1.222 + is(aEvent.deltaY, expectedDeltaY, description + "deltaY (" + currentEvent.deltaY + ") was invaild"); 1.223 + is(aEvent.deltaZ, expectedDeltaZ, description + "deltaZ (" + currentEvent.deltaZ + ") was invaild"); 1.224 + } 1.225 + 1.226 + function legacyEventHandler(aEvent) { 1.227 + var isHorizontal = (aEvent.axis == MouseScrollEvent.HORIZONTAL_AXIS); 1.228 + var isScrollEvent = (aEvent.type == "DOMMouseScroll"); 1.229 + if (isScrollEvent) { 1.230 + if (isHorizontal) { 1.231 + calledHandlers.DOMMouseScroll.horizontal = true; 1.232 + } else { 1.233 + calledHandlers.DOMMouseScroll.vertical = true; 1.234 + } 1.235 + } else { 1.236 + if (isHorizontal) { 1.237 + calledHandlers.MozMousePixelScroll.horizontal = true; 1.238 + } else { 1.239 + calledHandlers.MozMousePixelScroll.vertical = true; 1.240 + } 1.241 + } 1.242 + var eventName = (isHorizontal ? "Horizontal " : "Vertical ") + aEvent.type + " "; 1.243 + var expectedDetail; 1.244 + if (isScrollEvent) { 1.245 + expectedDetail = isHorizontal ? currentEvent.lineOrPageDeltaX : currentEvent.lineOrPageDeltaY; 1.246 + if (currentEvent.deltaMode == WheelEvent.DOM_DELTA_PAGE && expectedDetail) { 1.247 + expectedDetail = ((expectedDetail > 0) ? UIEvent.SCROLL_PAGE_DOWN : UIEvent.SCROLL_PAGE_UP); 1.248 + } 1.249 + } else { 1.250 + expectedDetail = isHorizontal ? currentEvent.deltaX : currentEvent.deltaY; 1.251 + if (expectedDetail) { 1.252 + if (currentEvent.deltaMode == WheelEvent.DOM_DELTA_LINE) { 1.253 + expectedDetail *= (isHorizontal ? gHorizontalLine : gLineHeight); 1.254 + } else if (currentEvent.deltaMode == WheelEvent.DOM_DELTA_PAGE) { 1.255 + if (expectedDetail > 0) { 1.256 + expectedDetail = (isHorizontal ? gPageWidth : gPageHeight); 1.257 + } else { 1.258 + expectedDetail = (isHorizontal ? -gPageWidth : -gPageHeight); 1.259 + } 1.260 + } 1.261 + } 1.262 + } 1.263 + if (testingExpected) { 1.264 + if ((isHorizontal && currentPref.charAt(currentPref.length - 1) == "x") || 1.265 + (!isHorizontal && currentPref.charAt(currentPref.length - 1) == "y")) { 1.266 + // If it's a page scroll event, the detail value is UIEvent.SCROLL_PAGE_DOWN or 1.267 + // UIEvent.SCROLL_PAGE_UP. If the delta value sign is reverted, we need to 1.268 + // revert the expected detail value too. Otherwise, don't touch it. 1.269 + if (isScrollEvent && currentEvent.deltaMode == WheelEvent.DOM_DELTA_PAGE) { 1.270 + if (currentMultiplier < 0) { 1.271 + expectedDetail = ((expectedDetail == UIEvent.SCROLL_PAGE_UP) ? UIEvent.SCROLL_PAGE_DOWN : UIEvent.SCROLL_PAGE_UP); 1.272 + } 1.273 + } else { 1.274 + expectedDetail *= currentMultiplier; 1.275 + expectedDetail = expectedDetail < 0 ? Math.ceil(expectedDetail) : Math.floor(expectedDetail); 1.276 + } 1.277 + } 1.278 + } 1.279 + is(aEvent.detail, expectedDetail, description + eventName + "detail was invalid"); 1.280 + 1.281 + aEvent.preventDefault(); 1.282 + } 1.283 + 1.284 + window.addEventListener("wheel", wheelEventHandler, true); 1.285 + window.addEventListener("DOMMouseScroll", legacyEventHandler, true); 1.286 + window.addEventListener("MozMousePixelScroll", legacyEventHandler, true); 1.287 + 1.288 + function dispatchEvent(aIsExpected) { 1.289 + for (var i = 0; i < kEvents.length; i++) { 1.290 + currentEvent = kEvents[i]; 1.291 + currentEvent.shiftKey = (currentModifiers & kModifierShift) != 0; 1.292 + currentEvent.ctrlKey = (currentModifiers & kModifierControl) != 0; 1.293 + currentEvent.altKey = (currentModifiers & kModifierAlt) != 0; 1.294 + currentEvent.metaKey = (currentModifiers & kModifierMeta) != 0; 1.295 + currentEvent.osKey = (currentModifiers & kModifierWin) != 0; 1.296 + var modifierList = ""; 1.297 + if (currentEvent.shiftKey) { 1.298 + modifierList += "Shift "; 1.299 + } 1.300 + if (currentEvent.ctrlKey) { 1.301 + modifierList += "Control "; 1.302 + } 1.303 + if (currentEvent.altKey) { 1.304 + modifierList += "Alt "; 1.305 + } 1.306 + if (currentEvent.metaKey) { 1.307 + modifierList += "Meta "; 1.308 + } 1.309 + if (currentEvent.osKey) { 1.310 + modifierList += "Win "; 1.311 + } 1.312 + 1.313 + for (var j = 0; j < kPrefValues.length; j++) { 1.314 + currentMultiplier = kPrefValues[j] / 100; 1.315 + for (var k = 0; k < kDeltaMultiplierPrefs.length; k++) { 1.316 + currentPref = "mousewheel." + currentTest.name + "." + kDeltaMultiplierPrefs[k]; 1.317 + 1.318 + SpecialPowers.setIntPref(currentPref, kPrefValues[j]); 1.319 + 1.320 + gScrollableElement.scrollTop = gScrollableElement.scrollBottom = 1000; 1.321 + 1.322 + // trusted event's delta valuses should be reverted by the pref. 1.323 + testingExpected = aIsExpected; 1.324 + 1.325 + description = "testDeltaMultiplierPrefs, pref: " + currentPref + "=" + kPrefValues[j] + 1.326 + ", deltaMode: " + currentEvent.deltaMode + ", modifiers: \"" + modifierList + "\", (trusted event): "; 1.327 + synthesizeWheel(gScrollableElement, 10, 10, currentEvent); 1.328 + 1.329 + var expectedProps = { 1.330 + deltaX: currentEvent.deltaX * currentMultiplier, 1.331 + deltaY: currentEvent.deltaY * currentMultiplier, 1.332 + dletaZ: currentEvent.deltaZ * currentMultiplier, 1.333 + lineOrPageDeltaX: currentEvent.lineOrPageDeltaX * currentMultiplier, 1.334 + lineOrPageDeltaY: currentEvent.lineOrPageDeltaY * currentMultiplier, 1.335 + }; 1.336 + 1.337 + is(calledHandlers.wheel, 1.338 + expectedProps.deltaX != 0 || expectedProps.deltaY != 0 || expectedProps.deltaZ != 0, 1.339 + description + "wheel event was (not) fired"); 1.340 + is(calledHandlers.DOMMouseScroll.horizontal, 1.341 + expectedProps.lineOrPageDeltaX >= 1 || expectedProps.lineOrPageDeltaX <= -1, 1.342 + description + "Horizontal DOMMouseScroll event was (not) fired"); 1.343 + is(calledHandlers.DOMMouseScroll.vertical, 1.344 + expectedProps.lineOrPageDeltaY >= 1 || expectedProps.lineOrPageDeltaY <= -1, 1.345 + description + "Vertical DOMMouseScroll event was (not) fired"); 1.346 + is(calledHandlers.MozMousePixelScroll.horizontal, 1.347 + expectedProps.deltaY >= 1 || expectedProps.deltaY <= -1, 1.348 + description + "Horizontal MozMousePixelScroll event was (not) fired"); 1.349 + is(calledHandlers.MozMousePixelScroll.vertical, 1.350 + expectedProps.deltaY >= 1 || expectedProps.deltaY <= -1, 1.351 + description + "Vertical MozMousePixelScroll event was (not) fired"); 1.352 + 1.353 + calledHandlers = { wheel: false, 1.354 + DOMMouseScroll: { horizontal: false, vertical: false }, 1.355 + MozMousePixelScroll: { horizontal: false, vertical: false } }; 1.356 + 1.357 + // untrusted event's delta values shouldn't be reverted by the pref. 1.358 + testingExpected = false; 1.359 + var props = { 1.360 + bubbles: true, 1.361 + cancelable: true, 1.362 + shiftKey: currentEvent.shiftKey, 1.363 + ctrlKey: currentEvent.ctrlKey, 1.364 + altKey: currentEvent.altKey, 1.365 + metaKey: currentEvent.metaKey, 1.366 + deltaX: currentEvent.deltaX, 1.367 + deltaY: currentEvent.deltaY, 1.368 + deltaZ: currentEvent.deltaZ, 1.369 + deltaMode: currentEvent.deltaMode, 1.370 + }; 1.371 + var untrustedEvent = new WheelEvent("wheel", props); 1.372 + 1.373 + description = "testDeltaMultiplierPrefs, pref: " + currentPref + "=" + kPrefValues[j] + 1.374 + ", deltaMode: " + currentEvent.deltaMode + ", modifiers: \"" + modifierList + "\", (untrusted event): "; 1.375 + gScrollableElement.dispatchEvent(untrustedEvent); 1.376 + 1.377 + ok(calledHandlers.wheel, description + "wheel event was not fired for untrusted event"); 1.378 + ok(!calledHandlers.DOMMouseScroll.horizontal, 1.379 + description + "Horizontal DOMMouseScroll event was fired for untrusted event"); 1.380 + ok(!calledHandlers.DOMMouseScroll.vertical, 1.381 + description + "Vertical DOMMouseScroll event was fired for untrusted event"); 1.382 + ok(!calledHandlers.MozMousePixelScroll.horizontal, 1.383 + description + "Horizontal MozMousePixelScroll event was fired for untrusted event"); 1.384 + ok(!calledHandlers.MozMousePixelScroll.vertical, 1.385 + description + "Vertical MozMousePixelScroll event was fired for untrusted event"); 1.386 + 1.387 + SpecialPowers.setIntPref(currentPref, 100); 1.388 + 1.389 + calledHandlers = { wheel: false, 1.390 + DOMMouseScroll: { horizontal: false, vertical: false }, 1.391 + MozMousePixelScroll: { horizontal: false, vertical: false } }; 1.392 + 1.393 + } 1.394 + // We should skip other value tests if testing with modifier key. 1.395 + // If we didn't do so, it would test too many times, but we don't need to do so. 1.396 + if (kTests.name != "default") { 1.397 + break; 1.398 + } 1.399 + } 1.400 + } 1.401 + } 1.402 + 1.403 + for (var i = 0; i < kTests.length; i++) { 1.404 + currentTest = kTests[i]; 1.405 + for (var j = 0; j < currentTest.expected.length; j++) { 1.406 + currentModifiers = currentTest.expected[j]; 1.407 + dispatchEvent(true); 1.408 + } 1.409 + for (var k = 0; k < currentTest.unexpected.length; k++) { 1.410 + currentModifiers = currentTest.unexpected[k]; 1.411 + dispatchEvent(false); 1.412 + } 1.413 + } 1.414 + 1.415 + window.removeEventListener("wheel", wheelEventHandler, true); 1.416 + window.removeEventListener("DOMMouseScroll", legacyEventHandler, true); 1.417 + window.removeEventListener("MozMousePixelScroll", legacyEventHandler, true); 1.418 +} 1.419 + 1.420 +// Untrusted wheel events shouldn't cause legacy mouse scroll events. 1.421 +function testDispatchingUntrustEvent() 1.422 +{ 1.423 + var descriptionBase = "testDispatchingUntrustEvent, "; 1.424 + var description, wheelEventFired; 1.425 + function wheelEventHandler(aEvent) 1.426 + { 1.427 + wheelEventFired = true; 1.428 + } 1.429 + 1.430 + function legacyEventHandler(aEvent) 1.431 + { 1.432 + ok(false, aEvent.type + " must not be fired"); 1.433 + } 1.434 + 1.435 + window.addEventListener("wheel", wheelEventHandler, true); 1.436 + window.addEventListener("DOMMouseScroll", legacyEventHandler, true); 1.437 + window.addEventListener("MozMousePixelScroll", legacyEventHandler, true); 1.438 + 1.439 + description = descriptionBase + "dispatching a pixel wheel event: "; 1.440 + wheelEventFired = false; 1.441 + var untrustedPixelEvent = new WheelEvent("wheel", { 1.442 + bubbles: true, cancelable: true, 1.443 + deltaX: 24.0, deltaY: 24.0, 1.444 + deltaMode: WheelEvent.DOM_DELTA_PIXEL, 1.445 + }); 1.446 + gScrolledElement.dispatchEvent(untrustedPixelEvent); 1.447 + ok(wheelEventFired, description + "wheel event wasn't fired"); 1.448 + 1.449 + description = descriptionBase + "dispatching a line wheel event: "; 1.450 + wheelEventFired = false; 1.451 + var untrustedLineEvent = new WheelEvent("wheel", { 1.452 + bubbles: true, cancelable: true, 1.453 + deltaX: 3.0, deltaY: 3.0, 1.454 + deltaMode: WheelEvent.DOM_DELTA_LINE, 1.455 + }); 1.456 + gScrolledElement.dispatchEvent(untrustedLineEvent); 1.457 + ok(wheelEventFired, description + "wheel event wasn't fired"); 1.458 + 1.459 + description = descriptionBase + "dispatching a page wheel event: "; 1.460 + wheelEventFired = false; 1.461 + var untrustedPageEvent = new WheelEvent("wheel", { 1.462 + bubbles: true, cancelable: true, 1.463 + deltaX: 1.0, deltaY: 1.0, 1.464 + deltaMode: WheelEvent.DOM_DELTA_PAGE, 1.465 + }); 1.466 + gScrolledElement.dispatchEvent(untrustedPageEvent); 1.467 + ok(wheelEventFired, description + "wheel event wasn't fired"); 1.468 + 1.469 + window.removeEventListener("wheel", wheelEventHandler, true); 1.470 + window.removeEventListener("DOMMouseScroll", legacyEventHandler, true); 1.471 + window.removeEventListener("MozMousePixelScroll", legacyEventHandler, true); 1.472 +} 1.473 + 1.474 +function testEventOrder() 1.475 +{ 1.476 + const kWheelEvent = 0x0001; 1.477 + const kDOMMouseScrollEvent = 0x0002; 1.478 + const kMozMousePixelScrollEvent = 0x0004; 1.479 + const kVerticalScrollEvent = 0x0010; 1.480 + const kHorizontalScrollEvent = 0x0020; 1.481 + const kInSystemGroup = 0x0100; 1.482 + const kDefaultPrevented = 0x1000; 1.483 + 1.484 + var currentTest; 1.485 + 1.486 + const kTests = [ 1.487 + { 1.488 + description: "Testing the order of the events without preventDefault()", 1.489 + expectedEvents: [ kWheelEvent, 1.490 + kDOMMouseScrollEvent | kVerticalScrollEvent, 1.491 + kDOMMouseScrollEvent | kVerticalScrollEvent | kInSystemGroup, 1.492 + kMozMousePixelScrollEvent | kVerticalScrollEvent, 1.493 + kMozMousePixelScrollEvent | kVerticalScrollEvent | kInSystemGroup, 1.494 + kDOMMouseScrollEvent | kHorizontalScrollEvent, 1.495 + kDOMMouseScrollEvent | kHorizontalScrollEvent | kInSystemGroup, 1.496 + kMozMousePixelScrollEvent | kHorizontalScrollEvent, 1.497 + kMozMousePixelScrollEvent | kHorizontalScrollEvent | kInSystemGroup, 1.498 + kWheelEvent | kInSystemGroup], 1.499 + resultEvents: [], 1.500 + doPreventDefaultAt: 0, 1.501 + }, 1.502 + { 1.503 + description: "Testing the order of the events, calling preventDefault() at default group wheel event", 1.504 + expectedEvents: [ kWheelEvent, 1.505 + kWheelEvent | kInSystemGroup | kDefaultPrevented], 1.506 + resultEvents: [], 1.507 + doPreventDefaultAt: kWheelEvent, 1.508 + }, 1.509 + { 1.510 + description: "Testing the order of the events, calling preventDefault() at default group DOMMouseScroll event", 1.511 + expectedEvents: [ kWheelEvent, 1.512 + kDOMMouseScrollEvent | kVerticalScrollEvent, 1.513 + kDOMMouseScrollEvent | kVerticalScrollEvent | kInSystemGroup | kDefaultPrevented, 1.514 + kMozMousePixelScrollEvent | kVerticalScrollEvent | kDefaultPrevented, 1.515 + kMozMousePixelScrollEvent | kVerticalScrollEvent | kInSystemGroup | kDefaultPrevented, 1.516 + kDOMMouseScrollEvent | kHorizontalScrollEvent, 1.517 + kDOMMouseScrollEvent | kHorizontalScrollEvent | kInSystemGroup, 1.518 + kMozMousePixelScrollEvent | kHorizontalScrollEvent, 1.519 + kMozMousePixelScrollEvent | kHorizontalScrollEvent | kInSystemGroup, 1.520 + kWheelEvent | kInSystemGroup | kDefaultPrevented], 1.521 + resultEvents: [], 1.522 + doPreventDefaultAt: kDOMMouseScrollEvent | kVerticalScrollEvent, 1.523 + }, 1.524 + { 1.525 + description: "Testing the order of the events, calling preventDefault() at default group MozMousePixelScroll event", 1.526 + expectedEvents: [ kWheelEvent, 1.527 + kDOMMouseScrollEvent | kVerticalScrollEvent, 1.528 + kDOMMouseScrollEvent | kVerticalScrollEvent | kInSystemGroup, 1.529 + kMozMousePixelScrollEvent | kVerticalScrollEvent, 1.530 + kMozMousePixelScrollEvent | kVerticalScrollEvent | kInSystemGroup | kDefaultPrevented, 1.531 + kDOMMouseScrollEvent | kHorizontalScrollEvent, 1.532 + kDOMMouseScrollEvent | kHorizontalScrollEvent | kInSystemGroup, 1.533 + kMozMousePixelScrollEvent | kHorizontalScrollEvent, 1.534 + kMozMousePixelScrollEvent | kHorizontalScrollEvent | kInSystemGroup, 1.535 + kWheelEvent | kInSystemGroup | kDefaultPrevented], 1.536 + resultEvents: [], 1.537 + doPreventDefaultAt: kMozMousePixelScrollEvent | kVerticalScrollEvent, 1.538 + }, 1.539 + { 1.540 + description: "Testing the order of the events, calling preventDefault() at system group DOMMouseScroll event", 1.541 + expectedEvents: [ kWheelEvent, 1.542 + kDOMMouseScrollEvent | kVerticalScrollEvent, 1.543 + kDOMMouseScrollEvent | kVerticalScrollEvent | kInSystemGroup, 1.544 + kMozMousePixelScrollEvent | kVerticalScrollEvent | kDefaultPrevented, 1.545 + kMozMousePixelScrollEvent | kVerticalScrollEvent | kInSystemGroup | kDefaultPrevented, 1.546 + kDOMMouseScrollEvent | kHorizontalScrollEvent, 1.547 + kDOMMouseScrollEvent | kHorizontalScrollEvent | kInSystemGroup, 1.548 + kMozMousePixelScrollEvent | kHorizontalScrollEvent, 1.549 + kMozMousePixelScrollEvent | kHorizontalScrollEvent | kInSystemGroup, 1.550 + kWheelEvent | kInSystemGroup | kDefaultPrevented], 1.551 + resultEvents: [], 1.552 + doPreventDefaultAt: kDOMMouseScrollEvent | kVerticalScrollEvent | kInSystemGroup, 1.553 + }, 1.554 + { 1.555 + description: "Testing the order of the events, calling preventDefault() at system group MozMousePixelScroll event", 1.556 + expectedEvents: [ kWheelEvent, 1.557 + kDOMMouseScrollEvent | kVerticalScrollEvent, 1.558 + kDOMMouseScrollEvent | kVerticalScrollEvent | kInSystemGroup, 1.559 + kMozMousePixelScrollEvent | kVerticalScrollEvent, 1.560 + kMozMousePixelScrollEvent | kVerticalScrollEvent | kInSystemGroup, 1.561 + kDOMMouseScrollEvent | kHorizontalScrollEvent, 1.562 + kDOMMouseScrollEvent | kHorizontalScrollEvent | kInSystemGroup, 1.563 + kMozMousePixelScrollEvent | kHorizontalScrollEvent, 1.564 + kMozMousePixelScrollEvent | kHorizontalScrollEvent | kInSystemGroup, 1.565 + kWheelEvent | kInSystemGroup | kDefaultPrevented], 1.566 + resultEvents: [], 1.567 + doPreventDefaultAt: kMozMousePixelScrollEvent | kVerticalScrollEvent | kInSystemGroup, 1.568 + }, 1.569 + ]; 1.570 + 1.571 + function getEventDescription(aEvent) 1.572 + { 1.573 + var result = ""; 1.574 + if (aEvent & kWheelEvent) { 1.575 + result = "wheel" 1.576 + } else { 1.577 + if (aEvent & kDOMMouseScrollEvent) { 1.578 + result = "DOMMouseScroll"; 1.579 + } else if (aEvent & kMozMousePixelScrollEvent) { 1.580 + result = "MozMousePixelScroll"; 1.581 + } 1.582 + if (aEvent & kVerticalScrollEvent) { 1.583 + result += ", vertical"; 1.584 + } else { 1.585 + result += ", horizontal"; 1.586 + } 1.587 + } 1.588 + if (aEvent & kInSystemGroup) { 1.589 + result += ", system group"; 1.590 + } 1.591 + if (aEvent & kDefaultPrevented) { 1.592 + result += ", defaultPrevented"; 1.593 + } 1.594 + return result; 1.595 + } 1.596 + 1.597 + function pushEvent(aEvent, aIsSystemGroup) 1.598 + { 1.599 + var event = 0; 1.600 + if (aEvent.type == "wheel") { 1.601 + event = kWheelEvent; 1.602 + } else { 1.603 + if (aEvent.type == "DOMMouseScroll") { 1.604 + event = kDOMMouseScrollEvent; 1.605 + } else if (aEvent.type == "MozMousePixelScroll") { 1.606 + event = kMozMousePixelScrollEvent; 1.607 + } 1.608 + if (aEvent.axis == MouseScrollEvent.HORIZONTAL_AXIS) { 1.609 + event |= kHorizontalScrollEvent; 1.610 + } else { 1.611 + event |= kVerticalScrollEvent; 1.612 + } 1.613 + } 1.614 + if (aIsSystemGroup) { 1.615 + event |= kInSystemGroup; 1.616 + } 1.617 + if (aEvent.defaultPrevented) { 1.618 + event |= kDefaultPrevented; 1.619 + } 1.620 + currentTest.resultEvents.push(event); 1.621 + return event; 1.622 + } 1.623 + 1.624 + function handler(aEvent) 1.625 + { 1.626 + if (pushEvent(aEvent, false) == currentTest.doPreventDefaultAt) { 1.627 + aEvent.preventDefault(); 1.628 + } 1.629 + } 1.630 + 1.631 + function systemHandler(aEvent) 1.632 + { 1.633 + if (pushEvent(aEvent, true) == currentTest.doPreventDefaultAt) { 1.634 + aEvent.preventDefault(); 1.635 + } 1.636 + } 1.637 + 1.638 + window.addEventListener("wheel", handler, true); 1.639 + window.addEventListener("DOMMouseScroll", handler, true); 1.640 + window.addEventListener("MozMousePixelScroll", handler, true); 1.641 + 1.642 + SpecialPowers.addSystemEventListener(window, "wheel", systemHandler, true); 1.643 + SpecialPowers.addSystemEventListener(window, "DOMMouseScroll", systemHandler, true); 1.644 + SpecialPowers.addSystemEventListener(window, "MozMousePixelScroll", systemHandler, true); 1.645 + 1.646 + for (var i = 0; i < kTests.length; i++) { 1.647 + currentTest = kTests[i]; 1.648 + synthesizeWheel(gScrollableElement, 10, 10, 1.649 + { deltaMode: WheelEvent.DOM_DELTA_LINE, deltaX: 1.0, deltaY: 1.0 }); 1.650 + 1.651 + for (var j = 0; j < currentTest.expectedEvents.length; j++) { 1.652 + if (currentTest.resultEvents.length == j) { 1.653 + ok(false, currentTest.description + ": " + 1.654 + getEventDescription(currentTest.expectedEvents[j]) + " wasn't fired"); 1.655 + break; 1.656 + } 1.657 + is(getEventDescription(currentTest.resultEvents[j]), 1.658 + getEventDescription(currentTest.expectedEvents[j]), 1.659 + currentTest.description + ": " + (j + 1) + "th event is mismatched"); 1.660 + } 1.661 + if (currentTest.expectedEvents.length < currentTest.resultEvents.length) { 1.662 + ok(false, currentTest.description + ": " + 1.663 + getEventDescription(currentTest.resultEvents[currentTest.expectedEvents.length]) + 1.664 + " was fired unexpectedly"); 1.665 + } 1.666 + } 1.667 + 1.668 + window.removeEventListener("wheel", handler, true); 1.669 + window.removeEventListener("DOMMouseScroll", handler, true); 1.670 + window.removeEventListener("MozMousePixelScroll", handler, true); 1.671 + 1.672 + SpecialPowers.removeSystemEventListener(window, "wheel", systemHandler, true); 1.673 + SpecialPowers.removeSystemEventListener(window, "DOMMouseScroll", systemHandler, true); 1.674 + SpecialPowers.removeSystemEventListener(window, "MozMousePixelScroll", systemHandler, true); 1.675 +} 1.676 + 1.677 +var gOnWheelAttrHandled = new Array; 1.678 + 1.679 +function testOnWheelAttr() 1.680 +{ 1.681 + document.documentElement.setAttribute("onwheel", "gOnWheelAttrHandled['html'] = true;"); 1.682 + document.body.setAttribute("onwheel", "gOnWheelAttrHandled['body'] = true;"); 1.683 + gScrollableElement.setAttribute("onwheel", "gOnWheelAttrHandled['div'] = true;"); 1.684 + var target = document.getElementById("onwheel"); 1.685 + synthesizeWheel(gScrollableElement, 10, 10, 1.686 + { deltaMode: WheelEvent.DOM_DELTA_LINE, 1.687 + deltaX: 1.0, deltaY: 2.0 }); 1.688 + ok(gOnWheelAttrHandled['html'], "html element's onwheel attribute isn't performed"); 1.689 + ok(gOnWheelAttrHandled['body'], "body element's onwheel attribute isn't performed"); 1.690 + ok(gOnWheelAttrHandled['div'], "div element's onwheel attribute isn't performed"); 1.691 +} 1.692 + 1.693 +var gOnWheelPropHandled = new Array; 1.694 + 1.695 +function testOnWheelProperty() 1.696 +{ 1.697 + window.onwheel = function (e) { gOnWheelPropHandled["window"] = true; } 1.698 + document.onwheel = function (e) { gOnWheelPropHandled["document"] = true; } 1.699 + document.documentElement.onwheel = function (e) { gOnWheelPropHandled["html"] = true; }; 1.700 + document.body.onwheel = function (e) { gOnWheelPropHandled["body"] = true; }; 1.701 + gScrollableElement.onwheel = function (e) { gOnWheelPropHandled["div"] = true; }; 1.702 + var target = document.getElementById("onwheel"); 1.703 + synthesizeWheel(gScrollableElement, 10, 10, 1.704 + { deltaMode: WheelEvent.DOM_DELTA_LINE, 1.705 + deltaX: 1.0, deltaY: 2.0 }); 1.706 + ok(gOnWheelPropHandled['window'], "window's onwheel property isn't performed"); 1.707 + ok(gOnWheelPropHandled['document'], "document's onwheel property isn't performed"); 1.708 + ok(gOnWheelPropHandled['html'], "html element's onwheel property isn't performed"); 1.709 + ok(gOnWheelPropHandled['body'], "body element's onwheel property isn't performed"); 1.710 + ok(gOnWheelPropHandled['div'], "div element's onwheel property isn't performed"); 1.711 +} 1.712 + 1.713 +function runTests() 1.714 +{ 1.715 + SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_x", 100); 1.716 + SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_y", 100); 1.717 + SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_z", 100); 1.718 + SpecialPowers.setIntPref("mousewheel.with_alt.delta_multiplier_x", 100); 1.719 + SpecialPowers.setIntPref("mousewheel.with_alt.delta_multiplier_y", 100); 1.720 + SpecialPowers.setIntPref("mousewheel.with_alt.delta_multiplier_z", 100); 1.721 + SpecialPowers.setIntPref("mousewheel.with_control.delta_multiplier_x", 100); 1.722 + SpecialPowers.setIntPref("mousewheel.with_control.delta_multiplier_y", 100); 1.723 + SpecialPowers.setIntPref("mousewheel.with_control.delta_multiplier_z", 100); 1.724 + SpecialPowers.setIntPref("mousewheel.with_meta.delta_multiplier_x", 100); 1.725 + SpecialPowers.setIntPref("mousewheel.with_meta.delta_multiplier_y", 100); 1.726 + SpecialPowers.setIntPref("mousewheel.with_meta.delta_multiplier_z", 100); 1.727 + SpecialPowers.setIntPref("mousewheel.with_shift.delta_multiplier_x", 100); 1.728 + SpecialPowers.setIntPref("mousewheel.with_shift.delta_multiplier_y", 100); 1.729 + SpecialPowers.setIntPref("mousewheel.with_shift.delta_multiplier_z", 100); 1.730 + SpecialPowers.setIntPref("mousewheel.with_win.delta_multiplier_x", 100); 1.731 + SpecialPowers.setIntPref("mousewheel.with_win.delta_multiplier_y", 100); 1.732 + SpecialPowers.setIntPref("mousewheel.with_win.delta_multiplier_z", 100); 1.733 + 1.734 + prepareScrollUnits(); 1.735 + testMakingUntrustedEvent(); 1.736 + testDeltaMultiplierPrefs(); 1.737 + testDispatchingUntrustEvent(); 1.738 + testEventOrder(); 1.739 + testOnWheelAttr(); 1.740 + testOnWheelProperty(); 1.741 + 1.742 + SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_x"); 1.743 + SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_y"); 1.744 + SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_z"); 1.745 + SpecialPowers.clearUserPref("mousewheel.with_alt.delta_multiplier_x"); 1.746 + SpecialPowers.clearUserPref("mousewheel.with_alt.delta_multiplier_y"); 1.747 + SpecialPowers.clearUserPref("mousewheel.with_alt.delta_multiplier_z"); 1.748 + SpecialPowers.clearUserPref("mousewheel.with_control.delta_multiplier_x"); 1.749 + SpecialPowers.clearUserPref("mousewheel.with_control.delta_multiplier_y"); 1.750 + SpecialPowers.clearUserPref("mousewheel.with_control.delta_multiplier_z"); 1.751 + SpecialPowers.clearUserPref("mousewheel.with_meta.delta_multiplier_x"); 1.752 + SpecialPowers.clearUserPref("mousewheel.with_meta.delta_multiplier_y"); 1.753 + SpecialPowers.clearUserPref("mousewheel.with_meta.delta_multiplier_z"); 1.754 + SpecialPowers.clearUserPref("mousewheel.with_shift.delta_multiplier_x"); 1.755 + SpecialPowers.clearUserPref("mousewheel.with_shift.delta_multiplier_y"); 1.756 + SpecialPowers.clearUserPref("mousewheel.with_shift.delta_multiplier_z"); 1.757 + SpecialPowers.clearUserPref("mousewheel.with_win.delta_multiplier_x"); 1.758 + SpecialPowers.clearUserPref("mousewheel.with_win.delta_multiplier_y"); 1.759 + SpecialPowers.clearUserPref("mousewheel.with_win.delta_multiplier_z"); 1.760 + 1.761 + SimpleTest.finish(); 1.762 +} 1.763 + 1.764 +</script> 1.765 +</pre> 1.766 +</body> 1.767 +</html>