DeclarativeAnimation.h [plain text]
#pragma once
#include "AnimationEffect.h"
#include "AnimationEffectPhase.h"
#include "Styleable.h"
#include "WebAnimation.h"
#include <wtf/Ref.h>
#include <wtf/WeakPtr.h>
namespace WebCore {
class Animation;
class AnimationEventBase;
class Element;
class RenderStyle;
class DeclarativeAnimation : public WebAnimation {
WTF_MAKE_ISO_ALLOCATED(DeclarativeAnimation);
public:
~DeclarativeAnimation();
bool isDeclarativeAnimation() const final { return true; }
const Optional<const Styleable> owningElement() const;
const Animation& backingAnimation() const { return m_backingAnimation; }
void setBackingAnimation(const Animation&);
void cancelFromStyle();
Optional<double> bindingsStartTime() const final;
void setBindingsStartTime(Optional<double>) override;
Optional<double> bindingsCurrentTime() const final;
ExceptionOr<void> setBindingsCurrentTime(Optional<double>) final;
WebAnimation::PlayState bindingsPlayState() const final;
WebAnimation::ReplaceState bindingsReplaceState() const final;
bool bindingsPending() const final;
WebAnimation::ReadyPromise& bindingsReady() final;
WebAnimation::FinishedPromise& bindingsFinished() final;
ExceptionOr<void> bindingsPlay() override;
ExceptionOr<void> bindingsPause() override;
void setTimeline(RefPtr<AnimationTimeline>&&) final;
void cancel(Silently = Silently::No) final;
void tick() override;
bool canHaveGlobalPosition() final;
void flushPendingStyleChanges() const;
protected:
DeclarativeAnimation(const Styleable&, const Animation&);
virtual void initialize(const RenderStyle* oldStyle, const RenderStyle& newStyle);
virtual void syncPropertiesWithBackingAnimation();
virtual Ref<AnimationEventBase> createEvent(const AtomString& eventType, double elapsedTime, const String& pseudoId, Optional<Seconds> timelineTime) = 0;
void invalidateDOMEvents(Seconds elapsedTime = 0_s);
private:
void disassociateFromOwningElement();
AnimationEffectPhase phaseWithoutEffect() const;
void enqueueDOMEvent(const AtomString&, Seconds);
bool m_wasPending { false };
AnimationEffectPhase m_previousPhase { AnimationEffectPhase::Idle };
WeakPtr<Element> m_owningElement;
PseudoId m_owningPseudoId;
Ref<Animation> m_backingAnimation;
double m_previousIteration;
};
}
SPECIALIZE_TYPE_TRAITS_WEB_ANIMATION(DeclarativeAnimation, isDeclarativeAnimation())