1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "mozilla/AnimationCollection.h"
10 #include "mozilla/ElementAnimationData.h"
11 #include "mozilla/RestyleManager.h"
12 #include "nsDOMMutationObserver.h" // For nsAutoAnimationMutationBatch
13 #include "mozilla/dom/CSSAnimation.h" // For dom::CSSAnimation
14 #include "mozilla/dom/CSSTransition.h" // For dom::CSSTransition
18 template <class AnimationType
>
19 AnimationCollection
<AnimationType
>::~AnimationCollection() {
20 MOZ_COUNT_DTOR(AnimationCollection
);
22 const PostRestyleMode postRestyle
=
23 mCalledDestroy
? PostRestyleMode::IfNeeded
: PostRestyleMode::Never
;
25 nsAutoAnimationMutationBatch
mb(mElement
.OwnerDoc());
27 for (size_t animIdx
= mAnimations
.Length(); animIdx
-- != 0;) {
28 mAnimations
[animIdx
]->CancelFromStyle(postRestyle
);
31 LinkedListElement
<SelfType
>::remove();
34 template <class AnimationType
>
35 void AnimationCollection
<AnimationType
>::Destroy() {
36 mCalledDestroy
= true;
37 auto* data
= mElement
.GetAnimationData();
39 if constexpr (std::is_same_v
<AnimationType
, dom::CSSAnimation
>) {
40 MOZ_ASSERT(data
->GetAnimationCollection(mPseudo
) == this);
41 data
->ClearAnimationCollectionFor(mPseudo
);
43 MOZ_ASSERT(data
->GetTransitionCollection(mPseudo
) == this);
44 data
->ClearTransitionCollectionFor(mPseudo
);
48 template <class AnimationType
>
49 AnimationCollection
<AnimationType
>* AnimationCollection
<AnimationType
>::Get(
50 const dom::Element
* aElement
, const PseudoStyleType aType
) {
51 auto* data
= aElement
->GetAnimationData();
55 if constexpr (std::is_same_v
<AnimationType
, dom::CSSAnimation
>) {
56 return data
->GetAnimationCollection(aType
);
58 return data
->GetTransitionCollection(aType
);
62 template <class AnimationType
>
63 /* static */ AnimationCollection
<AnimationType
>*
64 AnimationCollection
<AnimationType
>::Get(const nsIFrame
* aFrame
) {
65 Maybe
<NonOwningAnimationTarget
> target
=
66 EffectCompositor::GetAnimationElementAndPseudoForFrame(aFrame
);
71 return Get(target
->mElement
, target
->mPseudoType
);
74 // Explicit class instantiations
76 template class AnimationCollection
<dom::CSSAnimation
>;
77 template class AnimationCollection
<dom::CSSTransition
>;
79 } // namespace mozilla