diff options
Diffstat (limited to 'widget/tests/window_wheeltransaction.xul')
-rw-r--r-- | widget/tests/window_wheeltransaction.xul | 1560 |
1 files changed, 0 insertions, 1560 deletions
diff --git a/widget/tests/window_wheeltransaction.xul b/widget/tests/window_wheeltransaction.xul deleted file mode 100644 index 8573eb3a4..000000000 --- a/widget/tests/window_wheeltransaction.xul +++ /dev/null @@ -1,1560 +0,0 @@ -<?xml version="1.0"?> -<?xml-stylesheet href="chrome://global/skin" type="text/css"?> -<window title="Wheel scroll tests" - width="600" height="600" - onload="onload();" - onunload="onunload();" - 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" /> - -<body xmlns="http://www.w3.org/1999/xhtml"> -<style type="text/css"> - #rootview { - overflow: auto; - width: 400px; - height: 400px; - border: 1px solid; - } - #container { - overflow: auto; - width: 600px; - height: 600px; - } - #rootview pre { - margin: 20px 0 20px 20px; - padding: 0; - overflow: auto; - display: block; - width: 100px; - height: 100.5px; - font-size: 16px; - } -</style> -<div id="rootview" onscroll="onScrollView(event);"> - <div id="container"> - <pre id="subview1" 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> - <pre id="subview2" onscroll="onScrollView(event);"> -Text. -Text. -Text. -Text. -Text. -Text. -Text. -Text. -Text. -Text. - </pre> - <pre id="subview3" onscroll="onScrollView(event);"> -Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. - </pre> - </div> -</div> -<div id="content" style="display: none"> -</div> -<pre id="test"> -</pre> -</body> - -<script class="testbody" type="application/javascript"> -<![CDATA[ - -function ok(aCondition, aMessage) -{ - window.opener.wrappedJSObject.SimpleTest.ok(aCondition, aMessage); -} - -function is(aLeft, aRight, aMessage) -{ - window.opener.wrappedJSObject.SimpleTest.is(aLeft, aRight, aMessage); -} - -function isnot(aLeft, aRight, aMessage) -{ - window.opener.wrappedJSObject.SimpleTest.isnot(aLeft, aRight, aMessage); -} - -var gCurrentTestListStatus = { nextListIndex: 0 }; -var gCurrentTest; - -const kListenEvent_None = 0; -const kListenEvent_OnScroll = 1; -const kListenEvent_OnScrollFailed = 2; -const kListenEvent_OnTransactionTimeout = 4; -const kListenEvent_All = kListenEvent_OnScroll | - kListenEvent_OnScrollFailed | - kListenEvent_OnTransactionTimeout; -var gLitesnEvents = kListenEvent_None; - -/** - * At unexpected transaction timeout, we need to stop *all* timers. But it is - * difficult and it can be create more complex testing code. So, we should use - * only one timer at one time. For that, we must store the timer id to this - * variable. And the functions which may be called via a timer must clear the - * current timer by |_clearTimer| function. - */ -var gTimer; - -var gPrefSvc = Components.classes["@mozilla.org/preferences-service;1"]. - getService(Components.interfaces.nsIPrefBranch); -const kPrefSmoothScroll = "general.smoothScroll"; -const kPrefNameTimeout = "mousewheel.transaction.timeout"; -const kPrefNameIgnoreMoveDelay = "mousewheel.transaction.ignoremovedelay"; -const kPrefTestEventsAsyncEnabled = "test.events.async.enabled"; - -const kDefaultTimeout = gPrefSvc.getIntPref(kPrefNameTimeout); -const kDefaultIgnoreMoveDelay = gPrefSvc.getIntPref(kPrefNameIgnoreMoveDelay); - -gPrefSvc.setBoolPref(kPrefSmoothScroll, false); -gPrefSvc.setBoolPref(kPrefTestEventsAsyncEnabled, true); - -var gTimeout, gIgnoreMoveDelay; -var gEnoughForTimeout, gEnoughForIgnoreMoveDelay; - -function setTimeoutPrefs(aTimeout, aIgnoreMoveDelay) -{ - gPrefSvc.setIntPref(kPrefNameTimeout, aTimeout); - gPrefSvc.setIntPref(kPrefNameIgnoreMoveDelay, aIgnoreMoveDelay); - gTimeout = aTimeout; - gIgnoreMoveDelay = aIgnoreMoveDelay; - gEnoughForTimeout = gTimeout * 2; - gEnoughForIgnoreMoveDelay = gIgnoreMoveDelay * 1.2; -} - -function resetTimeoutPrefs() -{ - if (gTimeout == kDefaultTimeout) - return; - setTimeoutPrefs(kDefaultTimeout, kDefaultIgnoreMoveDelay); - initTestList(); -} - -function growUpTimeoutPrefs() -{ - if (gTimeout != kDefaultTimeout) - return; - setTimeoutPrefs(5000, 1000); - initTestList(); -} - -// setting enough time for testing. -gPrefSvc.setIntPref(kPrefNameTimeout, gTimeout); -gPrefSvc.setIntPref(kPrefNameIgnoreMoveDelay, gIgnoreMoveDelay); - -var gRootView = document.getElementById("rootview"); -var gSubView1 = document.getElementById("subview1"); -var gSubView2 = document.getElementById("subview2"); -var gSubView3 = document.getElementById("subview3"); - -gRootView.addEventListener("MozMouseScrollFailed", onMouseScrollFailed, false); -gRootView.addEventListener("MozMouseScrollTransactionTimeout", - onTransactionTimeout, false); - -function finish() -{ - window.close(); -} - -function onload() -{ - runNextTestList(); -} - -function onunload() -{ - resetTimeoutPrefs(); - gPrefSvc.clearUserPref(kPrefSmoothScroll); - gPrefSvc.clearUserPref(kPrefTestEventsAsyncEnabled); - disableNonTestMouseEvents(false); - SpecialPowers.DOMWindowUtils.restoreNormalRefresh(); - window.opener.wrappedJSObject.SimpleTest.finish(); -} - -const kSubView1Offset = { x: 20, y: 20 }; -const kSubView2Offset = { x: 20, y: 20 + 100 + 20 }; -const kSubView3Offset = { x: 20, y: 20 + (100 + 20) * 2 }; - -function _getSubViewTestPtForV(aPt) -{ - return { x: aPt.x + 10, y: aPt.y + 10 }; -} - -const kPtInRootViewForV = { x: kSubView1Offset.x + 10, - y: kSubView1Offset.y - 10 }; -const kPtInSubView1ForV = _getSubViewTestPtForV(kSubView1Offset); -const kPtInSubView2ForV = _getSubViewTestPtForV(kSubView2Offset); -const kPtInSubView3ForV = _getSubViewTestPtForV(kSubView3Offset); - -function _convertTestPtForH(aPt) -{ - return { x: aPt.y, y: aPt.x }; -} - -const kPtInRootViewForH = _convertTestPtForH(kPtInRootViewForV); -const kPtInSubView1ForH = _convertTestPtForH(kPtInSubView1ForV); -const kPtInSubView2ForH = _convertTestPtForH(kPtInSubView2ForV); -const kPtInSubView3ForH = _convertTestPtForH(kPtInSubView3ForV); - -/** - * Define the tests here: - * Scrolls are processed async always. Therefore, we need to call all tests - * by timer. gTestLists is array of testing lists. In other words, an item - * of gTestList is a group of one or more testing. Each items has following - * properties: - * - * - retryWhenTransactionTimeout - * The testing of wheel transaction might be fialed randomly by - * timeout. Then, automatically the failed test list will be retested - * automatically only this number of times. - * - * - steps - * This property is array of testing. Each steps must have following - * properties at least. - * - * - func - * This property means function which will be called via - * |setTimeout|. The function cannot have params. If you need - * some additional parameters, you can specify some original - * properties for the test function. If you do so, you should - * document it in the testing function. - * - delay - * This property means delay time until the function to be called. - * I.e., the value used for the second param of |setTimeout|. - * - * And also you need one more property when you call a testing function. - * - * - description - * This property is description of the test. This is used for - * logging. - * - * At testing, you can access to current step via |gCurrentTest|. - */ - -var gTestLists; -function initTestList() -{ - gTestLists = [ - /************************************************************************** - * Continuous scrolling test for |gRootView| - * |gRootView| has both scrollbars and it has three children which are - * |gSubView1|, |gSubView2| and |gSubView3|. They have scrollbars. If - * the current transaction targets |gRootView|, other children should not - * be scrolled even if the wheel events are fired on them. - **************************************************************************/ - { retryWhenTransactionTimeout: 5, - steps: [ - // Vertical case - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Vertical wheel events should scroll |gRootView| even if the position - // of wheel events in a child view which has scrollbar. - { func: testContinuousScroll, delay: 0, offset: kPtInRootViewForV, - isForward: true, isVertical: true, expectedView: gRootView, - description: "Continuous scrolling test for root view (vertical/forward)" }, - { func: testContinuousScroll, delay: 0, offset: kPtInRootViewForV, - isForward: false, isVertical: true, expectedView: gRootView, - description: "Continuous scrolling test for root view (vertical/backward)" } - ] - }, - - - { retryWhenTransactionTimeout: 5, - steps: [ - // Horizontal case - { func: initElements, delay: 0, forVertical: false, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Horizontal wheel events should scroll |gRootView| even if the - // position of wheel events in a child view which has scrollbar. - { func: testContinuousScroll, delay: 0, offset: kPtInRootViewForH, - isForward: true, isVertical: false, expectedView: gRootView, - description: "Continuous scrolling test for root view (horizontal/forward)" }, - { func: testContinuousScroll, delay: 0, offset: kPtInRootViewForH, - isForward: false, isVertical: false, expectedView: gRootView, - description: "Continuous scrolling test for root view (horizontal/backward)" } - ] - }, - - - /************************************************************************** - * Continuous scrolling test for |gSubView1| - * |gSubView1| has both scrollbars. - **************************************************************************/ - { retryWhenTransactionTimeout: 5, - steps: [ - // Vertical case - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Vertical wheel events should scroll |gSubView1|. - { func: testContinuousScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gSubView1, - description: "Continuous scrolling test for sub view 1 (vertical/forward)" }, - { func: testContinuousScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: false, isVertical: true, expectedView: gSubView1, - description: "Continuous scrolling test for sub view 1 (vertical/backward)" } - ] - }, - - - { retryWhenTransactionTimeout: 5, - steps: [ - // Horizontal case - { func: initElements, delay: 0, forVertical: false, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Horitontal wheel events should scroll |gSubView1|. - { func: testContinuousScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: true, isVertical: false, expectedView: gSubView1, - description: "Continuous scrolling test for sub view 1 (horizontal/forward)" }, - { func: testContinuousScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: false, isVertical: false, expectedView: gSubView1, - description: "Continuous scrolling test for sub view 1 (horizontal/backward)" } - ] - }, - - - /************************************************************************** - * Continuous scrolling test for |gSubView2| - * |gSubView2| has only vertical scrollbar. - **************************************************************************/ - { retryWhenTransactionTimeout: 5, - steps: [ - // Vertical case - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Vertical wheel events should scroll |gSubView2|. - { func: testContinuousScroll, delay: 0, offset: kPtInSubView2ForV, - isForward: true, isVertical: true, expectedView: gSubView2, - description: "Continuous scrolling test for sub view 2 (vertical/forward)" }, - { func: testContinuousScroll, delay: 0, offset: kPtInSubView2ForV, - isForward: false, isVertical: true, expectedView: gSubView2, - description: "Continuous scrolling test for sub view 2 (vertical/backward)" } - ] - }, - - - { retryWhenTransactionTimeout: 5, - steps: [ - // Horizontal case - { func: initElements, delay: 0, forVertical: false, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Horizontal wheel events should scroll its nearest scrollable ancestor - // view, i.e., it is |gRootView|. - { func: testContinuousScroll, delay: 0, offset: kPtInSubView2ForH, - isForward: true, isVertical: false, expectedView: gRootView, - description: "Continuous scrolling test for sub view 2 (horizontal/forward)" }, - { func: testContinuousScroll, delay: 0, offset: kPtInSubView2ForH, - isForward: false, isVertical: false, expectedView: gRootView, - description: "Continuous scrolling test for sub view 2 (horizontal/backward)" } - ] - }, - - - /************************************************************************** - * Continuous scrolling test for |gSubView3| - * |gSubView3| has only horizontal scrollbar. - **************************************************************************/ - { retryWhenTransactionTimeout: 5, - steps: [ - // Vertical case - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Vertical wheel events should scroll its nearest scrollable ancestor - // view, i.e., it is |gRootView|. - { func: testContinuousScroll, delay: 0, offset: kPtInSubView3ForV, - isForward: true, isVertical: true, expectedView: gRootView, - description: "Continuous scrolling test for sub view 3 (vertical/forward)" }, - { func: testContinuousScroll, delay: 0, offset: kPtInSubView3ForV, - isForward: false, isVertical: true, expectedView: gRootView, - description: "Continuous scrolling test for sub view 3 (vertical/backward)" } - ] - }, - - - { retryWhenTransactionTimeout: 5, - steps: [ - // Horizontal case - { func: initElements, delay: 0, forVertical: false, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Horitontal wheel events should scroll |gSubView3|. - { func: testContinuousScroll, delay: 0, offset: kPtInSubView3ForH, - isForward: true, isVertical: false, expectedView: gSubView3, - description: "Continuous scrolling test for sub view 3 (horizontal/forward)" }, - { func: testContinuousScroll, delay: 0, offset: kPtInSubView3ForH, - isForward: false, isVertical: false, expectedView: gSubView3, - description: "Continuous scrolling test for sub view 3 (horizontal/backward)" } - ] - }, - - - /************************************************************************** - * Don't reset transaction by a different direction wheel event - * Even if a wheel event doesn't same direction as last wheel event, the - * current transaction should not be reset. - **************************************************************************/ - { retryWhenTransactionTimeout: 5, - steps: [ - // Vertical -> Horizontal - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Create a transaction which targets |gRootView| by a vertical wheel - // event. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForV, - isForward: true, isVertical: true, expectedView: gRootView, - description: "Don't reset transaction by a different direction wheel event (1-1)" }, - // Scroll back to top-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForV, - isForward: false, isVertical: true, expectedView: gRootView, - description: "Don't reset transaction by a different direction wheel event (1-2)" }, - // Send a horizontal wheel event over |gSubView1| but |gRootView| should - // be scrolled. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: false, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Don't reset transaction by a different direction wheel event (1-3)" } - ] - }, - - - { retryWhenTransactionTimeout: 5, - steps: [ - // Horizontal -> Vertical - { func: initElements, delay: 0, forVertical: false, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Create a transaction which targets |gRootView| by a horizontal wheel - // event. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForH, - isForward: true, isVertical: false, expectedView: gRootView, - description: "Don't reset transaction by a different direction wheel event (2-1)" }, - // Scroll back to left-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForH, - isForward: false, isVertical: false, expectedView: gRootView, - description: "Don't reset transaction by a different direction wheel event (2-2)" }, - // Send a vertical wheel event over |gSubView1| but |gRootView| should - // be scrolled. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: true, isVertical: true, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Don't reset transaction by a different direction wheel event (2-3)" } - ] - }, - - - /************************************************************************** - * Don't reset transaction even if a wheel event cannot scroll - * Even if a wheel event cannot scroll to specified direction in the - * current target view, the transaction should not be reset. E.g., there - * are some devices which can scroll obliquely. If so, probably, users - * cannot input only intended direction. - **************************************************************************/ - { retryWhenTransactionTimeout: 5, - steps: [ - // A view only has vertical scrollbar case. - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Create a transaction which targets |gSubView2|. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView2ForV, - isForward: true, isVertical: true, expectedView: gSubView2, - description: "Don't reset transaction even if a wheel event cannot scroll (1-1)" }, - // |gSubView2| doesn't have horizontal scrollbar but should not scroll - // any views. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView2ForV, - isForward: true, isVertical: false, expectedView: null, - description: "Don't reset transaction even if a wheel event cannot scroll (1-2)" } - ] - }, - - - { retryWhenTransactionTimeout: 5, - steps: [ - // A view only has horizontal scrollbar case. - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Create a transaction which targets |gSubView3|. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView3ForV, - isForward: true, isVertical: false, expectedView: gSubView3, - description: "Don't reset transaction even if a wheel event cannot scroll (2-1)" }, - // |gSubView3| doesn't have vertical scrollbar but should not scroll any - // views. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView3ForV, - isForward: true, isVertical: true, expectedView: null, - description: "Don't reset transaction even if a wheel event cannot scroll (2-2)" } - ] - }, - - - /************************************************************************** - * Reset transaction by mouse down/mouse up events - * Mouse down and mouse up events should cause resetting the current - * transaction. - **************************************************************************/ - { retryWhenTransactionTimeout: 5, - steps: [ - // Vertical case - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Create a transaction which targets |gRootView|. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForV, - isForward: true, isVertical: true, expectedView: gRootView, - description: "Reset transaction by mouse down/mouse up events (v-1)" }, - // Scroll back to top-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForV, - isForward: false, isVertical: true, expectedView: gRootView, - description: "Reset transaction by mouse down/mouse up events (v-2)" }, - // Send mouse button events which should reset the current transaction. - // So, the next wheel event should scroll |gSubView1|. - { func: sendMouseButtonEvents, delay: 0, - description: "sendMouseButtonEvents" }, - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gSubView1, - description: "Reset transaction by mouse down/mouse up events (v-3)" } - ] - }, - - - { retryWhenTransactionTimeout: 5, - steps: [ - // Horizontal case - { func: initElements, delay: 0, forVertical: false, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Create a transaction which targets |gRootView|. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForH, - isForward: true, isVertical: false, expectedView: gRootView, - description: "Reset transaction by mouse down/mouse up events (h-1)" }, - // Scroll back to left-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForH, - isForward: false, isVertical: false, expectedView: gRootView, - description: "Reset transaction by mouse down/mouse up events (h-2)" }, - // Send mouse button events which should reset the current transaction. - // So, the next wheel event should scroll |gSubView1|. - { func: sendMouseButtonEvents, delay: 0, - description: "sendMouseButtonEvents" }, - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: true, isVertical: false, expectedView: gSubView1, - description: "Reset transaction by mouse down/mouse up events (h-3)" } - ] - }, - - - /************************************************************************** - * Reset transaction by a key event - * A key event should cause resetting the current transaction. - **************************************************************************/ - { retryWhenTransactionTimeout: 5, - steps: [ - // Vertical case - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Create a transaction which targets |gRootView|. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForV, - isForward: true, isVertical: true, expectedView: gRootView, - description: "Reset transaction by a key event (v-1)" }, - // Scroll back to top-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForV, - isForward: false, isVertical: true, expectedView: gRootView, - description: "Reset transaction by a key event (v-2)" }, - // Send a key event which should reset the current transaction. So, the - // next wheel event should scroll |gSubView1|. - { func: sendKeyEvents, delay: 0, key: "a", - description: "sendKeyEvents" }, - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gSubView1, - description: "Reset transaction by a key event (v-3)" } - ] - }, - - - { retryWhenTransactionTimeout: 5, - steps: [ - // Horizontal case - { func: initElements, delay: 0, forVertical: false, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Create a transaction which targets |gRootView|. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForH, - isForward: true, isVertical: false, expectedView: gRootView, - description: "Reset transaction by a key event (h-1)" }, - // Scroll back to left-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForH, - isForward: false, isVertical: false, expectedView: gRootView, - description: "Reset transaction by a key event (h-2)" }, - // Send a key event which should reset the current transaction. So, the - // next wheel event should scroll |gSubView1|. - { func: sendKeyEvents, delay: 0, key: "a", - description: "sendKeyEvents" }, - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: true, isVertical: false, expectedView: gSubView1, - description: "Reset transaction by a key event (h-3)" } - ] - }, - - - /************************************************************************** - * Reset transaction by a mouse move event - * A mouse move event can cause reseting the current transaction even if - * mouse cursor is inside the target view of current transaction. Only - * when a wheel event is fired after |gIgnoreMoveDelay| milliseconds since - * the first mouse move event from last wheel event, the transaction - * should be reset. - **************************************************************************/ - { retryWhenTransactionTimeout: 5, - steps: [ - // Vertical case - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Create a transaction which targets |gRootView|. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForV, - isForward: true, isVertical: true, expectedView: gRootView, - description: "Reset transaction by a mouse move event (v-1)" }, - // Scroll back to top-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForV, - isForward: false, isVertical: true, expectedView: gRootView, - description: "Reset transaction by a mouse move event (v-2)" }, - // Send a mouse move event immediately after last wheel event, then, - // current transaction should be kept. - { func: sendMouseMoveEvent, delay: 0, offset: kPtInSubView1ForV, - description: "sendMouseMoveEvent" }, - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (v-3)" }, - // Scroll back to top-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: false, isVertical: true, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (v-4)" }, - // Send a mouse move event after |gIgnoreMoveDelay| milliseconds since - // last wheel event, then, current transaction should be kept. - { func: sendMouseMoveEvent, delay: gEnoughForIgnoreMoveDelay, - offset: kPtInSubView1ForV, - description: "sendMouseMoveEvent" }, - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (v-5)" }, - // Scroll back to top-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: false, isVertical: true, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (v-6)" }, - // Send a wheel event after |gIgnoreMoveDelay| milliseconds since last - // mouse move event but it is fired immediately after the last wheel - // event, then, current transaction should be kept. - { func: sendMouseMoveEvent, delay: 0, offset: kPtInSubView1ForV, - description: "sendMouseMoveEvent" }, - { func: testOneTimeScroll, delay: gEnoughForIgnoreMoveDelay, - offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (v-7)" }, - // Scroll back to top-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: false, isVertical: true, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (v-8)" }, - // Send a wheel event after |gIgnoreMoveDelay| milliseconds have passed - // since last mouse move event which is fired after |gIgnoreMoveDelay| - // milliseconds since last wheel event, then, current transaction should - // be reset. - { func: sendMouseMoveEvent, delay: gEnoughForIgnoreMoveDelay, - offset: kPtInSubView1ForV, - description: "sendMouseMoveEvent" }, - { func: testOneTimeScroll, delay: gEnoughForIgnoreMoveDelay, - offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gSubView1, - canFailRandomly: { possibleView: gRootView }, - description: "Reset transaction by a mouse move event (v-9)" } - ] - }, - - - { retryWhenTransactionTimeout: 5, - steps: [ - // Horizontal case - { func: initElements, delay: 0, forVertical: false, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Create a transaction which targets |gRootView|. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForH, - isForward: true, isVertical: false, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (h-1)" }, - // Scroll back to top-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForH, - isForward: false, isVertical: false, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (h-2)" }, - // Send a mouse move event immediately after last wheel event, then, - // current transaction should be kept. - { func: sendMouseMoveEvent, delay: 0, offset: kPtInSubView1ForH, - description: "sendMouseMoveEvent" }, - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: true, isVertical: false, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (h-3)" }, - // Scroll back to top-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: false, isVertical: false, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (h-4)" }, - // Send a mouse move event after |gIgnoreMoveDelay| milliseconds since - // last wheel event, then, current transaction should be kept. - { func: sendMouseMoveEvent, delay: gEnoughForIgnoreMoveDelay, - offset: kPtInSubView1ForH, - description: "sendMouseMoveEvent" }, - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: true, isVertical: false, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (h-5)" }, - // Scroll back to top-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: false, isVertical: false, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (h-6)" }, - // Send a wheel event after |gIgnoreMoveDelay| milliseconds since last - // mouse move event but it is fired immediately after the last wheel - // event, then, current transaction should be kept. - { func: sendMouseMoveEvent, delay: 0, offset: kPtInSubView1ForH, - description: "sendMouseMoveEvent" }, - { func: testOneTimeScroll, delay: gEnoughForIgnoreMoveDelay, - offset: kPtInSubView1ForH, - isForward: true, isVertical: false, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (h-7)" }, - // Scroll back to top-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: false, isVertical: false, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Reset transaction by a mouse move event (h-8)" }, - // Send a wheel event after |gIgnoreMoveDelay| milliseconds have passed - // since last mouse move event which is fired after |gIgnoreMoveDelay| - // milliseconds since last wheel event, then, current transaction should - // be reset. - { func: sendMouseMoveEvent, delay: gEnoughForIgnoreMoveDelay, - offset: kPtInSubView1ForH, - description: "sendMouseMoveEvent" }, - { func: testOneTimeScroll, delay: gEnoughForIgnoreMoveDelay, - offset: kPtInSubView1ForH, - isForward: true, isVertical: false, expectedView: gSubView1, - canFailRandomly: { possibleView: gRootView }, - description: "Reset transaction by a mouse move event (h-9)" } - ] - }, - - - /************************************************************************** - * Reset transaction by a mouse move event on outside of view - * When mouse cursor is moved to outside of the current target view, the - * transaction should be reset immediately. - **************************************************************************/ - { retryWhenTransactionTimeout: 5, - steps: [ - // Vertical case - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Create a transaction which targets |gSubView1|. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gSubView1, - description: "Reset transaction by a mouse move event on outside of view (v-1)" }, - // Send mouse move event over |gRootView|. - { func: sendMouseMoveEvent, delay: 0, offset: kPtInRootViewForV, - description: "sendMouseMoveEvent" }, - // Send Wheel event over |gRootView| which should be scrolled. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForV, - isForward: true, isVertical: true, expectedView: gRootView, - description: "Reset transaction by a mouse move event on outside of view (v-2)" } - ] - }, - - - { retryWhenTransactionTimeout: 5, - steps: [ - // Horizontal case - { func: initElements, delay: 0, forVertical: false, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Create a transaction which targets |gSubView1|. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: true, isVertical: true, expectedView: gSubView1, - description: "Reset transaction by a mouse move event on outside of view (h-1)" }, - // Send mouse move event over |gRootView|. - { func: sendMouseMoveEvent, delay: 0, offset: kPtInRootViewForH, - description: "sendMouseMoveEvent" }, - // Send Wheel event over |gRootView| which should be scrolled. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForH, - isForward: true, isVertical: true, expectedView: gRootView, - description: "Reset transaction by a mouse move event on outside of view (h-2)" } - ] - }, - - - /************************************************************************** - * Timeout test - * A view should not be scrolled during another to be transaction for - * another view scrolling. However, a wheel event which is sent after - * timeout, a view which is under the mouse cursor should be scrolled. - **************************************************************************/ - { retryWhenTransactionTimeout: 5, - steps: [ - // Vertical case - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // First, create a transaction which should target the |gRootView|. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForV, - isForward: true, isVertical: true, expectedView: gRootView, - description: "Timeout test (v-1)" }, - // Scroll back to top-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForV, - isForward: false, isVertical: true, expectedView: gRootView, - description: "Timeout test (v-2)" }, - // A wheel event over |gSubView1| should not scroll it during current - // transaction. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Timeout test (v-3)" }, - // Scroll back to top-most again. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: false, isVertical: true, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Timeout test (v-4)" }, - // A wheel event over |gSubView1| after timeout should scroll - // |gSubView1|. - { func: testOneTimeScroll, delay: gEnoughForTimeout, - offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gSubView1, - isTimeoutTesting: true, - description: "Timeout test (v-5)" } - ] - }, - - - { retryWhenTransactionTimeout: 5, - steps: [ - // Horizontal case - { func: initElements, delay: 0, forVertical: false, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // First, create a transaction which should target the |gRootView|. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForH, - isForward: true, isVertical: false, expectedView: gRootView, - description: "Timeout test (h-1)" }, - // Scroll back to left-most for easy cursor position specifying. - { func: testOneTimeScroll, delay: 0, offset: kPtInRootViewForH, - isForward: false, isVertical: false, expectedView: gRootView, - description: "Timeout test (h-2)" }, - // A wheel event over |gSubView1| should not scroll it during current - // transaction. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: true, isVertical: false, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Timeout test (h-3)" }, - // Scroll back to left-most again. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: false, isVertical: false, expectedView: gRootView, - canFailRandomly: { possibleView: gSubView1 }, - description: "Timeout test (h-4)" }, - // A wheel event over |gSubView1| after timeout should scroll - // |gSubView1|. - { func: testOneTimeScroll, delay: gEnoughForTimeout, - offset: kPtInSubView1ForH, - isForward: true, isVertical: false, expectedView: gSubView1, - isTimeoutTesting: true, - description: "Timeout test (h-5)" } - ] - }, - - - /************************************************************************** - * Timeout test even with many wheel events - * This tests whether timeout is occurred event if wheel events are sent. - * The transaction should not be updated by non-scrollable wheel events. - **************************************************************************/ - { retryWhenTransactionTimeout: 5, - steps: [ - // Vertical case - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Scroll |gSubView1| to bottom-most. - { func: testContinuousScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gSubView1, - description: "Timeout test even with many wheel events (v-1)" }, - // Don't scroll any views before timeout. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: null, - canFailRandomly: { possibleView: gRootView }, - description: "Timeout test even with many wheel events (v-2)" }, - // Recreate a transaction which is scrolling |gRootView| after time out. - { func: testRestartScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gRootView, - description: "Timeout test even with many wheel events (v-3)" } - ] - }, - - - { retryWhenTransactionTimeout: 5, - steps: [ - // Horizontal case - { func: initElements, delay: 0, forVertical: false, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - // Scroll |gSubView1| to right-most. - { func: testContinuousScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: true, isVertical: false, expectedView: gSubView1, - description: "Timeout test even with many wheel events (h-1)" }, - // Don't scroll any views before timeout. - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: true, isVertical: false, expectedView: null, - canFailRandomly: { possibleView: gRootView }, - description: "Timeout test even with many wheel events (h-2)" }, - // Recreate a transaction which is scrolling |gRootView| after time out. - { func: testRestartScroll, delay: 0, offset: kPtInSubView1ForH, - isForward: true, isVertical: false, expectedView: gRootView, - description: "Timeout test even with many wheel events (h-3)" } - ] - }, - - - /************************************************************************** - * Very large scrolling wheel event - * If the delta value is larger than the scrolling page size, it should be - * scrolled only one page instead of the delta value. - **************************************************************************/ - { retryWhenTransactionTimeout: 5, - steps: [ - { func: initElements, delay: 0, forVertical: true, - description: "initElements" }, - { func: clearWheelTransaction, delay: 0, - description: "clearWheelTransaction" }, - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gSubView1, - delta: 5000, - description: "Very large delta scrolling (v-1)" }, - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: true, expectedView: gSubView1, - delta: 5000, - description: "Very large delta scrolling (v-2)" }, - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: false, expectedView: gSubView1, - delta: 5000, - description: "Very large delta scrolling (h-1)" }, - { func: testOneTimeScroll, delay: 0, offset: kPtInSubView1ForV, - isForward: true, isVertical: false, expectedView: gSubView1, - delta: 5000, - description: "Very large delta scrolling (h-2)" } - ] - } - ]; -} - -/****************************************************************************** - * Actions for preparing tests - ******************************************************************************/ - -function initElements() -{ - _clearTimer(); - - function resetScrollPosition(aElement) - { - aElement.scrollTop = 0; - aElement.scrollLeft = 0; - } - - function initInRootView(aElement, aPt) - { - aElement.offset = - gCurrentTest.forVertical ? aPt : { x: aPt.y, y: aPt.x }; - } - - const kDisplay = gCurrentTest.forVertical ? "block" : "inline-block"; - gSubView1.style.display = kDisplay; - gSubView2.style.display = kDisplay; - gSubView3.style.display = kDisplay; - - resetScrollPosition(gRootView); - resetScrollPosition(gSubView1); - resetScrollPosition(gSubView2); - resetScrollPosition(gSubView3); - _getDOMWindowUtils(window).advanceTimeAndRefresh(0); - - runNextTestStep(); -} - -function clearWheelTransaction() -{ - _clearTimer(); - _clearTransaction(); - runNextTestStep(); -} - -function sendKeyEvents() -{ - _clearTimer(); - synthesizeKey(gCurrentTest.key, {}, window); - runNextTestStep(); -} - -function sendMouseButtonEvents() -{ - _clearTimer(); - synthesizeMouse(gRootView, -1, -1, { type:"mousedown" }, window); - synthesizeMouse(gRootView, -1, -1, { type:"mouseup" }, window); - runNextTestStep(); -} - -function sendMouseMoveEvent() -{ - _clearTimer(); - _fireMouseMoveEvent(gCurrentTest.offset); - runNextTestStep(); -} - -/****************************************************************************** - * Utilities for testing functions - ******************************************************************************/ - -function _clearTransaction() -{ - synthesizeMouse(gRootView, -1, -1, { type:"mousedown" }, window); - synthesizeMouse(gRootView, -1, -1, { type:"mouseup" }, window); -} - -function _saveScrollPositions() -{ - function save(aElement) - { - aElement.prevTop = aElement.scrollTop; - aElement.prevLeft = aElement.scrollLeft; - } - save(gRootView); - save(gSubView1); - save(gSubView2); - save(gSubView3); -} - -function _fireMouseMoveEvent(aOffset) -{ - synthesizeMouse(gRootView, aOffset.x, aOffset.y, { type:"mousemove" }, window); -} - -function _fireWheelScrollEvent(aOffset, aIsVertical, aForward, aDelta) -{ - var event = { deltaMode: WheelEvent.DOM_DELTA_LINE }; - if (aIsVertical) { - event.deltaY = aForward ? aDelta : -aDelta; - } else { - event.deltaX = aForward ? aDelta : -aDelta; - } - sendWheelAndPaint(gRootView, aOffset.x, aOffset.y, event, null, window); -} - -function _canScroll(aElement, aIsVertical, aForward) -{ - if (aIsVertical) { - if (!aForward) - return aElement.scrollTop > 0; - return aElement.scrollHeight > aElement.scrollTop + aElement.clientHeight; - } - if (!aForward) - return aElement.scrollLeft > 0; - return aElement.scrollWidth > aElement.scrollLeft + aElement.clientWidth; -} - -const kNotScrolled = 0; -const kScrolledToTop = 1; -const kScrolledToBottom = 2; -const kScrolledToLeft = 4; -const kScrolledToRight = 8; - -const kScrolledVertical = kScrolledToTop | kScrolledToBottom; -const kScrolledHorizontal = kScrolledToLeft | kScrolledToRight; - -function _getScrolledState(aElement) -{ - var ret = kNotScrolled; - if (aElement.scrollTop != aElement.prevTop) { - ret |= aElement.scrollTop < aElement.prevTop ? kScrolledToTop : - kScrolledToBottom; - } - if (aElement.scrollLeft != aElement.prevLeft) { - ret |= aElement.scrollLeft < aElement.prevLeft ? kScrolledToLeft : - kScrolledToRight; - } - return ret; -} - -function _getExpectedScrolledState() -{ - return gCurrentTest.isVertical ? - gCurrentTest.isForward ? kScrolledToBottom : kScrolledToTop : - gCurrentTest.isForward ? kScrolledToRight : kScrolledToLeft; -} - -function _getScrolledStateText(aScrolledState) -{ - if (aScrolledState == kNotScrolled) - return "Not scrolled"; - - var s = "scrolled to "; - if (aScrolledState & kScrolledVertical) { - s += aScrolledState & kScrolledToTop ? "backward" : "forward"; - s += " (vertical)" - if (aScrolledState & kScrolledHorizontal) - s += " and to "; - } - if (aScrolledState & kScrolledHorizontal) { - s += aScrolledState & kScrolledToLeft ? "backward" : "forward"; - s += " (horizontal)" - } - return s; -} - -function _getCurrentTestList() -{ - return gTestLists[gCurrentTestListStatus.nextListIndex - 1]; -} - -function _clearTimer() -{ - clearTimeout(gTimer); - gTimer = 0; -} - -/****************************************************************************** - * Testing functions - ******************************************************************************/ - -/** - * Note that testing functions must set following variables: - * - * gCurrentTest.repeatTest: See comment in |continueTest|. - * gCurrentTest.autoRepeatDelay: See comment in |continueTest|. - * gListenScrollEvent: When this is not true, the event handlers ignores the - * events. - */ - -function testContinuousScroll() -{ - /** - * Testing continuous scrolling. This function synthesizes a wheel event. If - * the test was success, this function will be recalled automatically. - * And when a generating wheel event cannot scroll the expected view, this - * function fires the wheel event only one time. - * - * @param gCurrentTest.offset - * The cursor position of firing wheel event. The values are offset - * from |gRootView|. - * @param gCurrentTest.isVertical - * Whether the wheel event is for virtical scrolling or horizontal. - * @param gCurrentTest.isForward - * Whether the wheel event is to forward or to backward. - * @param gCurrentTest.expectedView - * The expected view which will be scrolled by wheel event. This - * value must not be null. - */ - - _clearTimer(); - _saveScrollPositions(); - if (!gCurrentTest.expectedView) { - runNextTestStep(); - return; - } - - gLitesnEvents = kListenEvent_All; - gCurrentTest.repeatTest = true; - gCurrentTest.autoRepeatDelay = 0; - - if (!_canScroll(gCurrentTest.expectedView, - gCurrentTest.isVertical, gCurrentTest.isForward)) { - gCurrentTest.expectedView = null; - } - var delta = gCurrentTest.delta ? gCurrentTest.delta : 4; - _fireWheelScrollEvent(gCurrentTest.offset, - gCurrentTest.isVertical, gCurrentTest.isForward, delta); -} - -function testOneTimeScroll() -{ - /** - * Testing one wheel event. |runNextTestStep| will be called immediately - * after this function by |onScrollView| or |onTimeout|. - * - * @param gCurrentTest.offset - * The cursor position of firing wheel event. The values are offset - * from |gRootView|. - * @param gCurrentTest.isVertical - * Whether the wheel event is for virtical scrolling or horizontal. - * @param gCurrentTest.isForward - * Whether the wheel event is to forward or to backward. - * @param gCurrentTest.expectedView - * The expected view which will be scrolled by wheel event. This - * value can be null. It means any views should not be scrolled. - */ - - _clearTimer(); - _saveScrollPositions(); - - gLitesnEvents = kListenEvent_All; - gCurrentTest.repeatTest = false; - gCurrentTest.autoRepeatDelay = 0; - - var delta = gCurrentTest.delta ? gCurrentTest.delta : 4; - _fireWheelScrollEvent(gCurrentTest.offset, - gCurrentTest.isVertical, gCurrentTest.isForward, delta); -} - -function testRestartScroll() -{ - /** - * Testing restart to scroll in expected view after timeout from the current - * transaction. This function recall this itself until to success this test - * or timeout from this test. - * - * @param gCurrentTest.offset - * The cursor position of firing wheel event. The values are offset - * from |gRootView|. - * @param gCurrentTest.isVertical - * Whether the wheel event is for virtical scrolling or horizontal. - * @param gCurrentTest.isForward - * Whether the wheel event is to forward or to backward. - * @param gCurrentTest.expectedView - * The expected view which will be scrolled by wheel event. This - * value must not be null. - */ - - _clearTimer(); - _saveScrollPositions(); - - if (!gCurrentTest.wasTransactionTimeout) { - gCurrentTest.repeatTest = true; - gCurrentTest.autoRepeatDelay = gTimeout / 3; - gLitesnEvents = kListenEvent_All; - gCurrentTest.isTimeoutTesting = true; - if (gCurrentTest.expectedView) { - gCurrentTest.expectedViewAfterTimeout = gCurrentTest.expectedView; - gCurrentTest.expectedView = null; - } - } else { - gCurrentTest.repeatTest = false; - gCurrentTest.autoRepeatDelay = 0; - gLitesnEvents = kListenEvent_All; - gCurrentTest.isTimeoutTesting = false; - gCurrentTest.expectedView = gCurrentTest.expectedViewAfterTimeout; - } - - var delta = gCurrentTest.delta ? gCurrentTest.delta : 4; - _fireWheelScrollEvent(gCurrentTest.offset, - gCurrentTest.isVertical, gCurrentTest.isForward, delta); -} - -/****************************************************************************** - * Event handlers - ******************************************************************************/ - -function onScrollView(aEvent) -{ - /** - * Scroll event handler of |gRootView|, |gSubView1|, |gSubView2| and - * |gSubView3|. If testing is failed, this function cancels all left tests. - * For checking the event is expected, the event firer must call - * |_saveScrollPositions|. - * - * @param gCurrentTest.expectedView - * The expected view which should be scrolled by the wheel event. - * This value can be null. It means any views should not be - * scrolled. - * @param gCurrentTest.isVertical - * The expected view should be scrolled vertical or horizontal. - * @param gCurrentTest.isForward - * The expected view should be scrolled to forward or backward. - * @param gCurrentTest.canFailRandomly - * If this is not undefined, this test can fail by unexpected view - * scrolling which is caused by unexpected timeout. If this is - * defined, |gCurrentTest.possibleView| must be set. If the view is - * same as the event target, the failure can be random. At this - * time, we should retry the current test list. - */ - - if (!(gLitesnEvents & kListenEvent_OnScroll)) - return; - - // Now testing a timeout, but a view is scrolled before timeout. - if (gCurrentTest.isTimeoutTesting && !gCurrentTest.wasTransactionTimeout) { - is(aEvent.target.id, "", - "The view scrolled before timeout (the expected view after timeout is " + - gCurrentTest.expectedView ? gCurrentTest.expectedView.id : "null" + - "): " + gCurrentTest.description); - runNextTestList(); - return; - } - - // Check whether the scrolled event should be fired or not. - if (!gCurrentTest.expectedView) { - is(aEvent.target.id, "", - "no views should be scrolled (" + - _getScrolledStateText(_getScrolledState(aEvent.target)) + "): " + - gCurrentTest.description); - runNextTestList(); - return; - } - - // Check whether the scrolled view is expected or not. - if (aEvent.target != gCurrentTest.expectedView) { - // If current test can fail randomly and the possible view is same as the - // event target, this failure may be caused by unexpected timeout. - // At this time, we should retry the current tests with slower settings. - if (gCurrentTest.canFailRandomly && - gCurrentTest.canFailRandomly.possibleView == aEvent.target && - gCurrentTestListStatus.retryWhenTransactionTimeout > 0) { - gCurrentTestListStatus.retryWhenTransactionTimeout--; - retryCurrentTestList(); - return; - } - is(aEvent.target.id, gCurrentTest.expectedView.id, - "wrong view was scrolled: " + gCurrentTest.description); - runNextTestList(); - return; - } - - // Check whether the scrolling direction is expected or not. - var expectedState = _getExpectedScrolledState(); - var currentState = _getScrolledState(aEvent.target); - if (expectedState != currentState) { - is(_getScrolledStateText(currentState), - _getScrolledStateText(expectedState), - "scrolled to wrong direction: " + gCurrentTest.description); - runNextTestList(); - return; - } - - ok(true, "passed: " + gCurrentTest.description); - continueTest(); -} - -function onMouseScrollFailed() -{ - /** - * Scroll failed event handler. If testing is failed, this function cancels - * all remains of current test-list, and go to next test-list. - * - * NOTE: This event is fired immediately after |_fireWheelScrollEvent|. - * - * @param gCurrentTest.expectedView - * The expected view which should be scrolled by the wheel event. - * This value can be null. It means any views should not be - * scrolled. When this is not null, this event means the test may - * be failed. - */ - - if (!(gLitesnEvents & kListenEvent_OnScrollFailed)) - return; - - ok(!gCurrentTest.expectedView, - "failed to scroll on current target: " + gCurrentTest.description); - if (gCurrentTest.expectedView) { - runNextTestList(); - return; - } - - continueTest(); -} - -function onTransactionTimeout() -{ - /** - * Scroll transaction timeout event handler. If the timeout is unexpected, - * i.e., |gCurrentTest.isTimeoutTesting| is not true, this function retry - * the current test-list. However, if the current test-list failed by timeout - * |gCurrentTestListStatus.retryWhenTransactionTimeout| times already, marking - * to failed the current test-list, and go to next test-list. - * - * @param gCurrentTest.expectedView - * The expected view which should be scrolled by the wheel event. - * This value can be null. It means any views should not be - * scrolled. When this is not null, this event means the testing may - * be failed. - * @param gCurrentTest.isTimeoutTesting - * If this value is true, the current testing have waited this - * event. Otherwise, the testing may be failed. - * @param gCurrentTestListStatus.retryWhenTransactionTimeout - * If |gCurrentTest.isTimeoutTesting| is not true but this event is - * fired, the failure may be randomly. Then, this event handler - * retry to test the current test-list until this cound will be zero. - */ - - if (!gCurrentTest.isTimeoutTesting && - gCurrentTestListStatus.retryWhenTransactionTimeout > 0) { - gCurrentTestListStatus.retryWhenTransactionTimeout--; - // retry current test list - retryCurrentTestList(); - return; - } - - gCurrentTest.wasTransactionTimeout = true; - - if (!(gLitesnEvents & kListenEvent_OnTransactionTimeout)) - return; - - ok(gCurrentTest.isTimeoutTesting, - "transaction timeout: " + gCurrentTest.description); - if (!gCurrentTest.isTimeoutTesting) { - runNextTestList(); - return; - } - - continueTest(); -} - -/****************************************************************************** - * Main function for this tests - ******************************************************************************/ - -function runNextTestStep() -{ - // When this is first time or the current test list is finised, load next - // test-list. - _clearTimer(); - if (!gCurrentTest) - runNextTestList(); - else - runTestStepAt(gCurrentTestListStatus.nextStepIndex); -} - -function runNextTestList() -{ - _clearTimer(); - - gLitesnEvents = kListenEvent_None; - _clearTransaction(); - resetTimeoutPrefs(); - if (gCurrentTestListStatus.nextListIndex >= gTestLists.length) { - finish(); - return; - } - - gCurrentTestListStatus.nextListIndex++; - gCurrentTestListStatus.retryWhenTransactionTimeout = - _getCurrentTestList().retryWhenTransactionTimeout; - runTestStepAt(0); -} - -function runTestStepAt(aStepIndex) -{ - _clearTimer(); - - disableNonTestMouseEvents(true); - - // load a step of testing. - gCurrentTestListStatus.nextStepIndex = aStepIndex; - gCurrentTest = - _getCurrentTestList().steps[gCurrentTestListStatus.nextStepIndex++]; - if (gCurrentTest) { - gCurrentTest.wasTransactionTimeout = false; - gTimer = setTimeout(gCurrentTest.func, gCurrentTest.delay); - } else { - // If current test-list doesn't have more testing, go to next test-list - // after cleaning up the current transaction. - _clearTransaction(); - runNextTestList(); - } -} - -function retryCurrentTestList() -{ - _clearTimer(); - - gLitesnEvents = kListenEvent_None; - _clearTransaction(); - ok(true, "WARNING: retry current test-list..."); - growUpTimeoutPrefs(); // retry the test with longer timeout settings. - runTestStepAt(0); -} - -function continueTest() -{ - /** - * This function is called from an event handler when a test succeeded. - * - * @param gCurrentTest.repeatTest - * When this is true, onScrollView calls |gCurrentTest.func|. So, - * same test can repeat. Otherwise, this calls |runNextTestStep|. - * @param gCurrentTest.autoRepeatDelay - * The delay value in milliseconds, this is used to call - * |gCurrentTest.func| via |setTimeout|. - */ - - _clearTimer(); - gLitesnEvents = kListenEvent_OnTransactionTimeout; - - // We should call each functions via setTimeout. Because sometimes this test - // is broken by stack overflow. - if (gCurrentTest.repeatTest) { - gTimer = setTimeout(gCurrentTest.func, gCurrentTest.autoRepeatDelay); - } else { - gTimer = setTimeout(runNextTestStep, 0); - } -} - -]]> -</script> - -</window> |