Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

add_task(async function test_main() {
// Load page in the background. This will cause the first-paint of the
// tab (which has ScrollPositionUpdate instances) to get sent to the
// compositor, but the parent process RefLayer won't be pointing to this
// tab so APZ never sees the ScrollPositionUpdate instances.
let url =
let backgroundTab = BrowserTestUtils.addTab(gBrowser, url);
let browser = backgroundTab.linkedBrowser;
await BrowserTestUtils.browserLoaded(browser, false, url);
dump("Done loading background tab\n");
// Switch to the foreground, to let the APZ tree get built.
await BrowserTestUtils.switchTab(gBrowser, backgroundTab);
dump("Switched background tab to foreground\n");
// Verify main-thread scroll position is where we expect
let scrollPos = await ContentTask.spawn(browser, null, function () {
return content.window.scrollY;
});
is(scrollPos, 5000, "Expected background tab to be at scroll pos 5000");
// Trigger an APZ-side scroll via native wheel event, followed by some code
// to ensure APZ's repaint requests to arrive at the main-thread. If
// things are working properly, the main thread will accept the repaint
// requests and update the main-thread scroll position. If the APZ side
// is sending incorrect scroll generations in the repaint request, then
// the main thread will fail to clear the main-thread scroll origin (which
// was set by the scroll to the #scrolltarget anchor), and so will not
// accept APZ's scroll position updates.
let contentScrollFunction = async function () {
await content.window.wrappedJSObject.promiseNativeWheelAndWaitForWheelEvent(
content.window,
100,
100,
0,
200
);
// Advance some/all frames of the APZ wheel animation
let utils = content.window.SpecialPowers.getDOMWindowUtils(content.window);
for (var i = 0; i < 10; i++) {
utils.advanceTimeAndRefresh(16);
}
utils.restoreNormalRefresh();
// Flush pending APZ repaints, then read the main-thread scroll
// position
await content.window.wrappedJSObject.promiseOnlyApzControllerFlushed(
content.window
);
return content.window.scrollY;
};
scrollPos = await ContentTask.spawn(browser, null, contentScrollFunction);
// Verify main-thread scroll position has changed
ok(
scrollPos < 5000,
`Expected background tab to have scrolled up, is at ${scrollPos}`
);
// Cleanup
let tabClosed = BrowserTestUtils.waitForTabClosing(backgroundTab);
BrowserTestUtils.removeTab(backgroundTab);
await tabClosed;
});