gecko-dev/dom/animation/AnimationPerformanceWarning.h
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
2.8 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/. */
#ifndef mozilla_dom_AnimationPerformanceWarning_h
#define mozilla_dom_AnimationPerformanceWarning_h
#include <initializer_list>
#include "mozilla/Maybe.h"
#include "nsStringFwd.h"
#include "nsTArray.h"
namespace mozilla {
// Represents the reason why we can't run the CSS property on the compositor.
struct AnimationPerformanceWarning {
enum class Type : uint8_t {
None,
ContentTooLarge,
ContentTooLargeArea,
TransformBackfaceVisibilityHidden,
TransformPreserve3D,
TransformSVG,
TransformWithGeometricProperties,
TransformWithSyncGeometricAnimations,
TransformFrameInactive,
TransformIsBlockedByImportantRules,
OpacityFrameInactive,
HasRenderingObserver,
};
explicit AnimationPerformanceWarning(Type aType) : mType(aType) {
MOZ_ASSERT(mType != Type::None);
}
AnimationPerformanceWarning(Type aType,
std::initializer_list<int32_t> aParams)
: mType(aType) {
MOZ_ASSERT(mType != Type::None);
// FIXME: Once std::initializer_list::size() become a constexpr function,
// we should use static_assert here.
MOZ_ASSERT(aParams.size() <= kMaxParamsForLocalization,
"The length of parameters should be less than "
"kMaxParamsForLocalization");
mParams.emplace(aParams);
}
// Maximum number of parameters passed to
// nsContentUtils::FormatLocalizedString to localize warning messages.
//
// NOTE: This constexpr can't be forward declared, so if you want to use
// this variable, please include this header file directly.
// This value is the same as the limit of nsStringBundle::FormatString.
// See the implementation of nsStringBundle::FormatString.
static constexpr uint8_t kMaxParamsForLocalization = 10;
// Indicates why this property could not be animated on the compositor.
Type mType;
// Optional parameters that may be used for localization.
Maybe<nsTArray<int32_t>> mParams;
bool ToLocalizedString(nsAString& aLocalizedString) const;
template <uint32_t N>
nsresult ToLocalizedStringWithIntParams(const char* aKey,
nsAString& aLocalizedString) const;
bool operator==(const AnimationPerformanceWarning& aOther) const {
return mType == aOther.mType && mParams == aOther.mParams;
}
bool operator!=(const AnimationPerformanceWarning& aOther) const {
return !(*this == aOther);
}
};
} // namespace mozilla
#endif // mozilla_dom_AnimationPerformanceWarning_h