/* * Copyright (C) Canon Inc. 2016 * Copyright (C) 2017 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include "CSSValue.h" #include "RenderStyle.h" #include "WebAnimation.h" #include #include #include #include #include #include #include namespace WebCore { class CSSAnimation; class CSSTransition; class DeclarativeAnimation; class Element; class AnimationTimeline : public RefCounted { public: bool isDocumentTimeline() const { return m_classType == DocumentTimelineClass; } void addAnimation(Ref&&); void removeAnimation(Ref&&); std::optional bindingsCurrentTime(); virtual std::optional currentTime() { return m_currentTime; } virtual void timingModelDidChange() { }; enum class Ordering { Sorted, Unsorted }; const ListHashSet>& animations() const { return m_animations; } Vector> animationsForElement(Element&, Ordering ordering = Ordering::Unsorted) const; void elementWasRemoved(Element&); void removeAnimationsForElement(Element&); void cancelDeclarativeAnimationsForElement(Element&); virtual void animationWasAddedToElement(WebAnimation&, Element&); virtual void animationWasRemovedFromElement(WebAnimation&, Element&); void updateCSSAnimationsForElement(Element&, const RenderStyle* currentStyle, const RenderStyle& afterChangeStyle); void updateCSSTransitionsForElement(Element&, const RenderStyle& currentStyle, const RenderStyle& afterChangeStyle); virtual ~AnimationTimeline(); protected: enum ClassType { DocumentTimelineClass }; ClassType classType() const { return m_classType; } explicit AnimationTimeline(ClassType); bool hasElementAnimations() const { return !m_elementToAnimationsMap.isEmpty() || !m_elementToCSSAnimationsMap.isEmpty() || !m_elementToCSSTransitionsMap.isEmpty(); } const ListHashSet& animationsWithoutTarget() const { return m_animationsWithoutTarget; } const HashMap>>& elementToAnimationsMap() { return m_elementToAnimationsMap; } const HashMap>>& elementToCSSAnimationsMap() { return m_elementToCSSAnimationsMap; } const HashMap>>& elementToCSSTransitionsMap() { return m_elementToCSSTransitionsMap; } private: HashMap>>& relevantMapForAnimation(WebAnimation&); void cancelOrRemoveDeclarativeAnimation(RefPtr); RefPtr cssAnimationForElementAndProperty(Element&, CSSPropertyID); ClassType m_classType; std::optional m_currentTime; HashMap>> m_elementToAnimationsMap; HashMap>> m_elementToCSSAnimationsMap; HashMap>> m_elementToCSSTransitionsMap; ListHashSet> m_animations; ListHashSet m_animationsWithoutTarget; HashMap>> m_elementToCSSAnimationByName; HashMap>> m_elementToRunningCSSTransitionByCSSPropertyID; HashMap>> m_elementToCompletedCSSTransitionByCSSPropertyID; }; } // namespace WebCore #define SPECIALIZE_TYPE_TRAITS_ANIMATION_TIMELINE(ToValueTypeName, predicate) \ SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \ static bool isType(const WebCore::AnimationTimeline& value) { return value.predicate; } \ SPECIALIZE_TYPE_TRAITS_END()