Source code

Revision control

Copy as Markdown

Other Tools

<?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();"
<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()
{
if (gIgnoreScrollEvent)
return;
gIgnoreScrollEvent = true;
clearTimer();
ok(gTests[gCurrentTestIndex].shouldScroll, "The view is scrolled");
gTimer = setTimeout(runNextTest, 0);
}
function onMouseScrollFailed()
{
clearTimer();
gIgnoreScrollEvent = true;
ok(!gTests[gCurrentTestIndex].shouldScroll, "The view is not scrolled");
if (!gTests[gCurrentTestIndex].shouldScroll)
gBody.removeChild(gView);
runNextTest();
}
function onTransactionTimeout()
{
if (!gTimer)
return;
gIgnoreScrollEvent = true;
retryAllTests();
}
]]>
</script>
</window>