dom/events/test/window_wheel_default_action.html

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/dom/events/test/window_wheel_default_action.html	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,1826 @@
     1.4 +<!DOCTYPE HTML>
     1.5 +<html>
     1.6 +<head>
     1.7 +  <title>Test for default action of 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="overflow: auto; width: 200px; height: 200px;">
    1.15 +  <div id="clipper" style="margin: 0; padding: 0; overflow: hidden; width: 3000px; height: 3000px;">
    1.16 +    <div id="scrolled" style="width: 5000px; height: 5000px;">
    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 +      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.43 +    </div>
    1.44 +  </div>
    1.45 +</div>
    1.46 +<div id="spacerForBody"></div>
    1.47 +<div id="content" style="display: none">
    1.48 +  
    1.49 +</div>
    1.50 +<pre id="test">
    1.51 +<script type="application/javascript">
    1.52 +
    1.53 +SimpleTest.waitForFocus(runTests, window);
    1.54 +
    1.55 +var winUtils = SpecialPowers.getDOMWindowUtils(window);
    1.56 +// grab refresh driver
    1.57 +winUtils.advanceTimeAndRefresh(100);
    1.58 +
    1.59 +var gScrollableElement = document.getElementById("scrollable");
    1.60 +var gScrolledElement = document.getElementById("scrolled");
    1.61 +var gSpacerForBodyElement = document.getElementById("spacerForBody");
    1.62 +
    1.63 +function is()
    1.64 +{
    1.65 +  window.opener.is.apply(window.opener, arguments);
    1.66 +}
    1.67 +
    1.68 +function ok()
    1.69 +{
    1.70 +  window.opener.ok.apply(window.opener, arguments);
    1.71 +}
    1.72 +
    1.73 +function hitEventLoop(aFunc, aTimes)
    1.74 +{
    1.75 +  winUtils.advanceTimeAndRefresh(100);
    1.76 +
    1.77 +  if (--aTimes) {
    1.78 +    setTimeout(hitEventLoop, 0, aFunc, aTimes);
    1.79 +  } else {
    1.80 +    setTimeout(aFunc, 20);
    1.81 +  }
    1.82 +}
    1.83 +
    1.84 +function onZoomReset(aCallback) {
    1.85 +  var topic = "browser-fullZoom:zoomReset";
    1.86 +  SpecialPowers.addObserver(function observe() {
    1.87 +    SpecialPowers.removeObserver(observe, topic);
    1.88 +    SimpleTest.executeSoon(aCallback);
    1.89 +  }, topic, false);
    1.90 +}
    1.91 +
    1.92 +function setDeltaMultiplierSettings(aSettings)
    1.93 +{
    1.94 +  SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_x", aSettings.deltaMultiplierX * 100);
    1.95 +  SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_y", aSettings.deltaMultiplierY * 100);
    1.96 +  SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_z", aSettings.deltaMultiplierZ * 100);
    1.97 +  SpecialPowers.setIntPref("mousewheel.with_alt.delta_multiplier_x", aSettings.deltaMultiplierX * 100);
    1.98 +  SpecialPowers.setIntPref("mousewheel.with_alt.delta_multiplier_y", aSettings.deltaMultiplierY * 100);
    1.99 +  SpecialPowers.setIntPref("mousewheel.with_alt.delta_multiplier_z", aSettings.deltaMultiplierZ * 100);
   1.100 +  SpecialPowers.setIntPref("mousewheel.with_control.delta_multiplier_x", aSettings.deltaMultiplierX * 100);
   1.101 +  SpecialPowers.setIntPref("mousewheel.with_control.delta_multiplier_y", aSettings.deltaMultiplierY * 100);
   1.102 +  SpecialPowers.setIntPref("mousewheel.with_control.delta_multiplier_z", aSettings.deltaMultiplierZ * 100);
   1.103 +  SpecialPowers.setIntPref("mousewheel.with_meta.delta_multiplier_x", aSettings.deltaMultiplierX * 100);
   1.104 +  SpecialPowers.setIntPref("mousewheel.with_meta.delta_multiplier_y", aSettings.deltaMultiplierY * 100);
   1.105 +  SpecialPowers.setIntPref("mousewheel.with_meta.delta_multiplier_z", aSettings.deltaMultiplierZ * 100);
   1.106 +  SpecialPowers.setIntPref("mousewheel.with_shift.delta_multiplier_x", aSettings.deltaMultiplierX * 100);
   1.107 +  SpecialPowers.setIntPref("mousewheel.with_shift.delta_multiplier_y", aSettings.deltaMultiplierY * 100);
   1.108 +  SpecialPowers.setIntPref("mousewheel.with_shift.delta_multiplier_z", aSettings.deltaMultiplierZ * 100);
   1.109 +  SpecialPowers.setIntPref("mousewheel.with_win.delta_multiplier_x", aSettings.deltaMultiplierX * 100);
   1.110 +  SpecialPowers.setIntPref("mousewheel.with_win.delta_multiplier_y", aSettings.deltaMultiplierY * 100);
   1.111 +  SpecialPowers.setIntPref("mousewheel.with_win.delta_multiplier_z", aSettings.deltaMultiplierZ * 100);
   1.112 +}
   1.113 +
   1.114 +function doTestScroll(aSettings, aCallback)
   1.115 +{
   1.116 +  const kNoScroll    = 0x00;
   1.117 +  const kScrollUp    = 0x01;
   1.118 +  const kScrollDown  = 0x02;
   1.119 +  const kScrollLeft  = 0x04;
   1.120 +  const kScrollRight = 0x08;
   1.121 +
   1.122 +  const kTests = [
   1.123 +    { description: "Scroll to bottom by pixel scroll even if lineOrPageDelta is 0",
   1.124 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.125 +               deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
   1.126 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.127 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.128 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.129 +      expected: kScrollDown },
   1.130 +    { description: "Scroll to bottom by pixel scroll when lineOrPageDelta is 1",
   1.131 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.132 +               deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
   1.133 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: false,
   1.134 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.135 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.136 +      expected: kScrollDown },
   1.137 +    { description: "Scroll to top by pixel scroll even if lineOrPageDelta is 0",
   1.138 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.139 +               deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
   1.140 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.141 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.142 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.143 +      expected: kScrollUp },
   1.144 +    { description: "Scroll to top by pixel scroll when lineOrPageDelta is -1",
   1.145 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.146 +               deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
   1.147 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: -1, isMomentum: false,
   1.148 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.149 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.150 +      expected: kScrollUp },
   1.151 +    { description: "Scroll to right by pixel scroll even if lineOrPageDelta is 0",
   1.152 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.153 +               deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
   1.154 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.155 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.156 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.157 +      expected: kScrollRight },
   1.158 +    { description: "Scroll to right by pixel scroll when lineOrPageDelta is 1",
   1.159 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.160 +               deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
   1.161 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 0, isMomentum: false,
   1.162 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.163 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.164 +      expected: kScrollRight },
   1.165 +    { description: "Scroll to left by pixel scroll even if lineOrPageDelta is 0",
   1.166 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.167 +               deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
   1.168 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.169 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.170 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.171 +      expected: kScrollLeft },
   1.172 +    { description: "Scroll to left by pixel scroll when lineOrPageDelta is -1",
   1.173 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.174 +               deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
   1.175 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: 0, isMomentum: false,
   1.176 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.177 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.178 +      expected: kScrollLeft },
   1.179 +    { description: "Scroll to bottom-right by pixel scroll",
   1.180 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.181 +               deltaX: 8.0, deltaY: 8.0, deltaZ: 0.0,
   1.182 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.183 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.184 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.185 +      expected: kScrollDown | kScrollRight },
   1.186 +    { description: "Scroll to bottom-left by pixel scroll",
   1.187 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.188 +               deltaX: -8.0, deltaY: 8.0, deltaZ: 0.0,
   1.189 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.190 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.191 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.192 +      expected: kScrollDown | kScrollLeft },
   1.193 +    { description: "Scroll to top-left by pixel scroll",
   1.194 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.195 +               deltaX: -8.0, deltaY: -8.0, deltaZ: 0.0,
   1.196 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.197 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.198 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.199 +      expected: kScrollUp | kScrollLeft },
   1.200 +    { description: "Scroll to top-right by pixel scroll",
   1.201 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.202 +               deltaX: 8.0, deltaY: -8.0, deltaZ: 0.0,
   1.203 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.204 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.205 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.206 +      expected: kScrollUp | kScrollRight },
   1.207 +    { description: "Not Scroll by pixel scroll for z",
   1.208 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.209 +               deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
   1.210 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.211 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.212 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.213 +      expected: kNoScroll },
   1.214 +
   1.215 +    { description: "Scroll to bottom by line scroll even if lineOrPageDelta is 0",
   1.216 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.217 +               deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
   1.218 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: false,
   1.219 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.220 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.221 +      expected: kScrollDown },
   1.222 +    { description: "Scroll to bottom by line scroll when lineOrPageDelta is 1",
   1.223 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.224 +               deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
   1.225 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: false,
   1.226 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.227 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.228 +      expected: kScrollDown },
   1.229 +    { description: "Scroll to top by line scroll even if lineOrPageDelta is 0",
   1.230 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.231 +               deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
   1.232 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.233 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.234 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.235 +      expected: kScrollUp },
   1.236 +    { description: "Scroll to top by line scroll when lineOrPageDelta is -1",
   1.237 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.238 +               deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
   1.239 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: -1, isMomentum: false,
   1.240 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.241 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.242 +      expected: kScrollUp },
   1.243 +    { description: "Scroll to right by line scroll even if lineOrPageDelta is 0",
   1.244 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.245 +               deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
   1.246 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.247 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.248 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.249 +      expected: kScrollRight },
   1.250 +    { description: "Scroll to right by line scroll when lineOrPageDelta is 1",
   1.251 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.252 +               deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
   1.253 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 0, isMomentum: false,
   1.254 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.255 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.256 +      expected: kScrollRight },
   1.257 +    { description: "Scroll to left by line scroll even if lineOrPageDelta is 0",
   1.258 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.259 +               deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
   1.260 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.261 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.262 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.263 +      expected: kScrollLeft },
   1.264 +    { description: "Scroll to left by line scroll when lineOrPageDelta is -1",
   1.265 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.266 +               deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
   1.267 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: 0, isMomentum: false,
   1.268 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.269 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.270 +      expected: kScrollLeft },
   1.271 +    { description: "Scroll to bottom-right by line scroll",
   1.272 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.273 +               deltaX: 0.5, deltaY: 0.5, deltaZ: 0.0,
   1.274 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.275 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.276 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.277 +      expected: kScrollDown | kScrollRight },
   1.278 +    { description: "Scroll to bottom-left by line scroll",
   1.279 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.280 +               deltaX: -0.5, deltaY: 0.5, deltaZ: 0.0,
   1.281 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.282 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.283 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.284 +      expected: kScrollDown | kScrollLeft },
   1.285 +    { description: "Scroll to top-left by line scroll",
   1.286 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.287 +               deltaX: -0.5, deltaY: -0.5, deltaZ: 0.0,
   1.288 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.289 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.290 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.291 +      expected: kScrollUp | kScrollLeft },
   1.292 +    { description: "Scroll to top-right by line scroll",
   1.293 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.294 +               deltaX: 0.5, deltaY: -0.5, deltaZ: 0.0,
   1.295 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.296 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.297 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.298 +      expected: kScrollUp | kScrollRight },
   1.299 +    { description: "Not Scroll by line scroll for z",
   1.300 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.301 +               deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
   1.302 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.303 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.304 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.305 +      expected: kNoScroll },
   1.306 +
   1.307 +    { description: "Scroll to bottom by page scroll even if lineOrPageDelta is 0",
   1.308 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.309 +               deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
   1.310 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: false,
   1.311 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.312 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.313 +      expected: kScrollDown },
   1.314 +    { description: "Scroll to bottom by page scroll when lineOrPageDelta is 1",
   1.315 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.316 +               deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
   1.317 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: false,
   1.318 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.319 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.320 +      expected: kScrollDown },
   1.321 +    { description: "Scroll to top by page scroll even if lineOrPageDelta is 0",
   1.322 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.323 +               deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
   1.324 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.325 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.326 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.327 +      expected: kScrollUp },
   1.328 +    { description: "Scroll to top by page scroll when lineOrPageDelta is -1",
   1.329 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.330 +               deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
   1.331 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: -1, isMomentum: false,
   1.332 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.333 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.334 +      expected: kScrollUp },
   1.335 +    { description: "Scroll to right by page scroll even if lineOrPageDelta is 0",
   1.336 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.337 +               deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
   1.338 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.339 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.340 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.341 +      expected: kScrollRight },
   1.342 +    { description: "Scroll to right by page scroll when lineOrPageDelta is 1",
   1.343 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.344 +               deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
   1.345 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 0, isMomentum: false,
   1.346 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.347 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.348 +      expected: kScrollRight },
   1.349 +    { description: "Scroll to left by page scroll even if lineOrPageDelta is 0",
   1.350 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.351 +               deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
   1.352 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.353 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.354 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.355 +      expected: kScrollLeft },
   1.356 +    { description: "Scroll to left by page scroll when lineOrPageDelta is -1",
   1.357 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.358 +               deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
   1.359 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: 0, isMomentum: false,
   1.360 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.361 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.362 +      expected: kScrollLeft },
   1.363 +    { description: "Scroll to bottom-right by page scroll",
   1.364 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.365 +               deltaX: 0.5, deltaY: 0.5, deltaZ: 0.0,
   1.366 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.367 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.368 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.369 +      expected: kScrollDown | kScrollRight },
   1.370 +    { description: "Scroll to bottom-left by page scroll",
   1.371 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.372 +               deltaX: -0.5, deltaY: 0.5, deltaZ: 0.0,
   1.373 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.374 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.375 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.376 +      expected: kScrollDown | kScrollLeft },
   1.377 +    { description: "Scroll to top-left by page scroll",
   1.378 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.379 +               deltaX: -0.5, deltaY: -0.5, deltaZ: 0.0,
   1.380 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.381 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.382 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.383 +      expected: kScrollUp | kScrollLeft },
   1.384 +    { description: "Scroll to top-right by page scroll",
   1.385 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.386 +               deltaX: 0.5, deltaY: -0.5, deltaZ: 0.0,
   1.387 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.388 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.389 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.390 +      expected: kScrollUp | kScrollRight },
   1.391 +    { description: "Not Scroll by page scroll for z",
   1.392 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.393 +               deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
   1.394 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: false,
   1.395 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.396 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.397 +      expected: kNoScroll },
   1.398 +
   1.399 +    // special cases.
   1.400 +
   1.401 +    // momentum scroll should cause scroll even if the action is zoom, but if the default action is none,
   1.402 +    // shouldn't do it.
   1.403 +    { description: "Scroll to bottom by momentum pixel scroll when lineOrPageDelta is 0, even if the action is zoom",
   1.404 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.405 +               deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
   1.406 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.407 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.408 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.409 +      expected: kScrollDown },
   1.410 +    { description: "Scroll to bottom by momentum pixel scroll when lineOrPageDelta is 1, even if the action is zoom",
   1.411 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.412 +               deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
   1.413 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: true,
   1.414 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.415 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.416 +      expected: kScrollDown },
   1.417 +    { description: "Scroll to top by momentum pixel scroll when lineOrPageDelta is 0, even if the action is zoom",
   1.418 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.419 +               deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
   1.420 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.421 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.422 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.423 +      expected: kScrollUp },
   1.424 +    { description: "Scroll to top by momentum pixel scroll when lineOrPageDelta is -1, even if the action is zoom",
   1.425 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.426 +               deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
   1.427 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: -1, isMomentum: true,
   1.428 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.429 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.430 +      expected: kScrollUp },
   1.431 +    { description: "Scroll to right by momentum pixel scroll when lineOrPageDelta is 0, even if the action is zoom",
   1.432 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.433 +               deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
   1.434 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.435 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.436 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.437 +      expected: kScrollRight },
   1.438 +    { description: "Scroll to right by momentum pixel scroll when lineOrPageDelta is 1, even if the action is zoom",
   1.439 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.440 +               deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
   1.441 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 0, isMomentum: true,
   1.442 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.443 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.444 +      expected: kScrollRight },
   1.445 +    { description: "Scroll to left by momentum pixel scroll when lineOrPageDelta is 0, even if the action is zoom",
   1.446 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.447 +               deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
   1.448 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.449 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.450 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.451 +      expected: kScrollLeft },
   1.452 +    { description: "Scroll to left by momentum pixel scroll when lineOrPageDelta is -1, even if the action is zoom",
   1.453 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.454 +               deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
   1.455 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: 0, isMomentum: true,
   1.456 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.457 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.458 +      expected: kScrollLeft },
   1.459 +    { description: "Scroll to bottom-right by momentum pixel scroll even if the action is zoom",
   1.460 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.461 +               deltaX: 8.0, deltaY: 8.0, deltaZ: 0.0,
   1.462 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.463 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.464 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.465 +      expected: kScrollDown | kScrollRight },
   1.466 +    { description: "Scroll to bottom-left by momentum pixel scroll even if the action is zoom",
   1.467 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.468 +               deltaX: -8.0, deltaY: 8.0, deltaZ: 0.0,
   1.469 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.470 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.471 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.472 +      expected: kScrollDown | kScrollLeft },
   1.473 +    { description: "Scroll to top-left by momentum pixel scroll even if the action is zoom",
   1.474 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.475 +               deltaX: -8.0, deltaY: -8.0, deltaZ: 0.0,
   1.476 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.477 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.478 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.479 +      expected: kScrollUp | kScrollLeft },
   1.480 +    { description: "Scroll to top-right by momentum pixel scroll even if the action is zoom",
   1.481 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.482 +               deltaX: 8.0, deltaY: -8.0, deltaZ: 0.0,
   1.483 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.484 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.485 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.486 +      expected: kScrollUp | kScrollRight },
   1.487 +    { description: "Not Scroll by momentum pixel scroll for z (action is zoom)",
   1.488 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.489 +               deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
   1.490 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.491 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.492 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.493 +      expected: kNoScroll },
   1.494 +    { description: "Not Scroll by momentum pixel scroll if default action is none (action is zoom)",
   1.495 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.496 +               deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
   1.497 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.498 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.499 +               shiftKey: false, ctrlKey: true, altKey: false, metaKey: false, osKey: false },
   1.500 +      expected: kNoScroll,
   1.501 +      prepare: function () { SpecialPowers.setIntPref("mousewheel.default.action", 0); },
   1.502 +      cleanup: function () { SpecialPowers.setIntPref("mousewheel.default.action", 1); } },
   1.503 +
   1.504 +    // momentum scroll should cause scroll even if the action is history, but if the default action is none,
   1.505 +    // shouldn't do it.
   1.506 +    { description: "Scroll to bottom by momentum pixel scroll when lineOrPageDelta is 0, even if the action is history",
   1.507 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.508 +               deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
   1.509 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.510 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.511 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.512 +      expected: kScrollDown },
   1.513 +    { description: "Scroll to bottom by momentum pixel scroll when lineOrPageDelta is 1, even if the action is history",
   1.514 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.515 +               deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
   1.516 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1, isMomentum: true,
   1.517 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.518 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.519 +      expected: kScrollDown },
   1.520 +    { description: "Scroll to top by momentum pixel scroll when lineOrPageDelta is 0, even if the action is history",
   1.521 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.522 +               deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
   1.523 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.524 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.525 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.526 +      expected: kScrollUp },
   1.527 +    { description: "Scroll to top by momentum pixel scroll when lineOrPageDelta is -1, even if the action is history",
   1.528 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.529 +               deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
   1.530 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: -1, isMomentum: true,
   1.531 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.532 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.533 +      expected: kScrollUp },
   1.534 +    { description: "Scroll to right by momentum pixel scroll when lineOrPageDelta is 0, even if the action is history",
   1.535 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.536 +               deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
   1.537 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.538 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.539 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.540 +      expected: kScrollRight },
   1.541 +    { description: "Scroll to right by momentum pixel scroll when lineOrPageDelta is 1, even if the action is history",
   1.542 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.543 +               deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
   1.544 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 0, isMomentum: true,
   1.545 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.546 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.547 +      expected: kScrollRight },
   1.548 +    { description: "Scroll to left by momentum pixel scroll when lineOrPageDelta is 0, even if the action is history",
   1.549 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.550 +               deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
   1.551 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.552 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.553 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.554 +      expected: kScrollLeft },
   1.555 +    { description: "Scroll to left by momentum pixel scroll when lineOrPageDelta is -1, even if the action is history",
   1.556 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.557 +               deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
   1.558 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: 0, isMomentum: true,
   1.559 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.560 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.561 +      expected: kScrollLeft },
   1.562 +    { description: "Scroll to bottom-right by momentum pixel scroll even if the action is history",
   1.563 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.564 +               deltaX: 8.0, deltaY: 8.0, deltaZ: 0.0,
   1.565 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.566 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.567 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.568 +      expected: kScrollDown | kScrollRight },
   1.569 +    { description: "Scroll to bottom-left by momentum pixel scroll even if the action is history",
   1.570 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.571 +               deltaX: -8.0, deltaY: 8.0, deltaZ: 0.0,
   1.572 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.573 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.574 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.575 +      expected: kScrollDown | kScrollLeft },
   1.576 +    { description: "Scroll to top-left by momentum pixel scroll even if the action is history",
   1.577 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.578 +               deltaX: -8.0, deltaY: -8.0, deltaZ: 0.0,
   1.579 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.580 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.581 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.582 +      expected: kScrollUp | kScrollLeft },
   1.583 +    { description: "Scroll to top-right by momentum pixel scroll even if the action is history",
   1.584 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.585 +               deltaX: 8.0, deltaY: -8.0, deltaZ: 0.0,
   1.586 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.587 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.588 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.589 +      expected: kScrollUp | kScrollRight },
   1.590 +    { description: "Not Scroll by momentum pixel scroll for z (action is history)",
   1.591 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.592 +               deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
   1.593 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.594 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.595 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.596 +      expected: kNoScroll },
   1.597 +    { description: "Not Scroll by momentum pixel scroll if default action is none (action is history)",
   1.598 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.599 +               deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
   1.600 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0, isMomentum: true,
   1.601 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.602 +               shiftKey: true, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.603 +      expected: kNoScroll,
   1.604 +      prepare: function () { SpecialPowers.setIntPref("mousewheel.default.action", 0); },
   1.605 +      cleanup: function () { SpecialPowers.setIntPref("mousewheel.default.action", 1); } },
   1.606 +
   1.607 +    // Don't scroll along axis whose overflow style is hidden.
   1.608 +    { description: "Scroll to only bottom by oblique pixel wheel event with overflow-x: hidden",
   1.609 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.610 +               deltaX: 16.0, deltaY: 16.0, deltaZ: 0.0,
   1.611 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.612 +               expectedOverflowDeltaX: 1, expectedOverflowDeltaY: 0,
   1.613 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.614 +      expected: kScrollDown,
   1.615 +      prepare: function() { gScrollableElement.style.overflowX = "hidden"; } },
   1.616 +    { description: "Scroll to only bottom by oblique line wheel event with overflow-x: hidden",
   1.617 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.618 +               deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
   1.619 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.620 +               expectedOverflowDeltaX: 1, expectedOverflowDeltaY: 0,
   1.621 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.622 +      expected: kScrollDown },
   1.623 +    { description: "Scroll to only bottom by oblique page wheel event with overflow-x: hidden",
   1.624 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.625 +               deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
   1.626 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.627 +               expectedOverflowDeltaX: 1, expectedOverflowDeltaY: 0,
   1.628 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.629 +      expected: kScrollDown },
   1.630 +    { description: "Scroll to only top by oblique pixel wheel event with overflow-x: hidden",
   1.631 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.632 +               deltaX: -16.0, deltaY: -16.0, deltaZ: 0.0,
   1.633 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.634 +               expectedOverflowDeltaX: -1, expectedOverflowDeltaY: 0,
   1.635 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.636 +      expected: kScrollUp },
   1.637 +    { description: "Scroll to only top by oblique line wheel event with overflow-x: hidden",
   1.638 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.639 +               deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
   1.640 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.641 +               expectedOverflowDeltaX: -1, expectedOverflowDeltaY: 0,
   1.642 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.643 +      expected: kScrollUp },
   1.644 +    { description: "Scroll to only top by oblique page wheel event with overflow-x: hidden",
   1.645 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.646 +               deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
   1.647 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.648 +               expectedOverflowDeltaX: -1, expectedOverflowDeltaY: 0,
   1.649 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.650 +      expected: kScrollUp,
   1.651 +      cleanup: function () { gScrollableElement.style.overflowX = "auto"; } },
   1.652 +    { description: "Scroll to only right by oblique pixel wheel event with overflow-y: hidden",
   1.653 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.654 +               deltaX: 16.0, deltaY: 16.0, deltaZ: 0.0,
   1.655 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.656 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 1,
   1.657 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.658 +      expected: kScrollRight,
   1.659 +      prepare: function() { gScrollableElement.style.overflowY = "hidden"; } },
   1.660 +    { description: "Scroll to only right by oblique line wheel event with overflow-y: hidden",
   1.661 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.662 +               deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
   1.663 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.664 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 1,
   1.665 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.666 +      expected: kScrollRight },
   1.667 +    { description: "Scroll to only right by oblique page wheel event with overflow-y: hidden",
   1.668 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.669 +               deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
   1.670 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.671 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 1,
   1.672 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.673 +      expected: kScrollRight },
   1.674 +    { description: "Scroll to only left by oblique pixel wheel event with overflow-y: hidden",
   1.675 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.676 +               deltaX: -16.0, deltaY: -16.0, deltaZ: 0.0,
   1.677 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.678 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: -1,
   1.679 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.680 +      expected: kScrollLeft },
   1.681 +    { description: "Scroll to only top by oblique line wheel event with overflow-y: hidden",
   1.682 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.683 +               deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
   1.684 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.685 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: -1,
   1.686 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.687 +      expected: kScrollLeft },
   1.688 +    { description: "Scroll to only top by oblique page wheel event with overflow-y: hidden",
   1.689 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.690 +               deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
   1.691 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.692 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: -1,
   1.693 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.694 +      expected: kScrollLeft,
   1.695 +      cleanup: function () { gScrollableElement.style.overflowY = "auto"; } },
   1.696 +    { description: "Don't be scrolled by oblique pixel wheel event with overflow: hidden",
   1.697 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.698 +               deltaX: 16.0, deltaY: 16.0, deltaZ: 0.0,
   1.699 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.700 +               expectedOverflowDeltaX: 1, expectedOverflowDeltaY: 1,
   1.701 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.702 +      expected: kNoScroll,
   1.703 +      prepare: function() { gScrollableElement.style.overflow = "hidden"; } },
   1.704 +    { description: "Don't be scrolled by oblique line wheel event with overflow: hidden",
   1.705 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.706 +               deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
   1.707 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.708 +               expectedOverflowDeltaX: 1, expectedOverflowDeltaY: 1,
   1.709 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.710 +      expected: kNoScroll },
   1.711 +    { description: "Don't be scrolled by oblique page wheel event with overflow: hidden",
   1.712 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.713 +               deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
   1.714 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.715 +               expectedOverflowDeltaX: 1, expectedOverflowDeltaY: 1,
   1.716 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.717 +      expected: kNoScroll },
   1.718 +    { description: "Don't be scrolled by oblique pixel wheel event with overflow: hidden",
   1.719 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.720 +               deltaX: -16.0, deltaY: -16.0, deltaZ: 0.0,
   1.721 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.722 +               expectedOverflowDeltaX: -1, expectedOverflowDeltaY: -1,
   1.723 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.724 +      expected: kNoScroll },
   1.725 +    { description: "Don't be scrolled by oblique line wheel event with overflow: hidden",
   1.726 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.727 +               deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
   1.728 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.729 +               expectedOverflowDeltaX: -1, expectedOverflowDeltaY: -1,
   1.730 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.731 +      expected: kNoScroll },
   1.732 +    { description: "Don't be scrolled by oblique page wheel event with overflow: hidden",
   1.733 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.734 +               deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
   1.735 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.736 +               expectedOverflowDeltaX: -1, expectedOverflowDeltaY: -1,
   1.737 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.738 +      expected: kNoScroll,
   1.739 +      cleanup: function () { gScrollableElement.style.overflow = "auto"; } },
   1.740 +
   1.741 +    // Don't scroll along axis whose overflow style is hidden and overflow delta values should
   1.742 +    // be zero if there is ancestor scrollable element.
   1.743 +    { description: "Scroll to only bottom by oblique pixel wheel event with overflow-x: hidden (body is scrollable)",
   1.744 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.745 +               deltaX: 16.0, deltaY: 16.0, deltaZ: 0.0,
   1.746 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.747 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.748 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.749 +      expected: kScrollDown,
   1.750 +      prepare: function() {
   1.751 +        gScrollableElement.style.overflowX = "hidden";
   1.752 +        gScrollableElement.style.position = "fixed";
   1.753 +        gScrollableElement.style.top = "30px";
   1.754 +        gScrollableElement.style.left = "30px";
   1.755 +        // Make body element scrollable.
   1.756 +        gSpacerForBodyElement.style.width = "5000px";
   1.757 +        gSpacerForBodyElement.style.height = "5000px";
   1.758 +        document.documentElement.scrollTop = 500;
   1.759 +        document.documentElement.scrollLeft = 500;
   1.760 +      } },
   1.761 +    { description: "Scroll to only bottom by oblique line wheel event with overflow-x: hidden (body is scrollable)",
   1.762 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.763 +               deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
   1.764 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.765 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.766 +      expected: kScrollDown },
   1.767 +    { description: "Scroll to only bottom by oblique page wheel event with overflow-x: hidden (body is scrollable)",
   1.768 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.769 +               deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
   1.770 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.771 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.772 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.773 +      expected: kScrollDown },
   1.774 +    { description: "Scroll to only top by oblique pixel wheel event with overflow-x: hidden (body is scrollable)",
   1.775 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.776 +               deltaX: -16.0, deltaY: -16.0, deltaZ: 0.0,
   1.777 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.778 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.779 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.780 +      expected: kScrollUp },
   1.781 +    { description: "Scroll to only top by oblique line wheel event with overflow-x: hidden (body is scrollable)",
   1.782 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.783 +               deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
   1.784 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.785 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.786 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.787 +      expected: kScrollUp },
   1.788 +    { description: "Scroll to only top by oblique page wheel event with overflow-x: hidden (body is scrollable)",
   1.789 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.790 +               deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
   1.791 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.792 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.793 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.794 +      expected: kScrollUp,
   1.795 +      cleanup: function () { gScrollableElement.style.overflowX = "auto"; } },
   1.796 +    { description: "Scroll to only right by oblique pixel wheel event with overflow-y: hidden (body is scrollable)",
   1.797 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.798 +               deltaX: 16.0, deltaY: 16.0, deltaZ: 0.0,
   1.799 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.800 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.801 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.802 +      expected: kScrollRight,
   1.803 +      prepare: function() { gScrollableElement.style.overflowY = "hidden"; } },
   1.804 +    { description: "Scroll to only right by oblique line wheel event with overflow-y: hidden (body is scrollable)",
   1.805 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.806 +               deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
   1.807 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.808 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.809 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.810 +      expected: kScrollRight },
   1.811 +    { description: "Scroll to only right by oblique page wheel event with overflow-y: hidden (body is scrollable)",
   1.812 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.813 +               deltaX: 1.0, deltaY: 1.0, deltaZ: 0.0,
   1.814 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1,
   1.815 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.816 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.817 +      expected: kScrollRight },
   1.818 +    { description: "Scroll to only left by oblique pixel wheel event with overflow-y: hidden (body is scrollable)",
   1.819 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.820 +               deltaX: -16.0, deltaY: -16.0, deltaZ: 0.0,
   1.821 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.822 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.823 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.824 +      expected: kScrollLeft },
   1.825 +    { description: "Scroll to only top by oblique line wheel event with overflow-y: hidden (body is scrollable)",
   1.826 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.827 +               deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
   1.828 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.829 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.830 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.831 +      expected: kScrollLeft },
   1.832 +    { description: "Scroll to only top by oblique page wheel event with overflow-y: hidden (body is scrollable)",
   1.833 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
   1.834 +               deltaX: -1.0, deltaY: -1.0, deltaZ: 0.0,
   1.835 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: -1,
   1.836 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0,
   1.837 +               shiftKey: false, ctrlKey: false, altKey: false, metaKey: false, osKey: false },
   1.838 +      expected: kScrollLeft,
   1.839 +      cleanup: function () {
   1.840 +        gScrollableElement.style.overflowY = "auto";
   1.841 +        gScrollableElement.style.position = "static";
   1.842 +        gSpacerForBodyElement.style.width = "";
   1.843 +        gSpacerForBodyElement.style.height = "";
   1.844 +      } },
   1.845 +  ];
   1.846 +
   1.847 +  var description;
   1.848 +
   1.849 +  var currentTestIndex = -1;
   1.850 +  var isXReverted = (aSettings.deltaMultiplierX < 0);
   1.851 +  var isYReverted = (aSettings.deltaMultiplierY < 0);
   1.852 +
   1.853 +  function doNextTest()
   1.854 +  {
   1.855 +    if (++currentTestIndex >= kTests.length) {
   1.856 +      SimpleTest.executeSoon(aCallback);
   1.857 +      return;
   1.858 +    }
   1.859 +
   1.860 +    gScrollableElement.scrollTop = 1000;
   1.861 +    gScrollableElement.scrollLeft = 1000;
   1.862 +
   1.863 +    var currentTest = kTests[currentTestIndex];
   1.864 +    description = "doTestScroll(aSettings=" + aSettings.description + "), " + currentTest.description + ": ";
   1.865 +    if (currentTest.prepare) {
   1.866 +      currentTest.prepare();
   1.867 +    }
   1.868 +
   1.869 +    synthesizeWheel(gScrollableElement, 10, 10, currentTest.event);
   1.870 +
   1.871 +    hitEventLoop(function () {
   1.872 +      if (currentTest.expected == kNoScroll) {
   1.873 +        is(gScrollableElement.scrollTop, 1000, description + "scrolled vertical");
   1.874 +        is(gScrollableElement.scrollLeft, 1000, description + "scrolled horizontal");
   1.875 +      } else {
   1.876 +        var scrollUp = !isYReverted ? (currentTest.expected & kScrollUp) :
   1.877 +                                      (currentTest.expected & kScrollDown);
   1.878 +        var scrollDown = !isYReverted ? (currentTest.expected & kScrollDown) :
   1.879 +                                        (currentTest.expected & kScrollUp);
   1.880 +        if (scrollUp) {
   1.881 +          ok(gScrollableElement.scrollTop < 1000, description + "not scrolled up, got " + gScrollableElement.scrollTop);
   1.882 +        } else if (scrollDown) {
   1.883 +          ok(gScrollableElement.scrollTop > 1000, description + "not scrolled down, got " + gScrollableElement.scrollTop);
   1.884 +        } else {
   1.885 +          is(gScrollableElement.scrollTop, 1000, description + "scrolled vertical");
   1.886 +        }
   1.887 +        var scrollLeft = !isXReverted ? (currentTest.expected & kScrollLeft) :
   1.888 +                                        (currentTest.expected & kScrollRight);
   1.889 +        var scrollRight = !isXReverted ? (currentTest.expected & kScrollRight) :
   1.890 +                                         (currentTest.expected & kScrollLeft);
   1.891 +        if (scrollLeft) {
   1.892 +          ok(gScrollableElement.scrollLeft < 1000, description + "not scrolled to left, got " + gScrollableElement.scrollLeft);
   1.893 +        } else if (scrollRight) {
   1.894 +          ok(gScrollableElement.scrollLeft > 1000, description + "not scrolled to right, got " + gScrollableElement.scrollLeft);
   1.895 +        } else {
   1.896 +          is(gScrollableElement.scrollLeft, 1000, description + "scrolled horizontal");
   1.897 +        }
   1.898 +      }
   1.899 +      if (currentTest.cleanup) {
   1.900 +        currentTest.cleanup();
   1.901 +      }
   1.902 +      winUtils.advanceTimeAndRefresh(100);
   1.903 +      doNextTest();
   1.904 +    }, 10);
   1.905 +  }
   1.906 +  doNextTest();
   1.907 +}
   1.908 +
   1.909 +function doTestZoom(aSettings, aCallback)
   1.910 +{
   1.911 +  if ((aSettings.deltaMultiplierX != 1.0  && aSettings.deltaMultiplierX != -1.0) ||
   1.912 +      (aSettings.deltaMultiplierY != 1.0  && aSettings.deltaMultiplierY != -1.0)) {
   1.913 +    todo(false, "doTestZoom doesn't support to test with aSettings=" + aSettings.description);
   1.914 +    SimpleTest.executeSoon(aCallback);
   1.915 +    return;
   1.916 +  }
   1.917 +
   1.918 +  const kNone     = 0x00;
   1.919 +  const kPositive = 0x01;
   1.920 +  const kNegative = 0x02;
   1.921 +  const kUseX     = 0x10;
   1.922 +  const kUseY     = 0x20;
   1.923 +  const kTests = [
   1.924 +    { description: "by vertical/positive pixel event when its lineOrPageDeltaY is 0",
   1.925 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.926 +               deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
   1.927 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
   1.928 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
   1.929 +      expected: kNone },
   1.930 +    { description: "by vertical/positive pixel event when its lineOrPageDeltaY is 1",
   1.931 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.932 +               deltaX: 0.0, deltaY: 8.0, deltaZ: 0.0,
   1.933 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1,
   1.934 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
   1.935 +      expected: kPositive | kUseY },
   1.936 +    { description: "by vertical/negative pixel event when its lineOrPageDeltaY is 0",
   1.937 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.938 +               deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
   1.939 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
   1.940 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
   1.941 +      expected: kNone },
   1.942 +    { description: "by vertical/negative pixel event when its lineOrPageDeltaY is -1",
   1.943 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.944 +               deltaX: 0.0, deltaY: -8.0, deltaZ: 0.0,
   1.945 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: -1,
   1.946 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
   1.947 +      expected: kNegative | kUseY },
   1.948 +    { description: "by horizotal/positive pixel event when its lineOrPageDeltaX is 0",
   1.949 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.950 +               deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
   1.951 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
   1.952 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
   1.953 +      expected: kNone },
   1.954 +    { description: "by horizotal/positive pixel event when its lineOrPageDeltaX is 1",
   1.955 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.956 +               deltaX: 8.0, deltaY: 0.0, deltaZ: 0.0,
   1.957 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 0,
   1.958 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
   1.959 +      expected: kPositive | kUseX },
   1.960 +    { description: "by horizotal/negative pixel event when its lineOrPageDeltaX is 0",
   1.961 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.962 +               deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
   1.963 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
   1.964 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
   1.965 +      expected: kNone },
   1.966 +    { description: "by horizotal/negative pixel event when its lineOrPageDeltaX is -1",
   1.967 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.968 +               deltaX: -8.0, deltaY: 0.0, deltaZ: 0.0,
   1.969 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: 0,
   1.970 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
   1.971 +      expected: kNegative | kUseX },
   1.972 +    { description: "by z pixel event",
   1.973 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
   1.974 +               deltaX: 0.0, deltaY: 0.0, deltaZ: 16.0,
   1.975 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
   1.976 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
   1.977 +      expected: kNone },
   1.978 +
   1.979 +    { description: "by vertical/positive line event when its lineOrPageDeltaY is 0",
   1.980 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.981 +               deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
   1.982 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
   1.983 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
   1.984 +      expected: kNone },
   1.985 +    { description: "by vertical/positive line event when its lineOrPageDeltaY is 1",
   1.986 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.987 +               deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
   1.988 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1,
   1.989 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
   1.990 +      expected: kPositive | kUseY },
   1.991 +    { description: "by vertical/negative line event when its lineOrPageDeltaY is 0",
   1.992 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.993 +               deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
   1.994 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
   1.995 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
   1.996 +      expected: kNone },
   1.997 +    { description: "by vertical/negative line event when its lineOrPageDeltaY is -1",
   1.998 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
   1.999 +               deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
  1.1000 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: -1,
  1.1001 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1002 +      expected: kNegative | kUseY },
  1.1003 +    { description: "by horizotal/positive line event when its lineOrPageDeltaX is 0",
  1.1004 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1005 +               deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
  1.1006 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
  1.1007 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1008 +      expected: kNone },
  1.1009 +    { description: "by horizotal/positive line event when its lineOrPageDeltaX is 1",
  1.1010 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1011 +               deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
  1.1012 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 0,
  1.1013 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1014 +      expected: kPositive | kUseX },
  1.1015 +    { description: "by horizotal/negative line event when its lineOrPageDeltaX is 0",
  1.1016 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1017 +               deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
  1.1018 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
  1.1019 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1020 +      expected: kNone },
  1.1021 +    { description: "by horizotal/negative line event when its lineOrPageDeltaX is -1",
  1.1022 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1023 +               deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
  1.1024 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: 0,
  1.1025 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1026 +      expected: kNegative | kUseX },
  1.1027 +    { description: "by z line event",
  1.1028 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1029 +               deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
  1.1030 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
  1.1031 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1032 +      expected: kNone },
  1.1033 +
  1.1034 +    { description: "by vertical/positive page event when its lineOrPageDeltaY is 0",
  1.1035 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1036 +               deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
  1.1037 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
  1.1038 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1039 +      expected: kNone },
  1.1040 +    { description: "by vertical/positive page event when its lineOrPageDeltaY is 1",
  1.1041 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1042 +               deltaX: 0.0, deltaY: 0.5, deltaZ: 0.0,
  1.1043 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1,
  1.1044 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1045 +      expected: kPositive | kUseY },
  1.1046 +    { description: "by vertical/negative page event when its lineOrPageDeltaY is 0",
  1.1047 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1048 +               deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
  1.1049 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
  1.1050 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1051 +      expected: kNone },
  1.1052 +    { description: "by vertical/negative page event when its lineOrPageDeltaY is -1",
  1.1053 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1054 +               deltaX: 0.0, deltaY: -0.5, deltaZ: 0.0,
  1.1055 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: -1,
  1.1056 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1057 +      expected: kNegative | kUseY },
  1.1058 +    { description: "by horizotal/positive page event when its lineOrPageDeltaX is 0",
  1.1059 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1060 +               deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
  1.1061 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
  1.1062 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1063 +      expected: kNone },
  1.1064 +    { description: "by horizotal/positive page event when its lineOrPageDeltaX is 1",
  1.1065 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1066 +               deltaX: 0.5, deltaY: 0.0, deltaZ: 0.0,
  1.1067 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 0,
  1.1068 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1069 +      expected: kPositive | kUseX },
  1.1070 +    { description: "by horizotal/negative page event when its lineOrPageDeltaX is 0",
  1.1071 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1072 +               deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
  1.1073 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
  1.1074 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1075 +      expected: kNone },
  1.1076 +    { description: "by horizotal/negative page event when its lineOrPageDeltaX is -1",
  1.1077 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1078 +               deltaX: -0.5, deltaY: 0.0, deltaZ: 0.0,
  1.1079 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: 0,
  1.1080 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1081 +      expected: kNegative | kUseX },
  1.1082 +    { description: "by z page event",
  1.1083 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1084 +               deltaX: 0.0, deltaY: 0.0, deltaZ: 1.0,
  1.1085 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0,
  1.1086 +               expectedOverflowDeltaX: 0, expectedOverflowDeltaY: 0 },
  1.1087 +      expected: kNone },
  1.1088 +  ];
  1.1089 +
  1.1090 +  var description, currentTest;
  1.1091 +  var currentTestIndex = -1;
  1.1092 +  var isXReverted = (aSettings.deltaMultiplierX < 0);
  1.1093 +  var isYReverted = (aSettings.deltaMultiplierY < 0);
  1.1094 +
  1.1095 +  function doNextTest()
  1.1096 +  {
  1.1097 +    if (++currentTestIndex >= kTests.length) {
  1.1098 +      SimpleTest.executeSoon(aCallback);
  1.1099 +      return;
  1.1100 +    }
  1.1101 +
  1.1102 +    gScrollableElement.scrollTop = 1000;
  1.1103 +    gScrollableElement.scrollLeft = 1000;
  1.1104 +
  1.1105 +    currentTest = kTests[currentTestIndex];
  1.1106 +    description = "doTestZoom(aSettings=" + aSettings.description + "), ";
  1.1107 +    if (currentTest.expected == kNone) {
  1.1108 +      description += "Shouldn't ";
  1.1109 +    } else {
  1.1110 +      description += "Should ";
  1.1111 +    }
  1.1112 +    description += "zoom " + currentTest.description + ": ";
  1.1113 +
  1.1114 +    var event = currentTest.event;
  1.1115 +    event.ctrlKey  = true;
  1.1116 +    synthesizeWheel(gScrollableElement, 10, 10, event);
  1.1117 +
  1.1118 +    // NOTE: Zooming might change scrollTop and scrollLeft by rounding fraction.
  1.1119 +    //       This test assume that zoom happens synchronously and scrolling
  1.1120 +    //       happens asynchronously.
  1.1121 +    var scrollTop = gScrollableElement.scrollTop;
  1.1122 +    var scrollLeft = gScrollableElement.scrollLeft;
  1.1123 +
  1.1124 +    hitEventLoop(function () {
  1.1125 +      is(gScrollableElement.scrollTop, scrollTop, description + "scrolled vertical");
  1.1126 +      is(gScrollableElement.scrollLeft, scrollLeft, description + "scrolled horizontal");
  1.1127 +      if (!(currentTest.expected & (kNegative | kPositive))) {
  1.1128 +        is(SpecialPowers.getFullZoom(window), 1.0, description + "zoomed");
  1.1129 +      } else {
  1.1130 +        var isReverted = (currentTest.expected & kUseX) ? isXReverted :
  1.1131 +                         (currentTest.expected & kUseY) ? isYReverted : false;
  1.1132 +        if ((!isReverted && (currentTest.expected & kNegative)) ||
  1.1133 +            (isReverted && (currentTest.expected & kPositive))) {
  1.1134 +          ok(SpecialPowers.getFullZoom(window) > 1.0,
  1.1135 +             description + "not zoomed in, got " + SpecialPowers.getFullZoom(window));
  1.1136 +        } else {
  1.1137 +          ok(SpecialPowers.getFullZoom(window) < 1.0,
  1.1138 +             description + "not zoomed out, got " + SpecialPowers.getFullZoom(window));
  1.1139 +        }
  1.1140 +      }
  1.1141 +
  1.1142 +      synthesizeKey("0", { accelKey: true });
  1.1143 +      onZoomReset(function () {
  1.1144 +        hitEventLoop(doNextTest, 20);
  1.1145 +      });
  1.1146 +    }, 20);
  1.1147 +  }
  1.1148 +  doNextTest();
  1.1149 +}
  1.1150 +
  1.1151 +function doTestZoomedScroll(aCallback)
  1.1152 +{
  1.1153 +  var zoom = 1.0;
  1.1154 +  function setFullZoom(aWindow, aZoom)
  1.1155 +  {
  1.1156 +    zoom = aZoom;
  1.1157 +    SpecialPowers.setFullZoom(aWindow, aZoom);
  1.1158 +  }
  1.1159 +
  1.1160 +  function prepareTestZoomedPixelScroll()
  1.1161 +  {
  1.1162 +    // Reset zoom and store the scroll amount into the data.
  1.1163 +    synthesizeKey("0", { accelKey: true });
  1.1164 +    zoom = 1.0;
  1.1165 +    onZoomReset(testZoomedPixelScroll);
  1.1166 +  }
  1.1167 +
  1.1168 +  function testZoomedPixelScroll()
  1.1169 +  {
  1.1170 +    gScrollableElement.scrollTop = 1000;
  1.1171 +    gScrollableElement.scrollLeft = 1000;
  1.1172 +    // Ensure not to be in reflow.
  1.1173 +    hitEventLoop(function () {
  1.1174 +      function mousePixelScrollHandler(aEvent)
  1.1175 +      {
  1.1176 +        if (aEvent.axis == MouseScrollEvent.HORIZONTAL_AXIS) {
  1.1177 +          is(aEvent.detail, 16,
  1.1178 +             "doTestZoomedScroll: The detail of horizontal MozMousePixelScroll for pixel wheel event is wrong");
  1.1179 +        } else if (aEvent.axis == MouseScrollEvent.VERTICAL_AXIS) {
  1.1180 +          is(aEvent.detail, 16,
  1.1181 +             "doTestZoomedScroll: The detail of vertical MozMousePixelScroll for pixel wheel event is wrong");
  1.1182 +        } else {
  1.1183 +          ok(false, "doTestZoomedScroll: The axis of MozMousePixelScroll for pixel wheel event is invalid, got " + aEvent.axis);
  1.1184 +        }
  1.1185 +      }
  1.1186 +      function wheelHandler(aEvent)
  1.1187 +      {
  1.1188 +        is(aEvent.deltaX, 16.0 / zoom,
  1.1189 +           "doTestZoomedScroll: The deltaX of wheel for pixel is wrong");
  1.1190 +        is(aEvent.deltaY, 16.0 / zoom,
  1.1191 +           "doTestZoomedScroll: The deltaY of wheel for pixel is wrong");
  1.1192 +      }
  1.1193 +      window.addEventListener("MozMousePixelScroll", mousePixelScrollHandler, true);
  1.1194 +      window.addEventListener("wheel", wheelHandler, true);
  1.1195 +      synthesizeWheel(gScrollableElement, 10, 10,
  1.1196 +        { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
  1.1197 +          deltaX: 16.0, deltaY: 16.0, lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 });
  1.1198 +      // wait scrolled actually.
  1.1199 +      hitEventLoop(function () {
  1.1200 +        var scrolledX = gScrollableElement.scrollLeft;
  1.1201 +        var scrolledY = gScrollableElement.scrollTop;
  1.1202 +        ok(scrolledX > 1000,
  1.1203 +           "doTestZoomedScroll: scrolledX must be larger than 1000 for pixel wheel event, got " + scrolledX);
  1.1204 +        ok(scrolledY > 1000,
  1.1205 +           "doTestZoomedScroll: scrolledY must be larger than 1000 for pixel wheel event, got " + scrolledY);
  1.1206 +
  1.1207 +        // Zoom
  1.1208 +        setFullZoom(window, 2.0);
  1.1209 +        // Ensure not to be in reflow.
  1.1210 +        hitEventLoop(function () {
  1.1211 +          gScrollableElement.scrollTop = 1000;
  1.1212 +          gScrollableElement.scrollLeft = 1000;
  1.1213 +          synthesizeWheel(gScrollableElement, 10, 10,
  1.1214 +            { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
  1.1215 +              deltaX: 16.0, deltaY: 16.0, lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 });
  1.1216 +          // wait scrolled actually.
  1.1217 +          hitEventLoop(function () {
  1.1218 +            ok(Math.abs(gScrollableElement.scrollLeft - (1000 + (scrolledX - 1000) / 2)) <= 1,
  1.1219 +               "doTestZoomedScroll: zoomed horizontal scroll amount by pixel wheel event is different from normal, scrollLeft=" +
  1.1220 +                 gScrollableElement.scrollLeft + ", scrolledX=" + scrolledX);
  1.1221 +            ok(Math.abs(gScrollableElement.scrollTop - (1000 + (scrolledY - 1000) / 2)) <= 1,
  1.1222 +               "doTestZoomedScroll: zoomed vertical scroll amount by pixel wheel event is different from normal, scrollTop=" +
  1.1223 +                 gScrollableElement.scrollTop + ", scrolledY=" + scrolledY);
  1.1224 +            window.removeEventListener("MozMousePixelScroll", mousePixelScrollHandler, true);
  1.1225 +            window.removeEventListener("wheel", wheelHandler, true);
  1.1226 +
  1.1227 +            synthesizeKey("0", { accelKey: true });
  1.1228 +            onZoomReset(prepareTestZoomedLineScroll);
  1.1229 +          }, 20);
  1.1230 +        }, 20);
  1.1231 +      }, 20);
  1.1232 +    }, 20);
  1.1233 +  }
  1.1234 +
  1.1235 +  function prepareTestZoomedLineScroll()
  1.1236 +  {
  1.1237 +    // Reset zoom and store the scroll amount into the data.
  1.1238 +    synthesizeKey("0", { accelKey: true });
  1.1239 +    zoom = 1.0;
  1.1240 +    onZoomReset(testZoomedLineScroll);
  1.1241 +  }
  1.1242 +  function testZoomedLineScroll()
  1.1243 +  {
  1.1244 +    gScrollableElement.scrollTop = 1000;
  1.1245 +    gScrollableElement.scrollLeft = 1000;
  1.1246 +    // Ensure not to be in reflow.
  1.1247 +    hitEventLoop(function () {
  1.1248 +      var lineHeightX, lineHeightY;
  1.1249 +      function handler(aEvent)
  1.1250 +      {
  1.1251 +        if (aEvent.axis == MouseScrollEvent.HORIZONTAL_AXIS) {
  1.1252 +          if (lineHeightX == undefined) {
  1.1253 +            lineHeightX = aEvent.detail;
  1.1254 +          } else {
  1.1255 +            ok(Math.abs(aEvent.detail - lineHeightX) <= 1,
  1.1256 +               "doTestZoomedScroll: The detail of horizontal MozMousePixelScroll for line wheel event is wrong, aEvent.detail=" +
  1.1257 +                 aEvent.detail + ", lineHeightX=" + lineHeightX);
  1.1258 +          }
  1.1259 +        } else if (aEvent.axis == MouseScrollEvent.VERTICAL_AXIS) {
  1.1260 +          if (lineHeightY == undefined) {
  1.1261 +            lineHeightY = aEvent.detail;
  1.1262 +          } else {
  1.1263 +            ok(Math.abs(aEvent.detail - lineHeightY) <= 1,
  1.1264 +               "doTestZoomedScroll: The detail of vertical MozMousePixelScroll for line wheel event is wrong, aEvent.detail=" +
  1.1265 +                 aEvent.detail + ", lineHeightY=" + lineHeightY);
  1.1266 +          }
  1.1267 +        } else {
  1.1268 +          ok(false, "doTestZoomedScroll: The axis of MozMousePixelScroll for line wheel event is invalid, got " + aEvent.axis);
  1.1269 +        }
  1.1270 +      }
  1.1271 +      window.addEventListener("MozMousePixelScroll", handler, true);
  1.1272 +      synthesizeWheel(gScrollableElement, 10, 10,
  1.1273 +        { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1274 +          deltaX: 1.0, deltaY: 1.0, lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 });
  1.1275 +      // wait scrolled actually.
  1.1276 +      hitEventLoop(function () {
  1.1277 +        var scrolledX = gScrollableElement.scrollLeft;
  1.1278 +        var scrolledY = gScrollableElement.scrollTop;
  1.1279 +        ok(scrolledX > 1000,
  1.1280 +           "doTestZoomedScroll: scrolledX must be larger than 1000 for line wheel event, got " + scrolledX);
  1.1281 +        ok(scrolledY > 1000,
  1.1282 +           "doTestZoomedScroll: scrolledY must be larger than 1000 for line wheel event, got " + scrolledY);
  1.1283 +
  1.1284 +        // Zoom
  1.1285 +        setFullZoom(window, 2.0);
  1.1286 +        // Ensure not to be in reflow.
  1.1287 +        hitEventLoop(function () {
  1.1288 +          gScrollableElement.scrollTop = 1000;
  1.1289 +          gScrollableElement.scrollLeft = 1000;
  1.1290 +          synthesizeWheel(gScrollableElement, 10, 10,
  1.1291 +            { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1292 +              deltaX: 1.0, deltaY: 1.0, lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 });
  1.1293 +          // wait scrolled actually.
  1.1294 +          hitEventLoop(function () {
  1.1295 +            ok(Math.abs(gScrollableElement.scrollLeft - scrolledX) <= 1,
  1.1296 +               "doTestZoomedScroll: zoomed horizontal scroll amount by line wheel event is different from normal, scrollLeft=" +
  1.1297 +                 gScrollableElement.scrollLeft + ", scrolledX=" + scrolledX);
  1.1298 +            ok(Math.abs(gScrollableElement.scrollTop - scrolledY) <= 1,
  1.1299 +               "doTestZoomedScroll: zoomed vertical scroll amount by line wheel event is different from normal, scrollTop=" +
  1.1300 +                 gScrollableElement.scrollTop + ", scrolledY=" + scrolledY);
  1.1301 +
  1.1302 +            window.removeEventListener("MozMousePixelScroll", handler, true);
  1.1303 +
  1.1304 +            synthesizeKey("0", { accelKey: true });
  1.1305 +            onZoomReset(aCallback);
  1.1306 +          }, 20);
  1.1307 +        }, 20);
  1.1308 +      }, 20);
  1.1309 +    }, 20);
  1.1310 +  }
  1.1311 +
  1.1312 +  // XXX It's too difficult to test page scroll because the page scroll amount
  1.1313 +  //     is computed by complex logic.
  1.1314 +
  1.1315 +  prepareTestZoomedPixelScroll();
  1.1316 +}
  1.1317 +
  1.1318 +function doTestWholeScroll(aCallback)
  1.1319 +{
  1.1320 +  SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_x", 99999999);
  1.1321 +  SpecialPowers.setIntPref("mousewheel.default.delta_multiplier_y", 99999999);
  1.1322 +
  1.1323 +  const kTests = [
  1.1324 +    { description: "try whole-scroll to top (line)",
  1.1325 +      prepare: function () {
  1.1326 +        gScrollableElement.scrollTop = 1000;
  1.1327 +        gScrollableElement.scrollLeft = 1000;
  1.1328 +      },
  1.1329 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1330 +               deltaX: 0.0, deltaY: -1.0,
  1.1331 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: -1 },
  1.1332 +      expectedScrollTop: 0,
  1.1333 +      expectedScrollLeft: 1000
  1.1334 +    },
  1.1335 +    { description: "try whole-scroll to top when scrollTop is already top-most (line)",
  1.1336 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1337 +               deltaX: 0.0, deltaY: -1.0,
  1.1338 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: -1 },
  1.1339 +      expectedScrollTop: 0,
  1.1340 +      expectedScrollLeft: 1000
  1.1341 +    },
  1.1342 +    { description: "try whole-scroll to bottom (line)",
  1.1343 +      prepare: function () {
  1.1344 +        gScrollableElement.scrollTop = 1000;
  1.1345 +        gScrollableElement.scrollLeft = 1000;
  1.1346 +      },
  1.1347 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1348 +               deltaX: 0.0, deltaY: 1.0,
  1.1349 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1 },
  1.1350 +      expectedScrollTop: gScrollableElement.scrollTopMax,
  1.1351 +      expectedScrollLeft: 1000
  1.1352 +    },
  1.1353 +    { description: "try whole-scroll to bottom when scrollTop is already bottom-most (line)",
  1.1354 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1355 +               deltaX: 0, deltaY: 1.0,
  1.1356 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1 },
  1.1357 +      expectedScrollTop: gScrollableElement.scrollTopMax,
  1.1358 +      expectedScrollLeft: 1000
  1.1359 +    },
  1.1360 +    { description: "try whole-scroll to left (line)",
  1.1361 +      prepare: function () {
  1.1362 +        gScrollableElement.scrollTop = 1000;
  1.1363 +        gScrollableElement.scrollLeft = 1000;
  1.1364 +      },
  1.1365 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1366 +               deltaX: -1.0, deltaY: 0.0,
  1.1367 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: 0 },
  1.1368 +      expectedScrollTop: 1000,
  1.1369 +      expectedScrollLeft: 0
  1.1370 +    },
  1.1371 +    { description: "try whole-scroll to left when scrollLeft is already left-most (line)",
  1.1372 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1373 +               deltaX: -1.0, deltaY: 0,
  1.1374 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: 0 },
  1.1375 +      expectedScrollTop: 1000,
  1.1376 +      expectedScrollLeft: 0
  1.1377 +    },
  1.1378 +    { description: "try whole-scroll to right (line)",
  1.1379 +      prepare: function () {
  1.1380 +        gScrollableElement.scrollTop = 1000;
  1.1381 +        gScrollableElement.scrollLeft = 1000;
  1.1382 +      },
  1.1383 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1384 +               deltaX: 1.0, deltaY: 0.0,
  1.1385 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 0 },
  1.1386 +      expectedScrollTop: 1000,
  1.1387 +      expectedScrollLeft: gScrollableElement.scrollLeftMax
  1.1388 +    },
  1.1389 +    { description: "try whole-scroll to right when scrollLeft is already right-most (line)",
  1.1390 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1391 +               deltaX: 1.0, deltaY: 0.0,
  1.1392 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 0 },
  1.1393 +      expectedScrollTop: 1000,
  1.1394 +      expectedScrollLeft: gScrollableElement.scrollLeftMax
  1.1395 +    },
  1.1396 +
  1.1397 +
  1.1398 +    { description: "try whole-scroll to top (pixel)",
  1.1399 +      prepare: function () {
  1.1400 +        gScrollableElement.scrollTop = 1000;
  1.1401 +        gScrollableElement.scrollLeft = 1000;
  1.1402 +      },
  1.1403 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
  1.1404 +               deltaX: 0.0, deltaY: -1.0,
  1.1405 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
  1.1406 +      expectedScrollTop: 0,
  1.1407 +      expectedScrollLeft: 1000
  1.1408 +    },
  1.1409 +    { description: "try whole-scroll to top when scrollTop is already top-most (pixel)",
  1.1410 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
  1.1411 +               deltaX: 0.0, deltaY: -1.0,
  1.1412 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
  1.1413 +      expectedScrollTop: 0,
  1.1414 +      expectedScrollLeft: 1000
  1.1415 +    },
  1.1416 +    { description: "try whole-scroll to bottom (pixel)",
  1.1417 +      prepare: function () {
  1.1418 +        gScrollableElement.scrollTop = 1000;
  1.1419 +        gScrollableElement.scrollLeft = 1000;
  1.1420 +      },
  1.1421 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
  1.1422 +               deltaX: 0.0, deltaY: 1.0,
  1.1423 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
  1.1424 +      expectedScrollTop: gScrollableElement.scrollTopMax,
  1.1425 +      expectedScrollLeft: 1000
  1.1426 +    },
  1.1427 +    { description: "try whole-scroll to bottom when scrollTop is already bottom-most (pixel)",
  1.1428 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
  1.1429 +               deltaX: 0, deltaY: 1.0,
  1.1430 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
  1.1431 +      expectedScrollTop: gScrollableElement.scrollTopMax,
  1.1432 +      expectedScrollLeft: 1000
  1.1433 +    },
  1.1434 +    { description: "try whole-scroll to left (pixel)",
  1.1435 +      prepare: function () {
  1.1436 +        gScrollableElement.scrollTop = 1000;
  1.1437 +        gScrollableElement.scrollLeft = 1000;
  1.1438 +      },
  1.1439 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
  1.1440 +               deltaX: -1.0, deltaY: 0.0,
  1.1441 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
  1.1442 +      expectedScrollTop: 1000,
  1.1443 +      expectedScrollLeft: 0
  1.1444 +    },
  1.1445 +    { description: "try whole-scroll to left when scrollLeft is already left-most (pixel)",
  1.1446 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
  1.1447 +               deltaX: -1.0, deltaY: 0,
  1.1448 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
  1.1449 +      expectedScrollTop: 1000,
  1.1450 +      expectedScrollLeft: 0
  1.1451 +    },
  1.1452 +    { description: "try whole-scroll to right (pixel)",
  1.1453 +      prepare: function () {
  1.1454 +        gScrollableElement.scrollTop = 1000;
  1.1455 +        gScrollableElement.scrollLeft = 1000;
  1.1456 +      },
  1.1457 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
  1.1458 +               deltaX: 1.0, deltaY: 0.0,
  1.1459 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
  1.1460 +      expectedScrollTop: 1000,
  1.1461 +      expectedScrollLeft: gScrollableElement.scrollLeftMax
  1.1462 +    },
  1.1463 +    { description: "try whole-scroll to right when scrollLeft is already right-most (pixel)",
  1.1464 +      event: { deltaMode: WheelEvent.DOM_DELTA_PIXEL,
  1.1465 +               deltaX: 1.0, deltaY: 0.0,
  1.1466 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 0 },
  1.1467 +      expectedScrollTop: 1000,
  1.1468 +      expectedScrollLeft: gScrollableElement.scrollLeftMax
  1.1469 +    },
  1.1470 +
  1.1471 +
  1.1472 +    { description: "try whole-scroll to top (page)",
  1.1473 +      prepare: function () {
  1.1474 +        gScrollableElement.scrollTop = 1000;
  1.1475 +        gScrollableElement.scrollLeft = 1000;
  1.1476 +      },
  1.1477 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1478 +               deltaX: 0.0, deltaY: -1.0,
  1.1479 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: -1 },
  1.1480 +      expectedScrollTop: 0,
  1.1481 +      expectedScrollLeft: 1000
  1.1482 +    },
  1.1483 +    { description: "try whole-scroll to top when scrollTop is already top-most (page)",
  1.1484 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1485 +               deltaX: 0.0, deltaY: -1.0,
  1.1486 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: -1 },
  1.1487 +      expectedScrollTop: 0,
  1.1488 +      expectedScrollLeft: 1000
  1.1489 +    },
  1.1490 +    { description: "try whole-scroll to bottom (page)",
  1.1491 +      prepare: function () {
  1.1492 +        gScrollableElement.scrollTop = 1000;
  1.1493 +        gScrollableElement.scrollLeft = 1000;
  1.1494 +      },
  1.1495 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1496 +               deltaX: 0.0, deltaY: 1.0,
  1.1497 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1 },
  1.1498 +      expectedScrollTop: gScrollableElement.scrollTopMax,
  1.1499 +      expectedScrollLeft: 1000
  1.1500 +    },
  1.1501 +    { description: "try whole-scroll to bottom when scrollTop is already bottom-most (page)",
  1.1502 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1503 +               deltaX: 0, deltaY: 1.0,
  1.1504 +               lineOrPageDeltaX: 0, lineOrPageDeltaY: 1 },
  1.1505 +      expectedScrollTop: gScrollableElement.scrollTopMax,
  1.1506 +      expectedScrollLeft: 1000
  1.1507 +    },
  1.1508 +    { description: "try whole-scroll to left (page)",
  1.1509 +      prepare: function () {
  1.1510 +        gScrollableElement.scrollTop = 1000;
  1.1511 +        gScrollableElement.scrollLeft = 1000;
  1.1512 +      },
  1.1513 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1514 +               deltaX: -1.0, deltaY: 0.0,
  1.1515 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: 0 },
  1.1516 +      expectedScrollTop: 1000,
  1.1517 +      expectedScrollLeft: 0
  1.1518 +    },
  1.1519 +    { description: "try whole-scroll to left when scrollLeft is already left-most (page)",
  1.1520 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1521 +               deltaX: -1.0, deltaY: 0,
  1.1522 +               lineOrPageDeltaX: -1, lineOrPageDeltaY: 0 },
  1.1523 +      expectedScrollTop: 1000,
  1.1524 +      expectedScrollLeft: 0
  1.1525 +    },
  1.1526 +    { description: "try whole-scroll to right (page)",
  1.1527 +      prepare: function () {
  1.1528 +        gScrollableElement.scrollTop = 1000;
  1.1529 +        gScrollableElement.scrollLeft = 1000;
  1.1530 +      },
  1.1531 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1532 +               deltaX: 1.0, deltaY: 0.0,
  1.1533 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 0 },
  1.1534 +      expectedScrollTop: 1000,
  1.1535 +      expectedScrollLeft: gScrollableElement.scrollLeftMax
  1.1536 +    },
  1.1537 +    { description: "try whole-scroll to right when scrollLeft is already right-most (page)",
  1.1538 +      event: { deltaMode: WheelEvent.DOM_DELTA_PAGE,
  1.1539 +               deltaX: 1.0, deltaY: 0.0,
  1.1540 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 0 },
  1.1541 +      expectedScrollTop: 1000,
  1.1542 +      expectedScrollLeft: gScrollableElement.scrollLeftMax
  1.1543 +    },
  1.1544 +  ];
  1.1545 +
  1.1546 +  var index = 0;
  1.1547 +
  1.1548 +  function doIt()
  1.1549 +  {
  1.1550 +    const kTest = kTests[index];
  1.1551 +    if (kTest.prepare) {
  1.1552 +      kTest.prepare();
  1.1553 +    }
  1.1554 +    synthesizeWheel(gScrollableElement, 10, 10, kTest.event);
  1.1555 +    hitEventLoop(function () {
  1.1556 +      is(gScrollableElement.scrollTop, kTest.expectedScrollTop,
  1.1557 +         "doTestWholeScroll, " + kTest.description + ": unexpected scrollTop");
  1.1558 +      is(gScrollableElement.scrollLeft, kTest.expectedScrollLeft,
  1.1559 +         "doTestWholeScroll, " + kTest.description + ": unexpected scrollLeft");
  1.1560 +      if (++index == kTests.length) {
  1.1561 +        SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_x");
  1.1562 +        SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_y");
  1.1563 +        SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_z");
  1.1564 +        SimpleTest.executeSoon(aCallback);
  1.1565 +      } else {
  1.1566 +        doIt();
  1.1567 +      }
  1.1568 +    }, 20);
  1.1569 +  }
  1.1570 +  doIt();
  1.1571 +}
  1.1572 +
  1.1573 +function doTestActionOverride(aCallback)
  1.1574 +{
  1.1575 +  const kNoScroll    = 0x00;
  1.1576 +  const kScrollUp    = 0x01;
  1.1577 +  const kScrollDown  = 0x02;
  1.1578 +  const kScrollLeft  = 0x04;
  1.1579 +  const kScrollRight = 0x08;
  1.1580 +
  1.1581 +  const kTests = [
  1.1582 +    { action: 1, override_x: -1,
  1.1583 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1584 +               deltaX: 1.0, deltaY: 1.0,
  1.1585 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1586 +      expected: kScrollDown | kScrollRight
  1.1587 +    },
  1.1588 +    { action: 1, override_x: 0,
  1.1589 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1590 +               deltaX: 1.0, deltaY: 1.0,
  1.1591 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1592 +      expected: kScrollDown | kScrollRight
  1.1593 +    },
  1.1594 +    { action: 1, override_x: 1,
  1.1595 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1596 +               deltaX: 1.0, deltaY: 1.0,
  1.1597 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1598 +      expected: kScrollDown | kScrollRight
  1.1599 +    },
  1.1600 +    { action: 0, override_x: -1,
  1.1601 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1602 +               deltaX: 1.0, deltaY: 1.0,
  1.1603 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1604 +      expected: kNoScroll
  1.1605 +    },
  1.1606 +    { action: 0, override_x: 0,
  1.1607 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1608 +               deltaX: 1.0, deltaY: 1.0,
  1.1609 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1610 +      expected: kNoScroll
  1.1611 +    },
  1.1612 +    { action: 0, override_x: 1,
  1.1613 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1614 +               deltaX: 1.0, deltaY: 1.0,
  1.1615 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1616 +      expected: kNoScroll
  1.1617 +    },
  1.1618 +    { action: 1, override_x: -1,
  1.1619 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1620 +               deltaX: 1.0, deltaY: 0.5,
  1.1621 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1622 +      expected: kScrollDown | kScrollRight
  1.1623 +    },
  1.1624 +    { action: 1, override_x: 0,
  1.1625 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1626 +               deltaX: 1.0, deltaY: 0.5,
  1.1627 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1628 +      expected: kNoScroll
  1.1629 +    },
  1.1630 +    { action: 1, override_x: 1,
  1.1631 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1632 +               deltaX: 1.0, deltaY: 0.5,
  1.1633 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1634 +      expected: kScrollDown | kScrollRight
  1.1635 +    },
  1.1636 +    { action: 0, override_x: -1,
  1.1637 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1638 +               deltaX: 1.0, deltaY: 0.5,
  1.1639 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1640 +      expected: kNoScroll
  1.1641 +    },
  1.1642 +    { action: 0, override_x: 0,
  1.1643 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1644 +               deltaX: 1.0, deltaY: 0.5,
  1.1645 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1646 +      expected: kNoScroll
  1.1647 +    },
  1.1648 +    { action: 0, override_x: 1,
  1.1649 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1650 +               deltaX: 1.0, deltaY: 0.5,
  1.1651 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1652 +      expected: kScrollDown | kScrollRight
  1.1653 +    },
  1.1654 +    { action: 1, override_x: -1,
  1.1655 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1656 +               deltaX: 0.5, deltaY: 1.0,
  1.1657 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1658 +      expected: kScrollDown | kScrollRight
  1.1659 +    },
  1.1660 +    { action: 1, override_x: 0,
  1.1661 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1662 +               deltaX: 0.5, deltaY: 1.0,
  1.1663 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1664 +      expected: kScrollDown | kScrollRight
  1.1665 +    },
  1.1666 +    { action: 1, override_x: 1,
  1.1667 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1668 +               deltaX: 0.5, deltaY: 1.0,
  1.1669 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1670 +      expected: kScrollDown | kScrollRight
  1.1671 +    },
  1.1672 +    { action: 0, override_x: -1,
  1.1673 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1674 +               deltaX: 0.5, deltaY: 1.0,
  1.1675 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1676 +      expected: kNoScroll
  1.1677 +    },
  1.1678 +    { action: 0, override_x: 0,
  1.1679 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1680 +               deltaX: 0.5, deltaY: 1.0,
  1.1681 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1682 +      expected: kNoScroll
  1.1683 +    },
  1.1684 +    { action: 0, override_x: 1,
  1.1685 +      event: { deltaMode: WheelEvent.DOM_DELTA_LINE,
  1.1686 +               deltaX: 0.5, deltaY: 1.0,
  1.1687 +               lineOrPageDeltaX: 1, lineOrPageDeltaY: 1 },
  1.1688 +      expected: kNoScroll
  1.1689 +    },
  1.1690 +  ];
  1.1691 +
  1.1692 +  var index = 0;
  1.1693 +
  1.1694 +  function doIt()
  1.1695 +  {
  1.1696 +    const kTest = kTests[index];
  1.1697 +    description = "doTestActionOverride(action=" + kTest.action + ", " +
  1.1698 +                  "override_x=" + kTest.override_x + ", " +
  1.1699 +                  "deltaX=" + kTest.event.deltaX + ", " +
  1.1700 +                  "deltaY=" + kTest.event.deltaY + "): ";
  1.1701 +    SpecialPowers.setIntPref("mousewheel.default.action", kTest.action);
  1.1702 +    SpecialPowers.setIntPref("mousewheel.default.action.override_x", kTest.override_x);
  1.1703 +    gScrollableElement.scrollTop = 1000;
  1.1704 +    gScrollableElement.scrollLeft = 1000;
  1.1705 +    synthesizeWheel(gScrollableElement, 10, 10, kTest.event);
  1.1706 +    hitEventLoop(function () {
  1.1707 +      if (kTest.expected & kScrollUp) {
  1.1708 +        ok(gScrollableElement.scrollTop < 1000, description + "not scrolled up, got " + gScrollableElement.scrollTop);
  1.1709 +      } else if (kTest.expected & kScrollDown) {
  1.1710 +        ok(gScrollableElement.scrollTop > 1000, description + "not scrolled down, got " + gScrollableElement.scrollTop);
  1.1711 +      } else {
  1.1712 +        is(gScrollableElement.scrollTop, 1000, description + "scrolled vertical");
  1.1713 +      }
  1.1714 +      if (kTest.expected & kScrollLeft) {
  1.1715 +        ok(gScrollableElement.scrollLeft < 1000, description + "not scrolled to left, got " + gScrollableElement.scrollLeft);
  1.1716 +      } else if (kTest.expected & kScrollRight) {
  1.1717 +        ok(gScrollableElement.scrollLeft > 1000, description + "not scrolled to right, got " + gScrollableElement.scrollLeft);
  1.1718 +      } else {
  1.1719 +        is(gScrollableElement.scrollLeft, 1000, description + "scrolled horizontal");
  1.1720 +      }
  1.1721 +      if (++index == kTests.length) {
  1.1722 +        SpecialPowers.setIntPref("mousewheel.default.action", 1);
  1.1723 +        SpecialPowers.setIntPref("mousewheel.default.action.override_x", -1);
  1.1724 +        SimpleTest.executeSoon(aCallback);
  1.1725 +      } else {
  1.1726 +        doIt();
  1.1727 +      }
  1.1728 +    }, 20);
  1.1729 +  }
  1.1730 +  doIt();
  1.1731 +}
  1.1732 +
  1.1733 +function runTests()
  1.1734 +{
  1.1735 +  SpecialPowers.setBoolPref("general.smoothScroll", false);
  1.1736 +
  1.1737 +  SpecialPowers.setIntPref("mousewheel.default.action", 1);      // scroll
  1.1738 +  SpecialPowers.setIntPref("mousewheel.default.action.override_x", -1);
  1.1739 +  SpecialPowers.setIntPref("mousewheel.with_shift.action", 2);   // history
  1.1740 +  SpecialPowers.setIntPref("mousewheel.with_shift.action.override_x", -1);
  1.1741 +  SpecialPowers.setIntPref("mousewheel.with_control.action", 3); // zoom
  1.1742 +  SpecialPowers.setIntPref("mousewheel.with_control.action.override_x", -1);
  1.1743 +
  1.1744 +  const kSettings = [
  1.1745 +    { description: "all delta values are not customized",
  1.1746 +      deltaMultiplierX:  1.0, deltaMultiplierY:  1.0, deltaMultiplierZ:  1.0 },
  1.1747 +    { description: "deltaX is reverted",
  1.1748 +      deltaMultiplierX: -1.0, deltaMultiplierY:  1.0, deltaMultiplierZ:  1.0 },
  1.1749 +    { description: "deltaY is reverted",
  1.1750 +      deltaMultiplierX:  1.0, deltaMultiplierY: -1.0, deltaMultiplierZ:  1.0 },
  1.1751 +    { description: "deltaZ is reverted",
  1.1752 +      deltaMultiplierX:  1.0, deltaMultiplierY:  1.0, deltaMultiplierZ: -1.0 },
  1.1753 +    { description: "deltaX is 2.0",
  1.1754 +      deltaMultiplierX:  2.0, deltaMultiplierY:  1.0, deltaMultiplierZ:  1.0 },
  1.1755 +    { description: "deltaY is 2.0",
  1.1756 +      deltaMultiplierX:  1.0, deltaMultiplierY:  2.0, deltaMultiplierZ:  1.0 },
  1.1757 +    { description: "deltaZ is 2.0",
  1.1758 +      deltaMultiplierX:  1.0, deltaMultiplierY:  1.0, deltaMultiplierZ:  2.0 },
  1.1759 +    { description: "deltaX is -2.0",
  1.1760 +      deltaMultiplierX: -2.0, deltaMultiplierY:  1.0, deltaMultiplierZ:  1.0 },
  1.1761 +    { description: "deltaY is -2.0",
  1.1762 +      deltaMultiplierX:  1.0, deltaMultiplierY: -2.0, deltaMultiplierZ:  1.0 },
  1.1763 +    { description: "deltaZ is -2.0",
  1.1764 +      deltaMultiplierX:  1.0, deltaMultiplierY:  1.0, deltaMultiplierZ: -2.0 },
  1.1765 +  ];
  1.1766 +
  1.1767 +  var index = 0;
  1.1768 +
  1.1769 +  function doTest() {
  1.1770 +    setDeltaMultiplierSettings(kSettings[index]);
  1.1771 +    doTestScroll(kSettings[index], function () {
  1.1772 +      doTestZoom(kSettings[index], function() {
  1.1773 +        if (++index == kSettings.length) {
  1.1774 +          setDeltaMultiplierSettings(kSettings[0]);
  1.1775 +          doTestZoomedScroll(function() {
  1.1776 +            doTestWholeScroll(function() {
  1.1777 +              doTestActionOverride(function() {
  1.1778 +                finishTests();
  1.1779 +              });
  1.1780 +            });
  1.1781 +          });
  1.1782 +        } else {
  1.1783 +          doTest();
  1.1784 +        }
  1.1785 +      });
  1.1786 +    });
  1.1787 +  }
  1.1788 +  doTest();
  1.1789 +}
  1.1790 +
  1.1791 +function finishTests()
  1.1792 +{
  1.1793 +  SpecialPowers.clearUserPref("general.smoothScroll");
  1.1794 +
  1.1795 +  SpecialPowers.clearUserPref("mousewheel.default.action");
  1.1796 +  SpecialPowers.clearUserPref("mousewheel.default.action.override_x");
  1.1797 +  SpecialPowers.clearUserPref("mousewheel.with_shift.action");
  1.1798 +  SpecialPowers.clearUserPref("mousewheel.with_shift.action.override_x");
  1.1799 +  SpecialPowers.clearUserPref("mousewheel.with_control.action");
  1.1800 +  SpecialPowers.clearUserPref("mousewheel.with_control.action.override_x");
  1.1801 +
  1.1802 +  SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_x");
  1.1803 +  SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_y");
  1.1804 +  SpecialPowers.clearUserPref("mousewheel.default.delta_multiplier_z");
  1.1805 +  SpecialPowers.clearUserPref("mousewheel.with_alt.delta_multiplier_x");
  1.1806 +  SpecialPowers.clearUserPref("mousewheel.with_alt.delta_multiplier_y");
  1.1807 +  SpecialPowers.clearUserPref("mousewheel.with_alt.delta_multiplier_z");
  1.1808 +  SpecialPowers.clearUserPref("mousewheel.with_control.delta_multiplier_x");
  1.1809 +  SpecialPowers.clearUserPref("mousewheel.with_control.delta_multiplier_y");
  1.1810 +  SpecialPowers.clearUserPref("mousewheel.with_control.delta_multiplier_z");
  1.1811 +  SpecialPowers.clearUserPref("mousewheel.with_meta.delta_multiplier_x");
  1.1812 +  SpecialPowers.clearUserPref("mousewheel.with_meta.delta_multiplier_y");
  1.1813 +  SpecialPowers.clearUserPref("mousewheel.with_meta.delta_multiplier_z");
  1.1814 +  SpecialPowers.clearUserPref("mousewheel.with_shift.delta_multiplier_x");
  1.1815 +  SpecialPowers.clearUserPref("mousewheel.with_shift.delta_multiplier_y");
  1.1816 +  SpecialPowers.clearUserPref("mousewheel.with_shift.delta_multiplier_z");
  1.1817 +  SpecialPowers.clearUserPref("mousewheel.with_win.delta_multiplier_x");
  1.1818 +  SpecialPowers.clearUserPref("mousewheel.with_win.delta_multiplier_y");
  1.1819 +  SpecialPowers.clearUserPref("mousewheel.with_win.delta_multiplier_z");
  1.1820 +
  1.1821 +  winUtils.restoreNormalRefresh();
  1.1822 +
  1.1823 +  window.opener.finish();
  1.1824 +}
  1.1825 +
  1.1826 +</script>
  1.1827 +</pre>
  1.1828 +</body>
  1.1829 +</html>

mercurial