gecko-dev/browser/base/content/test/tabs/browser_overflowScroll.js
Paolo Amadini 2a67f25fbd Bug 1454360 - Use "arrowscrollbox" in the "popup-scrollbars" binding. r=NeilDeakin
This prepares this binding for the unification with the "popup" binding, and removes the last consumer of the scrollByIndex method of XULScrollElement.

Because some code paths in "arrowscrollbox" are optimized using requestAnimationFrame, the related scrolling tests are now asynchronous.

Differential Revision: https://phabricator.services.mozilla.com/D15276

--HG--
extra : rebase_source : f5d26df106785f2c0d158b8a23a648a71ab06b2d
2019-01-04 15:07:12 +00:00

95 lines
3.5 KiB
JavaScript

"use strict";
requestLongerTimeout(2);
/**
* Tests that scrolling the tab strip via the scroll buttons scrolls the right
* amount in non-smoothscroll mode.
*/
add_task(async function() {
let arrowScrollbox = gBrowser.tabContainer.arrowScrollbox;
let scrollbox = arrowScrollbox.scrollbox;
let originalSmoothScroll = arrowScrollbox.smoothScroll;
let tabs = gBrowser.tabs;
let tabMinWidth = parseInt(getComputedStyle(gBrowser.selectedTab, null).minWidth);
let rect = ele => ele.getBoundingClientRect();
let width = ele => rect(ele).width;
let tabCountForOverflow = Math.ceil(width(arrowScrollbox) / tabMinWidth * 3);
let left = ele => rect(ele).left;
let right = ele => rect(ele).right;
let isLeft = (ele, msg) => is(left(ele), left(scrollbox), msg);
let isRight = (ele, msg) => is(right(ele), right(scrollbox), msg);
let elementFromPoint = x => arrowScrollbox._elementFromPoint(x);
let nextLeftElement = () => elementFromPoint(left(scrollbox) - 1);
let nextRightElement = () => elementFromPoint(right(scrollbox) + 1);
let firstScrollable = () => tabs[gBrowser._numPinnedTabs];
let waitForNextFrame = async function() {
await window.promiseDocumentFlushed(() => {});
await new Promise(resolve => Services.tm.dispatchToMainThread(resolve));
};
arrowScrollbox.smoothScroll = false;
registerCleanupFunction(() => {
arrowScrollbox.smoothScroll = originalSmoothScroll;
});
while (tabs.length < tabCountForOverflow) {
BrowserTestUtils.addTab(gBrowser, "about:blank", { skipAnimation: true });
}
gBrowser.pinTab(tabs[0]);
await BrowserTestUtils.waitForCondition(() => {
return Array.from(gBrowser.tabs).every(tab => tab._fullyOpen);
});
ok(!scrollbox.hasAttribute("notoverflowing"),
"Tab strip should be overflowing");
let upButton = arrowScrollbox._scrollButtonUp;
let downButton = arrowScrollbox._scrollButtonDown;
let 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, {});
await waitForNextFrame();
isRight(element, "Scrolled one tab to the right with a single click");
gBrowser.selectedTab = tabs[tabs.length - 1];
await waitForNextFrame();
ok(right(gBrowser.selectedTab) <= right(scrollbox), "Selecting the last tab scrolls it into view " +
"(" + right(gBrowser.selectedTab) + " <= " + right(scrollbox) + ")");
element = nextLeftElement();
EventUtils.synthesizeMouseAtCenter(upButton, {});
await waitForNextFrame();
isLeft(element, "Scrolled one tab to the left with a single click");
let elementPoint = left(scrollbox) - width(scrollbox);
element = elementFromPoint(elementPoint);
element = element.nextElementSibling;
EventUtils.synthesizeMouseAtCenter(upButton, {clickCount: 2});
await waitForNextFrame();
await BrowserTestUtils.waitForCondition(() =>
!gBrowser.tabContainer.arrowScrollbox._isScrolling);
isLeft(element, "Scrolled one page of tabs with a double click");
EventUtils.synthesizeMouseAtCenter(upButton, {clickCount: 3});
await waitForNextFrame();
var firstScrollableLeft = left(firstScrollable());
ok(left(scrollbox) <= firstScrollableLeft, "Scrolled to the start with a triple click " +
"(" + left(scrollbox) + " <= " + firstScrollableLeft + ")");
while (tabs.length > 1) {
BrowserTestUtils.removeTab(gBrowser.tabs[0]);
}
});