Bug 1690791, update the scroll tick marks when the browser window is resized. In addition, this ensures that the tick marks update when the scrollbar is made visible after resizing the content area, r=mikedeboer

Differential Revision: https://phabricator.services.mozilla.com/D104319
This commit is contained in:
Neil Deakin 2021-02-12 00:51:19 +00:00
parent 2b2b87d224
commit edec05a07b
2 changed files with 82 additions and 29 deletions

View File

@ -8,19 +8,8 @@ const TEST_PAGE_URI =
let gUpdateCount = 0;
add_task(async function test_findmarks() {
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
TEST_PAGE_URI
);
// Open the findbar so that the content scroll size can be measured.
await promiseFindFinished(gBrowser, "s");
let browser = tab.linkedBrowser;
let scrollMaxY = await SpecialPowers.spawn(browser, [], () => {
return content.scrollMaxY;
});
function initForBrowser(browser) {
gUpdateCount = 0;
browser.sendMessageToActor(
"Finder:EnableMarkTesting",
@ -44,6 +33,33 @@ add_task(async function test_findmarks() {
checkFn
);
return () => {
browser.sendMessageToActor(
"Finder:EnableMarkTesting",
{ enable: false },
"Finder"
);
endFn();
};
}
add_task(async function test_findmarks() {
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
TEST_PAGE_URI
);
// Open the findbar so that the content scroll size can be measured.
await promiseFindFinished(gBrowser, "s");
let browser = tab.linkedBrowser;
let scrollMaxY = await SpecialPowers.spawn(browser, [], () => {
return content.scrollMaxY;
});
let endFn = initForBrowser(browser);
// For the first value, get the numbers and ensure that they are approximately
// in the right place. Later tests should give the same values.
await promiseFindFinished(gBrowser, "tex", true);
@ -71,13 +87,41 @@ add_task(async function test_findmarks() {
endFn();
browser.sendMessageToActor(
"Finder:EnableMarkTesting",
{ enable: false },
"Finder"
gBrowser.removeTab(tab);
});
// This test verifies what happens when scroll marks are visible and the window is resized.
add_task(async function test_found_resize() {
let window2 = await BrowserTestUtils.openNewBrowserWindow({});
let tab = await BrowserTestUtils.openNewForegroundTab(
window2.gBrowser,
TEST_PAGE_URI
);
gBrowser.removeTab(tab);
let browser = tab.linkedBrowser;
let endFn = initForBrowser(browser);
await promiseFindFinished(window2.gBrowser, "tex", true);
let values = await getMarks(browser, true);
let resizePromise = BrowserTestUtils.waitForContentEvent(
browser,
"resize",
true
);
window2.resizeTo(outerWidth - 100, outerHeight - 80);
await resizePromise;
// Some number of extra scrollbar adjustment and painting events can occur
// when resizing the window, so don't use an exact match for the count.
let resizedValues = await getMarks(browser, true);
SimpleTest.isfuzzy(resizedValues[0], values[0], 2, "first value");
SimpleTest.ok(resizedValues[1] - 50 > values[1], "second value");
SimpleTest.ok(resizedValues[2] - 50 > values[2], "third value");
endFn();
await BrowserTestUtils.closeWindow(window2);
});
// Returns the scroll marks that should have been assigned
@ -110,7 +154,7 @@ async function getMarks(browser, increase) {
}
async function doAndVerifyFind(browser, text, increase, expectedMarks) {
await promiseFindFinished(gBrowser, text, true);
await promiseFindFinished(browser.getTabBrowser(), text, true);
return verifyFind(browser, text, increase, expectedMarks);
}

View File

@ -612,8 +612,8 @@ FinderHighlighter.prototype = {
let window = this.finder._getWindow();
let yStart = window.scrollY;
// If the document is not scrollable, there is no scrollbar to show marks on.
if (window && window.scrollMaxY > 0) {
let hasRanges = false;
if (window) {
let controllers = [this.finder._getSelectionController(window)];
let editors = this.editors;
if (editors) {
@ -627,18 +627,25 @@ FinderHighlighter.prototype = {
);
let rangeCount = findSelection.rangeCount;
let yAdj =
window.scrollMaxY /
window.document.documentElement.getBoundingClientRect().height;
for (let r = 0; r < rangeCount; r++) {
let rect = findSelection.getRangeAt(r).getBoundingClientRect();
let yPos = Math.round((yStart + rect.y + rect.height / 2) * yAdj); // use the midpoint
marks.add(yPos);
if (rangeCount > 0) {
hasRanges = true;
}
// No need to calculate the mark positions if there is no visible scrollbar.
if (window.scrollMaxY > 0) {
let yAdj =
window.scrollMaxY /
window.document.documentElement.getBoundingClientRect().height;
for (let r = 0; r < rangeCount; r++) {
let rect = findSelection.getRangeAt(r).getBoundingClientRect();
let yPos = Math.round((yStart + rect.y + rect.height / 2) * yAdj); // use the midpoint
marks.add(yPos);
}
}
}
}
if (marks.size) {
if (hasRanges) {
// Assign the marks to the window and add a listener for the MozScrolledAreaChanged
// event which fires whenever the scrollable area's size is updated.
this.setScrollMarks(window, Array.from(marks));
@ -653,6 +660,7 @@ FinderHighlighter.prototype = {
this._marksListener,
true
);
window.addEventListener("resize", this._marksListener);
}
} else if (this._marksListener) {
// No results were found so remove any existing ones and the MozScrolledAreaChanged listener.
@ -676,6 +684,7 @@ FinderHighlighter.prototype = {
this._marksListener,
true
);
window.removeEventListener("resize", this._marksListener);
this._marksListener = null;
}
this.setScrollMarks(window, []);