AnimationCollection.cpp (2787B)
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/. */ 6 7 #include "mozilla/AnimationCollection.h" 8 9 #include <type_traits> 10 11 #include "mozilla/ElementAnimationData.h" 12 #include "mozilla/RestyleManager.h" 13 #include "mozilla/dom/CSSAnimation.h" // For dom::CSSAnimation 14 #include "mozilla/dom/CSSTransition.h" // For dom::CSSTransition 15 #include "nsDOMMutationObserver.h" // For nsAutoAnimationMutationBatch 16 17 namespace mozilla { 18 19 template <class AnimationType> 20 AnimationCollection<AnimationType>::~AnimationCollection() { 21 MOZ_COUNT_DTOR(AnimationCollection); 22 23 const PostRestyleMode postRestyle = 24 mCalledDestroy ? PostRestyleMode::IfNeeded : PostRestyleMode::Never; 25 { 26 nsAutoAnimationMutationBatch mb(mElement.OwnerDoc()); 27 28 for (size_t animIdx = mAnimations.Length(); animIdx-- != 0;) { 29 mAnimations[animIdx]->CancelFromStyle(postRestyle); 30 } 31 } 32 LinkedListElement<SelfType>::remove(); 33 } 34 35 template <class AnimationType> 36 void AnimationCollection<AnimationType>::Destroy() { 37 mCalledDestroy = true; 38 auto* data = mElement.GetAnimationData(); 39 MOZ_ASSERT(data); 40 // Copy the request because mPseudo may be deleted when clearing the 41 // collection. 42 const PseudoStyleRequest request = mPseudo; 43 if constexpr (std::is_same_v<AnimationType, dom::CSSAnimation>) { 44 MOZ_ASSERT(data->GetAnimationCollection(request) == this); 45 data->ClearAnimationCollectionFor(request); 46 } else { 47 MOZ_ASSERT(data->GetTransitionCollection(request) == this); 48 data->ClearTransitionCollectionFor(request); 49 } 50 } 51 52 template <class AnimationType> 53 AnimationCollection<AnimationType>* AnimationCollection<AnimationType>::Get( 54 const dom::Element* aElement, const PseudoStyleRequest& aRequest) { 55 auto* data = aElement->GetAnimationData(); 56 if (!data) { 57 return nullptr; 58 } 59 if constexpr (std::is_same_v<AnimationType, dom::CSSAnimation>) { 60 return data->GetAnimationCollection(aRequest); 61 } else { 62 return data->GetTransitionCollection(aRequest); 63 } 64 } 65 66 template <class AnimationType> 67 /* static */ AnimationCollection<AnimationType>* 68 AnimationCollection<AnimationType>::Get(const nsIFrame* aFrame) { 69 Maybe<NonOwningAnimationTarget> target = 70 EffectCompositor::GetAnimationElementAndPseudoForFrame(aFrame); 71 if (!target) { 72 return nullptr; 73 } 74 75 return Get(target->mElement, target->mPseudoRequest); 76 } 77 78 // Explicit class instantiations 79 80 template class AnimationCollection<dom::CSSAnimation>; 81 template class AnimationCollection<dom::CSSTransition>; 82 83 } // namespace mozilla