gecko-dev/dom/animation/AnimationPerformanceWarning.cpp
Boris Chiou b5a2513e31 Bug 1534884 - Add new animation warning for animations overridden by important rules. r=birtles
We move the check of important rule and animation level into
KeyframeEffect::ShouldBlockAsyncTransformAnimations(), and add a new warning
for it.

Note:
1. ShouldBlockAsyncTransformAnimations() only cares about transforms. And
   for other compositor animation properties, we count on
   HasEffectiveAnimationOfPropertySet() (in IsMatchForCompositor()).
2. If we check the important rules in both
   EffectCompositor::HasAnimationsForCompositor() and
   ActiveLayerTracker::IsTransformMaybeAnimated(), we may get the incorrect
   animation warnings (i.e. TransformFrameInactive). In most cases, we
   check these two functions together, so perhaps move the check of important
   rules outside HasEffectiveAnimationOfPropertySet() is fine.
   Besides, ActiveLayerTracker just tracks if there is a style change on this
   property (or display item) on the active layers, so should be OK to not
   check important rules in it.

So IsMatchForCompositor() should check all transform-like properties,
instead of each one, to get the correct result. (That's why we have to
refactor KeyframeEffect::GetPropertiesForCompositor() as well.)

Differential Revision: https://phabricator.services.mozilla.com/D34432

--HG--
extra : moz-landing-system : lando
2019-06-28 18:18:08 +00:00

82 lines
3.0 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "AnimationPerformanceWarning.h"
#include "nsContentUtils.h"
namespace mozilla {
template <uint32_t N>
nsresult AnimationPerformanceWarning::ToLocalizedStringWithIntParams(
const char* aKey, nsAString& aLocalizedString) const {
AutoTArray<nsString, N> strings;
MOZ_DIAGNOSTIC_ASSERT(mParams->Length() == N);
for (size_t i = 0, n = mParams->Length(); i < n; i++) {
strings.AppendElement()->AppendInt((*mParams)[i]);
}
return nsContentUtils::FormatLocalizedString(
nsContentUtils::eLAYOUT_PROPERTIES, aKey, strings, aLocalizedString);
}
bool AnimationPerformanceWarning::ToLocalizedString(
nsAString& aLocalizedString) const {
const char* key = nullptr;
switch (mType) {
case Type::ContentTooLarge:
MOZ_ASSERT(mParams && mParams->Length() == 6,
"Parameter's length should be 6 for ContentTooLarge2");
return NS_SUCCEEDED(ToLocalizedStringWithIntParams<6>(
"CompositorAnimationWarningContentTooLarge2", aLocalizedString));
case Type::ContentTooLargeArea:
MOZ_ASSERT(mParams && mParams->Length() == 2,
"Parameter's length should be 2 for ContentTooLargeArea");
return NS_SUCCEEDED(ToLocalizedStringWithIntParams<2>(
"CompositorAnimationWarningContentTooLargeArea", aLocalizedString));
case Type::TransformBackfaceVisibilityHidden:
key = "CompositorAnimationWarningTransformBackfaceVisibilityHidden";
break;
case Type::TransformPreserve3D:
key = "CompositorAnimationWarningTransformPreserve3D";
break;
case Type::TransformSVG:
key = "CompositorAnimationWarningTransformSVG";
break;
case Type::TransformWithGeometricProperties:
key = "CompositorAnimationWarningTransformWithGeometricProperties";
break;
case Type::TransformWithSyncGeometricAnimations:
key = "CompositorAnimationWarningTransformWithSyncGeometricAnimations";
break;
case Type::TransformFrameInactive:
key = "CompositorAnimationWarningTransformFrameInactive";
break;
case Type::TransformIsBlockedByImportantRules:
key = "CompositorAnimationWarningTransformIsBlockedByImportantRules";
break;
case Type::OpacityFrameInactive:
key = "CompositorAnimationWarningOpacityFrameInactive";
break;
case Type::HasRenderingObserver:
key = "CompositorAnimationWarningHasRenderingObserver";
break;
case Type::None:
MOZ_ASSERT_UNREACHABLE("Uninitialized type shouldn't be used");
return false;
}
nsresult rv = nsContentUtils::GetLocalizedString(
nsContentUtils::eLAYOUT_PROPERTIES, key, aLocalizedString);
return NS_SUCCEEDED(rv);
}
} // namespace mozilla