/* eslint-disable mozilla/no-arbitrary-setTimeout */ // This test verifies that the find scrollbar marks are triggered in the right locations. // Reftests in layout/xul/reftest are used to verify their appearance. const TEST_PAGE_URI = "data:text/html,

This is some fun text.

This is some tex to find.

This is some text to find.

"; let gUpdateCount = 0; requestLongerTimeout(5); function initForBrowser(browser) { gUpdateCount = 0; browser.sendMessageToActor( "Finder:EnableMarkTesting", { enable: true }, "Finder" ); let checkFn = event => { event.target.lastMarks = event.detail; event.target.eventsCount = event.target.eventsCount ? event.target.eventsCount + 1 : 1; return false; }; let endFn = BrowserTestUtils.addContentEventListener( browser, "find-scrollmarks-changed", () => {}, { capture: true }, 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 (let step = 0; step < 3; step++) { // If the document root or body is absolutely positioned, this can affect the scroll height. await SpecialPowers.spawn(browser, [step], stepChild => { let document = content.document; let adjustments = [ () => {}, () => { document.documentElement.style.position = "absolute;"; }, () => { document.documentElement.style.position = ""; document.body.style.position = "absolute"; }, ]; adjustments[stepChild](); }); // 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); let values = await getMarks(browser, true); // The exact values vary on each platform, so use fuzzy matches. // 2610 is the approximate expected document height, and // 10, 2040, 2570 are the approximate positions of the marks. const expectedDocHeight = 2610; isfuzzy( values[0], Math.round(10 * (scrollMaxY / expectedDocHeight)), 10, "first value" ); isfuzzy( values[1], Math.round(2040 * (scrollMaxY / expectedDocHeight)), 10, "second value" ); isfuzzy( values[2], Math.round(2570 * (scrollMaxY / expectedDocHeight)), 10, "third value" ); await doAndVerifyFind(browser, "text", true, [values[0], values[2]]); await doAndVerifyFind(browser, "", true, []); await doAndVerifyFind(browser, "isz", false, [], true); // marks should not be updated here await doAndVerifyFind(browser, "tex", true, values); await doAndVerifyFind(browser, "isz", true, []); await doAndVerifyFind(browser, "tex", true, values); let findbar = await gBrowser.getFindBar(); let closedPromise = BrowserTestUtils.waitForEvent(findbar, "findbarclose"); await EventUtils.synthesizeKey("KEY_Escape"); await closedPromise; await verifyFind(browser, "", true, []); } endFn(); gBrowser.removeTab(tab); }); add_task(async function test_findmarks_vertical() { let tab = await BrowserTestUtils.openNewForegroundTab( gBrowser, TEST_PAGE_URI ); let browser = tab.linkedBrowser; let endFn = initForBrowser(browser); for (let mode of [ "sideways-lr", "sideways-rl", "vertical-lr", "vertical-rl", ]) { const maxMarkPos = await SpecialPowers.spawn( browser, [mode], writingMode => { let document = content.document; document.documentElement.style.writingMode = writingMode; return content.scrollMaxX - content.scrollMinX; } ); await promiseFindFinished(gBrowser, "tex", true); const marks = await getMarks(browser, true, true); Assert.equal(marks.length, 3, `marks count with text "tex"`); for (const markPos of marks) { Assert.ok( 0 <= markPos <= maxMarkPos, `mark position ${markPos} should be in the range 0 ~ ${maxMarkPos}` ); } } endFn(); 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 ); 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(window2.outerWidth - 100, window2.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); info(`values: ${JSON.stringify(values)}`); info(`resizedValues: ${JSON.stringify(resizedValues)}`); isfuzzy(resizedValues[0], values[0], 2, "first value"); Assert.greater(resizedValues[1] - 50, values[1], "second value"); Assert.greater(resizedValues[2] - 50, values[2], "third value"); endFn(); await BrowserTestUtils.closeWindow(window2); }); // Returns the scroll marks that should have been assigned // to the scrollbar after a find. As a side effect, also // verifies that the marks have been updated since the last // call to getMarks. If increase is true, then the marks should // have been updated, and if increase is false, the marks should // not have been updated. async function getMarks(browser, increase, shouldBeOnHScrollbar = false) { let results = await SpecialPowers.spawn(browser, [], () => { let { marks, onHorizontalScrollbar } = content.lastMarks; content.lastMarks = {}; return { onHorizontalScrollbar, marks: marks || [], count: content.eventsCount, }; }); // The marks are updated whenever the scrollbar is updated and // this could happen several times as either a find for multiple // characters occurs. This check allows for mutliple updates to occur. if (increase) { Assert.ok(results.count > gUpdateCount, "expected events count"); Assert.strictEqual( results.onHorizontalScrollbar, shouldBeOnHScrollbar, "marks should be on the horizontal scrollbar" ); } else { Assert.equal(results.count, gUpdateCount, "expected events count"); } gUpdateCount = results.count; return results.marks; } async function doAndVerifyFind(browser, text, increase, expectedMarks) { await promiseFindFinished(browser.getTabBrowser(), text, true); return verifyFind(browser, text, increase, expectedMarks); } async function verifyFind(browser, text, increase, expectedMarks) { let foundMarks = await getMarks(browser, increase); is(foundMarks.length, expectedMarks.length, "marks count with text " + text); for (let t = 0; t < foundMarks.length; t++) { isfuzzy( foundMarks[t], expectedMarks[t], 5, "mark " + t + " with text " + text ); } Assert.deepEqual(foundMarks, expectedMarks, "basic find with text " + text); }