Bug 1430924 - Move mEventDispatcher in nsAnimationManager and nsTransitionManager into the common template class. r?boris
DispatchEvents() couldn't be moved since the function holds a reference of
nsAnimationManager or nsTransitionManager, but the common template class
is not ref-countable.
MozReview-Commit-ID: FfiJtzSZWn
--- a/layout/style/AnimationCommon.h
+++ b/layout/style/AnimationCommon.h
@@ -22,22 +22,23 @@
#include "nsCSSPseudoElements.h"
#include "nsCycleCollectionParticipant.h"
class nsIFrame;
class nsPresContext;
namespace mozilla {
enum class CSSPseudoElementType : uint8_t;
+template <class EventInfo> class DelayedEventDispatcher;
namespace dom {
class Element;
}
-template <class AnimationType>
+template <class AnimationType, class AnimationEventType>
class CommonAnimationManager {
public:
explicit CommonAnimationManager(nsPresContext *aPresContext)
: mPresContext(aPresContext)
{
}
// NOTE: This can return null after Disconnect().
@@ -69,16 +70,28 @@ public:
if (!collection) {
return;
}
nsAutoAnimationMutationBatch mb(aElement->OwnerDoc());
collection->Destroy();
}
+ /**
+ * Add a pending event.
+ */
+ void QueueEvent(AnimationEventType&& aEventInfo)
+ {
+ mEventDispatcher.QueueEvent(
+ mozilla::Forward<AnimationEventType>(aEventInfo));
+ }
+
+ void SortEvents() { mEventDispatcher.SortEvents(); }
+ void ClearEventQueue() { mEventDispatcher.ClearEventQueue(); }
+
protected:
virtual ~CommonAnimationManager()
{
MOZ_ASSERT(!mPresContext, "Disconnect should have been called");
}
void AddElementCollection(AnimationCollection<AnimationType>* aCollection)
{
@@ -89,16 +102,18 @@ protected:
while (AnimationCollection<AnimationType>* head =
mElementCollections.getFirst()) {
head->Destroy(); // Note: this removes 'head' from mElementCollections.
}
}
LinkedList<AnimationCollection<AnimationType>> mElementCollections;
nsPresContext *mPresContext; // weak (non-null from ctor to Disconnect)
+
+ mozilla::DelayedEventDispatcher<AnimationEventType> mEventDispatcher;
};
/**
* Utility class for referencing the element that created a CSS animation or
* transition. It is non-owning (i.e. it uses a raw pointer) since it is only
* expected to be set by the owned animation while it actually being managed
* by the owning element.
*
--- a/layout/style/nsAnimationManager.h
+++ b/layout/style/nsAnimationManager.h
@@ -308,21 +308,23 @@ struct AnimationTypeTraits<dom::CSSAnima
{
return nsGkAtoms::animationsOfAfterProperty;
}
};
} /* namespace mozilla */
class nsAnimationManager final
- : public mozilla::CommonAnimationManager<mozilla::dom::CSSAnimation>
+ : public mozilla::CommonAnimationManager<mozilla::dom::CSSAnimation,
+ mozilla::AnimationEventInfo>
{
public:
explicit nsAnimationManager(nsPresContext *aPresContext)
- : mozilla::CommonAnimationManager<mozilla::dom::CSSAnimation>(aPresContext)
+ : mozilla::CommonAnimationManager<mozilla::dom::CSSAnimation,
+ mozilla::AnimationEventInfo>(aPresContext)
{
}
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(nsAnimationManager)
NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(nsAnimationManager)
typedef mozilla::AnimationCollection<mozilla::dom::CSSAnimation>
CSSAnimationCollection;
@@ -345,38 +347,27 @@ public:
* but with servo's computed values.
*/
void UpdateAnimations(
mozilla::dom::Element* aElement,
mozilla::CSSPseudoElementType aPseudoType,
const mozilla::ServoStyleContext* aComputedValues);
/**
- * Add a pending event.
- */
- void QueueEvent(mozilla::AnimationEventInfo&& aEventInfo)
- {
- mEventDispatcher.QueueEvent(
- mozilla::Forward<mozilla::AnimationEventInfo>(aEventInfo));
- }
-
- /**
* Dispatch any pending events. We accumulate animationend and
* animationiteration events only during refresh driver notifications
* (and dispatch them at the end of such notifications), but we
* accumulate animationstart events at other points when style
* contexts are created.
*/
void DispatchEvents()
{
RefPtr<nsAnimationManager> kungFuDeathGrip(this);
mEventDispatcher.DispatchEvents(mPresContext);
}
- void SortEvents() { mEventDispatcher.SortEvents(); }
- void ClearEventQueue() { mEventDispatcher.ClearEventQueue(); }
// Utility function to walk through |aIter| to find the Keyframe with
// matching offset and timing function but stopping as soon as the offset
// differs from |aOffset| (i.e. it assumes a sorted iterator).
//
// If a matching Keyframe is found,
// Returns true and sets |aIndex| to the index of the matching Keyframe
// within |aIter|.
@@ -410,13 +401,11 @@ protected:
~nsAnimationManager() override = default;
private:
template<class BuilderType>
void DoUpdateAnimations(
const mozilla::NonOwningAnimationTarget& aTarget,
const nsStyleDisplay& aStyleDisplay,
BuilderType& aBuilder);
-
- mozilla::DelayedEventDispatcher<mozilla::AnimationEventInfo> mEventDispatcher;
};
#endif /* !defined(nsAnimationManager_h_) */
--- a/layout/style/nsTransitionManager.h
+++ b/layout/style/nsTransitionManager.h
@@ -337,21 +337,23 @@ struct TransitionEventInfo {
{
mEvent.AssignTransitionEventData(aOther.mEvent, false);
}
};
} // namespace mozilla
class nsTransitionManager final
- : public mozilla::CommonAnimationManager<mozilla::dom::CSSTransition>
+ : public mozilla::CommonAnimationManager<mozilla::dom::CSSTransition,
+ mozilla::TransitionEventInfo>
{
public:
explicit nsTransitionManager(nsPresContext *aPresContext)
- : mozilla::CommonAnimationManager<mozilla::dom::CSSTransition>(aPresContext)
+ : mozilla::CommonAnimationManager<mozilla::dom::CSSTransition,
+ mozilla::TransitionEventInfo>(aPresContext)
, mInAnimationOnlyStyleUpdate(false)
{
}
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(nsTransitionManager)
NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(nsTransitionManager)
typedef mozilla::AnimationCollection<mozilla::dom::CSSTransition>
@@ -399,29 +401,21 @@ public:
void SetInAnimationOnlyStyleUpdate(bool aInAnimationOnlyUpdate) {
mInAnimationOnlyStyleUpdate = aInAnimationOnlyUpdate;
}
bool InAnimationOnlyStyleUpdate() const {
return mInAnimationOnlyStyleUpdate;
}
- void QueueEvent(mozilla::TransitionEventInfo&& aEventInfo)
- {
- mEventDispatcher.QueueEvent(
- mozilla::Forward<mozilla::TransitionEventInfo>(aEventInfo));
- }
-
void DispatchEvents()
{
RefPtr<nsTransitionManager> kungFuDeathGrip(this);
mEventDispatcher.DispatchEvents(mPresContext);
}
- void SortEvents() { mEventDispatcher.SortEvents(); }
- void ClearEventQueue() { mEventDispatcher.ClearEventQueue(); }
protected:
virtual ~nsTransitionManager() {}
typedef nsTArray<RefPtr<mozilla::dom::CSSTransition>>
OwningCSSTransitionPtrArray;
// Update transitions. This will start new transitions,
@@ -445,14 +439,11 @@ protected:
mozilla::CSSPseudoElementType aPseudoType,
CSSTransitionCollection*& aElementTransitions,
StyleType aOldStyle,
StyleType aNewStyle,
bool* aStartedAny,
nsCSSPropertyIDSet* aWhichStarted);
bool mInAnimationOnlyStyleUpdate;
-
- mozilla::DelayedEventDispatcher<mozilla::TransitionEventInfo>
- mEventDispatcher;
};
#endif /* !defined(nsTransitionManager_h_) */