Maybe<NonOwningAnimationTarget> nsNodeUtils::GetTargetForAnimation(const Animation* aAnimation) { AnimationEffectReadOnly* effect = aAnimation->GetEffect(); if (!effect || !effect->AsKeyframeEffect()) { return Nothing(); } return effect->AsKeyframeEffect()->GetTarget(); }
static void UpdateOldAnimationPropertiesWithNew( CSSAnimation& aOld, TimingParams& aNewTiming, nsTArray<Keyframe>& aNewKeyframes, bool aNewIsStylePaused, nsStyleContext* aStyleContext) { bool animationChanged = false; // Update the old from the new so we can keep the original object // identity (and any expando properties attached to it). if (aOld.GetEffect()) { AnimationEffectReadOnly* oldEffect = aOld.GetEffect(); animationChanged = oldEffect->SpecifiedTiming() != aNewTiming; oldEffect->SetSpecifiedTiming(aNewTiming); KeyframeEffectReadOnly* oldKeyframeEffect = oldEffect->AsKeyframeEffect(); if (oldKeyframeEffect) { oldKeyframeEffect->SetKeyframes(Move(aNewKeyframes), aStyleContext); } } // Handle changes in play state. If the animation is idle, however, // changes to animation-play-state should *not* restart it. if (aOld.PlayState() != AnimationPlayState::Idle) { // CSSAnimation takes care of override behavior so that, // for example, if the author has called pause(), that will // override the animation-play-state. // (We should check aNew->IsStylePaused() but that requires // downcasting to CSSAnimation and we happen to know that // aNew will only ever be paused by calling PauseFromStyle // making IsPausedOrPausing synonymous in this case.) if (!aOld.IsStylePaused() && aNewIsStylePaused) { aOld.PauseFromStyle(); animationChanged = true; } else if (aOld.IsStylePaused() && !aNewIsStylePaused) { aOld.PlayFromStyle(); animationChanged = true; } } // Updating the effect timing above might already have caused the // animation to become irrelevant so only add a changed record if // the animation is still relevant. if (animationChanged && aOld.IsRelevant()) { nsNodeUtils::AnimationChanged(&aOld); } }