void CSSAnimations::calculateTransitionActiveInterpolations(CSSAnimationUpdate* update, const Element* animatingElement, double timelineCurrentTime) { ActiveAnimations* activeAnimations = animatingElement ? animatingElement->activeAnimations() : nullptr; AnimationStack* animationStack = activeAnimations ? &activeAnimations->defaultStack() : nullptr; WillBeHeapHashMap<CSSPropertyID, RefPtrWillBeMember<Interpolation>> activeInterpolationsForTransitions; if (update->newTransitions().isEmpty() && update->cancelledTransitions().isEmpty()) { activeInterpolationsForTransitions = AnimationStack::activeInterpolations(animationStack, 0, 0, Animation::TransitionPriority, timelineCurrentTime); } else { WillBeHeapVector<RawPtrWillBeMember<InertAnimation>> newTransitions; for (const auto& entry : update->newTransitions()) newTransitions.append(entry.value.animation.get()); WillBeHeapHashSet<RawPtrWillBeMember<const AnimationPlayer>> cancelledAnimationPlayers; if (!update->cancelledTransitions().isEmpty()) { ASSERT(activeAnimations); const TransitionMap& transitionMap = activeAnimations->cssAnimations().m_transitions; for (CSSPropertyID id : update->cancelledTransitions()) { ASSERT(transitionMap.contains(id)); cancelledAnimationPlayers.add(transitionMap.get(id).player.get()); } } activeInterpolationsForTransitions = AnimationStack::activeInterpolations(animationStack, &newTransitions, &cancelledAnimationPlayers, Animation::TransitionPriority, timelineCurrentTime); } // Properties being animated by animations don't get values from transitions applied. if (!update->activeInterpolationsForAnimations().isEmpty() && !activeInterpolationsForTransitions.isEmpty()) { for (const auto& entry : update->activeInterpolationsForAnimations()) activeInterpolationsForTransitions.remove(entry.key); } update->adoptActiveInterpolationsForTransitions(activeInterpolationsForTransitions); }
PassOwnPtrWillBeRawPtr<MutationObserverInterestGroup> MutationObserverInterestGroup::createIfNeeded(Node& target, MutationObserver::MutationType type, MutationRecordDeliveryOptions oldValueFlag, const QualifiedName* attributeName) { ASSERT((type == MutationObserver::Attributes && attributeName) || !attributeName); WillBeHeapHashMap<RawPtrWillBeMember<MutationObserver>, MutationRecordDeliveryOptions> observers; target.getRegisteredMutationObserversOfType(observers, type, attributeName); if (observers.isEmpty()) return nullptr; return adoptPtrWillBeNoop(new MutationObserverInterestGroup(observers, oldValueFlag)); }
MutationObserverInterestGroup::MutationObserverInterestGroup(WillBeHeapHashMap<RawPtrWillBeMember<MutationObserver>, MutationRecordDeliveryOptions>& observers, MutationRecordDeliveryOptions oldValueFlag) : m_oldValueFlag(oldValueFlag) { ASSERT(!observers.isEmpty()); m_observers.swap(observers); }