tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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