summaryrefslogtreecommitdiffstats
path: root/gfx/tests/browser/browser_partial_prerender_animation_in_popup.js
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/tests/browser/browser_partial_prerender_animation_in_popup.js')
-rw-r--r--gfx/tests/browser/browser_partial_prerender_animation_in_popup.js90
1 files changed, 90 insertions, 0 deletions
diff --git a/gfx/tests/browser/browser_partial_prerender_animation_in_popup.js b/gfx/tests/browser/browser_partial_prerender_animation_in_popup.js
new file mode 100644
index 0000000000..397531763f
--- /dev/null
+++ b/gfx/tests/browser/browser_partial_prerender_animation_in_popup.js
@@ -0,0 +1,90 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/* import-globals-from ../../../dom/animation/test/testcommon.js */
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/tests/dom/animation/test/testcommon.js",
+ this
+);
+
+add_task(async () => {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["layout.animation.prerender.partial", true],
+ ["layout.animation.prerender.viewport-ratio-limit", 1.125],
+ ],
+ });
+
+ let navBar = document.getElementById("nav-bar");
+
+ const anchor = document.createXULElement("toolbarbutton");
+ anchor.classList.add("toolbarbutton-1", "chromeclass-toolbar-additional");
+ navBar.appendChild(anchor);
+
+ // Prepare a popup panel.
+ const panel = document.createXULElement("panel");
+ panel.setAttribute("noautohide", true);
+ navBar.appendChild(panel);
+
+ // Add a overflow:scroll container to avoid expanding the popup window size.
+ const container = document.createElement("div");
+ container.style = "width: 100px; height: 100px; overflow: scroll;";
+
+ // Looks like in popup window wider elements in the overflow:scroll container
+ // are still affecting the viewport size of the popup content, for example,
+ // if we specify "witdh: 800px" here, this element is not going to be partial-
+ // prerendered, it will be fully prerendered, so we use vertically overflowed
+ // element here.
+ const target = document.createElement("div");
+ target.style = "width: 100px; height: 800px;";
+
+ container.appendChild(target);
+ panel.appendChild(container);
+
+ registerCleanupFunction(() => {
+ panel.remove();
+ anchor.remove();
+ });
+
+ panel.openPopup(anchor);
+
+ // Start a transform transition with a 1s delay step-start function so that
+ // we can ensure that
+ // 1) when the target element is initially composited on the compositor the
+ // transition hasn't yet started, thus no jank happens
+ // 2) when the transition starts on the compositor thread, it causes a jank
+ // so that it will report back to the main-thread
+ target.style.transition = "transform 100s step-start 1s";
+ getComputedStyle(target);
+ const startTransition = new Promise(resolve => {
+ target.addEventListener("transitionstart", resolve);
+ });
+ target.style.transform = "translateY(-130px)";
+ const transition = target.getAnimations()[0];
+
+ // Wait for the transition start.
+ await startTransition;
+
+ // Make sure it's running on the compositor.
+ Assert.ok(
+ transition.isRunningOnCompositor,
+ "The transition should be running on the compositor thread"
+ );
+
+ // Collect restyling markers in 5 frames.
+ const restyleCount = await observeStylingInTargetWindow(panel.ownerGlobal, 5);
+
+ // On non WebRender we observe two restyling markers because we get the second
+ // jank report from the compositor thread before a new pre-rendered result,
+ // which was triggered by the first jank report, reached to the compositor
+ // thread. So we allow one or two makers here.
+ // NOTE: Since we wrap the target element in overflow:scroll container, we
+ // might see an additional restyling marker triggered by
+ // KeyframeEffect::OverflowRegionRefreshInterval (200ms) on very slow
+ // platforms (e.g. TSAN builds), if it happens we should allow the additional
+ // restyling here.
+ Assert.greaterOrEqual(restyleCount, 1);
+ Assert.lessOrEqual(restyleCount, 2);
+});