diff options
Diffstat (limited to 'browser/base/content/test/general/browser_overflowScroll.js')
-rw-r--r-- | browser/base/content/test/general/browser_overflowScroll.js | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/browser/base/content/test/general/browser_overflowScroll.js b/browser/base/content/test/general/browser_overflowScroll.js new file mode 100644 index 000000000..56932fae2 --- /dev/null +++ b/browser/base/content/test/general/browser_overflowScroll.js @@ -0,0 +1,91 @@ +var tabstrip = gBrowser.tabContainer.mTabstrip; +var scrollbox = tabstrip._scrollbox; +var originalSmoothScroll = tabstrip.smoothScroll; +var tabs = gBrowser.tabs; + +var rect = ele => ele.getBoundingClientRect(); +var width = ele => rect(ele).width; +var left = ele => rect(ele).left; +var right = ele => rect(ele).right; +var isLeft = (ele, msg) => is(left(ele) + tabstrip._tabMarginLeft, left(scrollbox), msg); +var isRight = (ele, msg) => is(right(ele) - tabstrip._tabMarginRight, right(scrollbox), msg); +var elementFromPoint = x => tabstrip._elementFromPoint(x); +var nextLeftElement = () => elementFromPoint(left(scrollbox) - 1); +var nextRightElement = () => elementFromPoint(right(scrollbox) + 1); +var firstScrollable = () => tabs[gBrowser._numPinnedTabs]; + +function test() { + requestLongerTimeout(2); + waitForExplicitFinish(); + + // If the previous (or more) test finished with cleaning up the tabs, + // there may be some pending animations. That can cause a failure of + // this tests, so, we should test this in another stack. + setTimeout(doTest, 0); +} + +function doTest() { + tabstrip.smoothScroll = false; + + var tabMinWidth = parseInt(getComputedStyle(gBrowser.selectedTab, null).minWidth); + var tabCountForOverflow = Math.ceil(width(tabstrip) / tabMinWidth * 3); + while (tabs.length < tabCountForOverflow) + gBrowser.addTab("about:blank", {skipAnimation: true}); + gBrowser.pinTab(tabs[0]); + + tabstrip.addEventListener("overflow", runOverflowTests, false); +} + +function runOverflowTests(aEvent) { + if (aEvent.detail != 1) + return; + + tabstrip.removeEventListener("overflow", runOverflowTests, false); + + var upButton = tabstrip._scrollButtonUp; + var downButton = tabstrip._scrollButtonDown; + var element; + + gBrowser.selectedTab = firstScrollable(); + ok(left(scrollbox) <= left(firstScrollable()), "Selecting the first tab scrolls it into view " + + "(" + left(scrollbox) + " <= " + left(firstScrollable()) + ")"); + + element = nextRightElement(); + EventUtils.synthesizeMouseAtCenter(downButton, {}); + isRight(element, "Scrolled one tab to the right with a single click"); + + gBrowser.selectedTab = tabs[tabs.length - 1]; + ok(right(gBrowser.selectedTab) <= right(scrollbox), "Selecting the last tab scrolls it into view " + + "(" + right(gBrowser.selectedTab) + " <= " + right(scrollbox) + ")"); + + element = nextLeftElement(); + EventUtils.synthesizeMouse(upButton, 1, 1, {}); + isLeft(element, "Scrolled one tab to the left with a single click"); + + let elementPoint = left(scrollbox) - width(scrollbox); + element = elementFromPoint(elementPoint); + if (elementPoint == right(element)) { + element = element.nextSibling; + } + EventUtils.synthesizeMouse(upButton, 1, 1, {clickCount: 2}); + isLeft(element, "Scrolled one page of tabs with a double click"); + + EventUtils.synthesizeMouse(upButton, 1, 1, {clickCount: 3}); + var firstScrollableLeft = left(firstScrollable()); + ok(left(scrollbox) <= firstScrollableLeft, "Scrolled to the start with a triple click " + + "(" + left(scrollbox) + " <= " + firstScrollableLeft + ")"); + + for (var i = 2; i; i--) + EventUtils.synthesizeWheel(scrollbox, 1, 1, { deltaX: -1.0, deltaMode: WheelEvent.DOM_DELTA_LINE }); + is(left(firstScrollable()), firstScrollableLeft, "Remained at the start with the mouse wheel"); + + element = nextRightElement(); + EventUtils.synthesizeWheel(scrollbox, 1, 1, { deltaX: 1.0, deltaMode: WheelEvent.DOM_DELTA_LINE}); + isRight(element, "Scrolled one tab to the right with the mouse wheel"); + + while (tabs.length > 1) + gBrowser.removeTab(tabs[0]); + + tabstrip.smoothScroll = originalSmoothScroll; + finish(); +} |