diff options
Diffstat (limited to 'toolkit/content/tests/chrome/test_mousescroll.xul')
-rw-r--r-- | toolkit/content/tests/chrome/test_mousescroll.xul | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/toolkit/content/tests/chrome/test_mousescroll.xul b/toolkit/content/tests/chrome/test_mousescroll.xul new file mode 100644 index 000000000..91ccf5683 --- /dev/null +++ b/toolkit/content/tests/chrome/test_mousescroll.xul @@ -0,0 +1,274 @@ +<?xml version="1.0"?> +<?xml-stylesheet href="chrome://global/skin" type="text/css"?> +<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?> +<!-- +https://bugzilla.mozilla.org/show_bug.cgi?id=378028 +--> +<window title="Mozilla Bug 378028" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> + <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/> + <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/paint_listener.js"/> + + <!-- test results are displayed in the html:body --> + <body xmlns="http://www.w3.org/1999/xhtml"> + <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=378028" + target="_blank">Mozilla Bug 378028</a> + </body> + + <!-- richlistbox currently has no way of giving us a defined number of + rows, so we just choose an arbitrary height limit that should give + us plenty of vertical scrollability --> + <richlistbox id="richlistbox" style="height:50px;"> + <richlistitem id="richlistbox_item0" hidden="true"><label value="Item 0"/></richlistitem> + <richlistitem id="richlistbox_item1"><label value="Item 1"/></richlistitem> + <richlistitem id="richlistbox_item2"><label value="Item 2"/></richlistitem> + <richlistitem id="richlistbox_item3"><label value="Item 3"/></richlistitem> + <richlistitem id="richlistbox_item4"><label value="Item 4"/></richlistitem> + <richlistitem id="richlistbox_item5"><label value="Item 5"/></richlistitem> + <richlistitem id="richlistbox_item6"><label value="Item 6"/></richlistitem> + <richlistitem id="richlistbox_item7"><label value="Item 7"/></richlistitem> + <richlistitem id="richlistbox_item8"><label value="Item 8"/></richlistitem> + </richlistbox> + + <listbox id="listbox" rows="2"> + <listitem id="listbox_item0" label="Item 0" hidden="true"/> + <listitem id="listbox_item1" label="Item 1"/> + <listitem id="listbox_item2" label="Item 2"/> + <listitem id="listbox_item3" label="Item 3"/> + <listitem id="listbox_item4" label="Item 4"/> + <listitem id="listbox_item5" label="Item 5"/> + <listitem id="listbox_item6" label="Item 6"/> + <listitem id="listbox_item7" label="Item 7"/> + <listitem id="listbox_item8" label="Item 8"/> + </listbox> + + <box orient="horizontal"> + <arrowscrollbox id="hscrollbox" clicktoscroll="true" orient="horizontal" + smoothscroll="false" style="max-width:80px;" flex="1"> + <hbox style="width:40px; height:20px; background:black;" hidden="true"/> + <hbox style="width:40px; height:20px; background:white;"/> + <hbox style="width:40px; height:20px; background:black;"/> + <hbox style="width:40px; height:20px; background:white;"/> + <hbox style="width:40px; height:20px; background:black;"/> + <hbox style="width:40px; height:20px; background:white;"/> + <hbox style="width:40px; height:20px; background:black;"/> + <hbox style="width:40px; height:20px; background:white;"/> + <hbox style="width:40px; height:20px; background:black;"/> + </arrowscrollbox> + </box> + + <arrowscrollbox id="vscrollbox" clicktoscroll="true" orient="vertical" + smoothscroll="false" style="max-height:80px;" flex="1"> + <vbox style="width:100px; height:40px; background:black;" hidden="true"/> + <vbox style="width:100px; height:40px; background:white;"/> + <vbox style="width:100px; height:40px; background:black;"/> + <vbox style="width:100px; height:40px; background:white;"/> + <vbox style="width:100px; height:40px; background:black;"/> + <vbox style="width:100px; height:40px; background:white;"/> + <vbox style="width:100px; height:40px; background:black;"/> + <vbox style="width:100px; height:40px; background:white;"/> + <vbox style="width:100px; height:40px; background:black;"/> + <vbox style="width:100px; height:40px; background:white;"/> + <vbox style="width:100px; height:40px; background:black;"/> + </arrowscrollbox> + + <!-- test code goes here --> + <script type="application/javascript"><![CDATA[ + +/** Test for Bug 378028 **/ +/* and for Bug 350471 **/ +var smoothScrollPref = "general.smoothScroll"; +SpecialPowers.setBoolPref(smoothScrollPref, false); +SimpleTest.waitForExplicitFinish(); + +const deltaModes = [ + WheelEvent.DOM_DELTA_PIXEL, // 0 + WheelEvent.DOM_DELTA_LINE, // 1 + WheelEvent.DOM_DELTA_PAGE // 2 +]; + +function testListbox(id) +{ + var listbox = document.getElementById(id); + + function helper(aStart, aDelta, aIntDelta, aDeltaMode) + { + listbox.scrollToIndex(aStart); + synthesizeWheel(listbox, 10, 10, + { deltaMode: aDeltaMode, deltaY: aDelta, + lineOrPageDeltaY: aIntDelta }); + var expectedPos = aStart; + if (aIntDelta) { + if (aDeltaMode == WheelEvent.DOM_DELTA_PAGE) { + expectedPos += aIntDelta > 0 ? listbox.getNumberOfVisibleRows() : + -listbox.getNumberOfVisibleRows(); + } else { + expectedPos += aIntDelta; + } + } + is(listbox.getIndexOfFirstVisibleRow(), expectedPos, + "testListbox(" + id + "): vertical, starting " + aStart + + " delta " + aDelta + " lineOrPageDelta " + aIntDelta + + " aDeltaMode " + aDeltaMode); + + // Check that horizontal scrolling has no effect + listbox.scrollToIndex(aStart); + synthesizeWheel(listbox, 10, 10, + { deltaMode: aDeltaMode, deltaX: aDelta, + lineOrPageDeltaX: aIntDelta }); + is(listbox.getIndexOfFirstVisibleRow(), aStart, + "testListbox(" + id + "): horizontal, starting " + aStart + + " delta " + aDelta + " lineOrPageDelta " + aIntDelta + + " aDeltaMode " + aDeltaMode); + } + deltaModes.forEach(function(aDeltaMode) { + let delta = (aDeltaMode == WheelEvent.DOM_DELTA_PIXEL) ? 5.0 : 0.3; + helper(5, -delta, 0, aDeltaMode); + helper(5, -delta, -1, aDeltaMode); + helper(5, delta, 1, aDeltaMode); + helper(5, delta, 0, aDeltaMode); + }); +} + +function testRichListbox(id, andThen) +{ + var listbox = document.getElementById(id); + var tests = []; + + var winUtils = SpecialPowers.getDOMWindowUtils(window); + winUtils.advanceTimeAndRefresh(100); + + function nextTest() { + var [aStart, aDelta, aIntDelta, aDeltaMode] = tests.shift(); + listbox.scrollToIndex(aStart); + + let event = { + deltaMode: aDeltaMode, + deltaY: aDelta, + lineOrPageDeltaY: aIntDelta + }; + sendWheelAndPaint(listbox, 10, 10, event, function() { + var change = listbox.getIndexOfFirstVisibleRow() - aStart; + var direction = (change > 0) - (change < 0); + var expected = (aDelta > 0) - (aDelta < 0); + is(direction, expected, + "testRichListbox(" + id + "): vertical, starting " + aStart + + " delta " + aDelta + " lineOrPageDeltaY " + aIntDelta + + " aDeltaMode " + aDeltaMode); + + // Check that horizontal scrolling has no effect + let event = { + deltaMode: aDeltaMode, + deltaX: aDelta, + lineOrPageDeltaX: aIntDelta + }; + + listbox.scrollToIndex(aStart); + sendWheelAndPaint(listbox, 10, 10, event, function() { + is(listbox.getIndexOfFirstVisibleRow(), aStart, + "testRichListbox(" + id + "): horizontal, starting " + aStart + + " delta " + aDelta + " lineOrPageDeltaX " + aIntDelta + + " aDeltaMode " + aDeltaMode); + + if (!tests.length) { + winUtils.restoreNormalRefresh(); + andThen(); + return; + } + + nextTest(); + }); + }); + } + + // richlistbox currently uses native XUL scrolling, so the "line" + // amounts don't necessarily correspond 1-to-1 with listbox items. So + // we just check that scrolling up/down scrolls in the right direction. + deltaModes.forEach(function(aDeltaMode) { + let delta = (aDeltaMode == WheelEvent.DOM_DELTA_PIXEL) ? 32.0 : 2.0; + tests.push([5, -delta, -1, aDeltaMode]); + tests.push([5, -delta, 0, aDeltaMode]); + tests.push([5, delta, 1, aDeltaMode]); + tests.push([5, delta, 0, aDeltaMode]); + }); + + nextTest(); +} + +function testArrowScrollbox(id) +{ + var scrollbox = document.getElementById(id); + var scrollBoxObject = scrollbox.scrollBoxObject; + var orient = scrollbox.getAttribute("orient"); + + function helper(aStart, aDelta, aDeltaMode, aExpected) + { + var lineOrPageDelta = (aDeltaMode == WheelEvent.DOM_DELTA_PIXEL) ? aDelta / 10 : aDelta; + var orientIsHorizontal = (orient == "horizontal"); + + scrollBoxObject.scrollTo(aStart, aStart); + + for (var i = orientIsHorizontal ? 2 : 0; i >= 0; i--) { + synthesizeWheel(scrollbox, 5, 5, + { deltaMode: aDeltaMode, deltaY: aDelta, + lineOrPageDeltaY: lineOrPageDelta }); + + var pos = orientIsHorizontal ? scrollBoxObject.positionX : + scrollBoxObject.positionY; + + // Note, vertical mouse scrolling is allowed to scroll horizontal + // arrowscrollboxes, because many users have no horizontal mouse scroll + // capability + let expected = !i ? aExpected : aStart; + is(pos, expected, + "testArrowScrollbox(" + id + "): vertical, starting " + aStart + + " delta " + aDelta + " lineOrPageDelta " + lineOrPageDelta + + " aDeltaMode " + aDeltaMode); + } + + scrollBoxObject.scrollTo(aStart, aStart); + for (var i = orientIsHorizontal ? 2 : 0; i >= 0; i--) { + synthesizeWheel(scrollbox, 5, 5, + { deltaMode: aDeltaMode, deltaX: aDelta, + lineOrPageDeltaX: lineOrPageDelta }); + // horizontal mouse scrolling is never allowed to scroll vertical + // arrowscrollboxes + var pos = orientIsHorizontal ? scrollBoxObject.positionX : + scrollBoxObject.positionY; + let expected = (!i && orientIsHorizontal) ? aExpected : aStart; + is(pos, expected, + "testArrowScrollbox(" + id + "): horizontal, starting " + aStart + + " delta " + aDelta + " lineOrPageDelta " + lineOrPageDelta + + " aDeltaMode " + aDeltaMode); + } + } + + var scrolledWidth = scrollBoxObject.scrolledWidth; + var scrolledHeight = scrollBoxObject.scrolledHeight; + var scrollMaxX = scrolledWidth - scrollBoxObject.width; + var scrollMaxY = scrolledHeight - scrollBoxObject.height; + var scrollMax = orient == "horizontal" ? scrollMaxX : scrollMaxY; + + deltaModes.forEach(function(aDeltaMode) { + helper(50, -1000, aDeltaMode, 0); + helper(50, 1000, aDeltaMode, scrollMax); + helper(50, 0, aDeltaMode, 50); + helper(50, 0, aDeltaMode, 50); + }); +} + +function runTests() +{ + testRichListbox("richlistbox", function() { + testListbox("listbox"); + testArrowScrollbox("hscrollbox"); + testArrowScrollbox("vscrollbox"); + SpecialPowers.clearUserPref(smoothScrollPref); + SimpleTest.finish(); + }); +} + +window.onload = function() { setTimeout(runTests, 0); }; + ]]></script> +</window> |