Bug 1421507 - Throttle animations in position:fixed element that the element is out of view. r?tnikkel,boris
MozReview-Commit-ID: jLvrcVhTKW
--- a/dom/animation/test/mozilla/file_restyles.html
+++ b/dom/animation/test/mozilla/file_restyles.html
@@ -1184,16 +1184,62 @@ waitForAllPaints(() => {
is(markers.length, 0,
'CSS animation on an out-of-view position absolute element should ' +
'be throttled');
await ensureElementRemoval(div);
}
);
+ add_task(
+ async function throttling_animations_in_out_of_view_position_fixed_element() {
+ if (!offscreenThrottlingEnabled) {
+ return;
+ }
+
+ var parentDiv = addDiv(null,
+ { style: 'position: fixed; top: -1000px;' });
+ var targetDiv = addDiv(null,
+ { style: 'animation: background-color 100s;' });
+ parentDiv.appendChild(targetDiv);
+
+ var animation = targetDiv.getAnimations()[0];
+ await animation.ready;
+
+ var markers = await observeStyling(5);
+ is(markers.length, 0,
+ 'CSS animation on an out-of-view position:fixed element should be ' +
+ 'throttled');
+
+ await ensureElementRemoval(parentDiv);
+ }
+ );
+
+ add_task(
+ async function throttling_animations_on_out_of_view_position_fixed_element() {
+ if (!offscreenThrottlingEnabled) {
+ return;
+ }
+
+ var div = addDiv(null,
+ { style: 'animation: background-color 100s; ' +
+ 'position: fixed; top: -1000px;' });
+
+ var animation = div.getAnimations()[0];
+ await animation.ready;
+
+ var markers = await observeStyling(5);
+ is(markers.length, 0,
+ 'CSS animation on an out-of-view position:fixed element should be ' +
+ 'throttled');
+
+ await ensureElementRemoval(div);
+ }
+ );
+
add_task_if_omta_enabled(
async function no_restyling_for_compositor_animation_on_unrelated_style_change() {
var div = addDiv(null);
var animation = div.animate({ opacity: [0, 1] }, 100 * MS_PER_SEC);
await animation.ready;
ok(SpecialPowers.wrap(animation).isRunningOnCompositor,
'The opacity animation is running on the compositor');
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -11011,16 +11011,17 @@ nsIFrame::GetPseudoElement(CSSPseudoElem
static bool
IsFrameScrolledOutOfView(nsIFrame* aTarget,
const nsRect& aTargetRect,
nsIFrame* aParent)
{
nsIScrollableFrame* scrollableFrame =
nsLayoutUtils::GetNearestScrollableFrame(aParent,
nsLayoutUtils::SCROLLABLE_SAME_DOC |
+ nsLayoutUtils::SCROLLABLE_FIXEDPOS_FINDS_ROOT |
nsLayoutUtils::SCROLLABLE_INCLUDE_HIDDEN);
if (!scrollableFrame) {
return false;
}
nsIFrame *scrollableParent = do_QueryFrame(scrollableFrame);
nsRect transformedRect =