dom/events/test/window_wheel_default_action.html

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

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

mercurial