dom/events/test/test_dom_wheel_event.html

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

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

mercurial