summaryrefslogtreecommitdiffstats
path: root/gfx/layers/apz/test/mochitest/browser_test_autoscrolling_in_oop_frame.js
diff options
context:
space:
mode:
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.js120
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();
+});