diff options
Diffstat (limited to 'gfx/layers/apz/test/mochitest/browser_test_autoscrolling_in_oop_frame.js')
-rw-r--r-- | gfx/layers/apz/test/mochitest/browser_test_autoscrolling_in_oop_frame.js | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/gfx/layers/apz/test/mochitest/browser_test_autoscrolling_in_oop_frame.js b/gfx/layers/apz/test/mochitest/browser_test_autoscrolling_in_oop_frame.js new file mode 100644 index 0000000000..26d0ff6109 --- /dev/null +++ b/gfx/layers/apz/test/mochitest/browser_test_autoscrolling_in_oop_frame.js @@ -0,0 +1,120 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +Services.scriptloader.loadSubScript( + "chrome://mochitests/content/browser/gfx/layers/apz/test/mochitest/apz_test_utils.js", + this +); + +Services.scriptloader.loadSubScript( + "chrome://mochitests/content/browser/gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js", + this +); + +add_setup(async function () { + await SpecialPowers.pushPrefEnv({ + set: [ + ["general.autoScroll", true], + ["middlemouse.contentLoadURL", false], + ["test.events.async.enabled", true], + ], + }); +}); + +async function doTest() { + function httpURL(filename) { + const chromeURL = getRootDirectory(gTestPath) + filename; + return chromeURL.replace( + "chrome://mochitests/content/", + "http://mochi.test:8888/" + ); + } + + function getScrollY(context) { + return SpecialPowers.spawn(context, [], () => content.scrollY); + } + + const pageUrl = httpURL("helper_test_autoscrolling_in_oop_frame.html"); + + await BrowserTestUtils.withNewTab(pageUrl, async function (browser) { + await promiseApzFlushedRepaintsInPopup(browser); + + const iframeContext = browser.browsingContext.children[0]; + await promiseApzFlushedRepaintsInPopup(iframeContext); + + const { screenX, screenY, viewId, presShellId } = await SpecialPowers.spawn( + iframeContext, + [], + () => { + const winUtils = SpecialPowers.getDOMWindowUtils(content); + return { + screenX: content.mozInnerScreenX * content.devicePixelRatio, + screenY: content.mozInnerScreenY * content.devicePixelRatio, + viewId: winUtils.getViewId(content.document.documentElement), + presShellId: winUtils.getPresShellId(), + }; + } + ); + + ok( + iframeContext.startApzAutoscroll( + screenX + 100, + screenY + 50, + viewId, + presShellId + ), + "Started autscroll" + ); + + const scrollEventPromise = SpecialPowers.spawn( + iframeContext, + [], + async () => { + return new Promise(resolve => { + content.addEventListener( + "scroll", + event => { + dump("Got a scroll event in the iframe\n"); + resolve(); + }, + { once: true } + ); + }); + } + ); + + // Send sequential mousemove events to cause autoscrolling. + for (let i = 0; i < 10; i++) { + await promiseNativeMouseEventWithAPZ({ + type: "mousemove", + target: browser, + offsetX: 100, + offsetY: 50 + i * 10, + }); + } + + // Flush APZ repaints and waits for MozAfterPaint to make sure the scroll has + // been reflected on the main thread. + const apzPromise = promiseApzFlushedRepaintsInPopup(browser); + + await Promise.all([apzPromise, scrollEventPromise]); + + const frameScrollY = await getScrollY(iframeContext); + ok(frameScrollY > 0, "Autoscrolled the iframe"); + + const rootScrollY = await getScrollY(browser); + ok(rootScrollY == 0, "Didn't scroll the root document"); + + iframeContext.stopApzAutoscroll(viewId, presShellId); + }); +} + +add_task(async function test_autoscroll_in_oop_iframe() { + await doTest(); +}); + +add_task(async function test_autoscroll_in_oop_iframe_with_os_zoom() { + await SpecialPowers.pushPrefEnv({ set: [["ui.textScaleFactor", 200]] }); + await doTest(); +}); |