<?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin" type="text/css"?> <window title="Mozilla Bug 478536" width="600" height="600" onload="onload();" onunload="onunload();" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" /> <script src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js" /> <script src="chrome://mochikit/content/tests/SimpleTest/paint_listener.js" /> <body xmlns="http://www.w3.org/1999/xhtml" id="body"> <style type="text/css"> #view { overflow: auto; width: 100px; height: 100px; border: 1px solid; margin: 0; } </style> <pre id="view" onscroll="onScrollView(event);"> Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. </pre> </body> <script class="testbody" type="application/javascript"> <![CDATA[ function ok(aCondition, aMessage) { window.arguments[0].SimpleTest.ok(aCondition, aMessage); } function is(aLeft, aRight, aMessage) { window.arguments[0].SimpleTest.is(aLeft, aRight, aMessage); } function isnot(aLeft, aRight, aMessage) { window.arguments[0].SimpleTest.isnot(aLeft, aRight, aMessage); } var gBody = document.getElementById("body"); var gView = document.getElementById("view"); /** * Description: * * First, lock the wheel scrolling target to "view" at first step. * Next, scroll back to top most of the "view" at second step. * Finally, scroll back again at third step. This fails to scroll the "view", * then, |onMouseScrollFailed| event should be fired. And at that time, we * can remove the "view". So, in post processing of the event firere, the * "view" should not be referred. * * For suppressing random test failure, all tests will be retried if we handle * unexpected timeout event. */ var gTests = [ { scrollToForward: true, shouldScroll: true }, { scrollToForward: false, shouldScroll: true }, { scrollToForward: false, shouldScroll: false } ]; var gCurrentTestIndex = -1; var gIgnoreScrollEvent = true; var gPrefSvc = SpecialPowers.Services.prefs; const kPrefSmoothScroll = "general.smoothScroll"; const kPrefNameTimeout = "mousewheel.transaction.timeout"; const kDefaultTimeout = gPrefSvc.getIntPref(kPrefNameTimeout); gPrefSvc.setBoolPref(kPrefSmoothScroll, false); var gTimeout = kDefaultTimeout; gBody.addEventListener("MozMouseScrollFailed", onMouseScrollFailed); gBody.addEventListener("MozMouseScrollTransactionTimeout", onTransactionTimeout); function setTimeoutPrefs(aTimeout) { gPrefSvc.setIntPref(kPrefNameTimeout, aTimeout); gTimeout = aTimeout; } function resetTimeoutPrefs() { if (gTimeout == kDefaultTimeout) return; setTimeoutPrefs(kDefaultTimeout); } function growUpTimeoutPrefs() { if (gTimeout != kDefaultTimeout) return; setTimeoutPrefs(5000); } function onload() { disableNonTestMouseEvents(true); setTimeout(runNextTest, 0); } function onunload() { resetTimeoutPrefs(); disableNonTestMouseEvents(false); gPrefSvc.clearUserPref(kPrefSmoothScroll); SpecialPowers.DOMWindowUtils.restoreNormalRefresh(); window.arguments[0].SimpleTest.finish(); } function finish() { window.close(); } // testing code var gTimer; function clearTimer() { clearTimeout(gTimer); gTimer = 0; } function runNextTest() { clearTimer(); if (++gCurrentTestIndex >= gTests.length) { ok(true, "didn't crash, succeeded"); finish(); return; } fireWheelScrollEvent(gTests[gCurrentTestIndex].scrollToForward); } var gRetryCount = 5; function retryAllTests() { clearTimer(); if (--gRetryCount >= 0) { gView.scrollTop = 0; gView.scrollLeft = 0; gCurrentTestIndex = -1; growUpTimeoutPrefs(); ok(true, "WARNING: retry current test-list..."); gTimer = setTimeout(runNextTest, 0); } else { ok(false, "Failed by unexpected timeout"); finish(); } } function fireWheelScrollEvent(aForward) { gIgnoreScrollEvent = false; var event = { deltaY: aForward ? 4.0 : -4.0, deltaMode: WheelEvent.DOM_DELTA_LINE }; sendWheelAndPaint(gView, 5, 5, event, function() { // No callback - we're just forcing the refresh driver to tick. }, window); } function onScrollView(aEvent) { if (gIgnoreScrollEvent) return; gIgnoreScrollEvent = true; clearTimer(); ok(gTests[gCurrentTestIndex].shouldScroll, "The view is scrolled"); gTimer = setTimeout(runNextTest, 0); } function onMouseScrollFailed(aEvent) { clearTimer(); gIgnoreScrollEvent = true; ok(!gTests[gCurrentTestIndex].shouldScroll, "The view is not scrolled"); if (!gTests[gCurrentTestIndex].shouldScroll) gBody.removeChild(gView); runNextTest(); } function onTransactionTimeout(aEvent) { if (!gTimer) return; gIgnoreScrollEvent = true; retryAllTests(); } ]]> </script> </window>