#include "config.h"
#include "CSSTransition.h"
#include "Animation.h"
#include "Element.h"
#include "KeyframeEffectReadOnly.h"
namespace WebCore {
Ref<CSSTransition> CSSTransition::create(Element& target, CSSPropertyID property, MonotonicTime generationTime, const Animation& backingAnimation, const RenderStyle* oldStyle, const RenderStyle& newStyle, Seconds delay, Seconds duration, const RenderStyle& reversingAdjustedStartStyle, double reversingShorteningFactor)
{
auto result = adoptRef(*new CSSTransition(target, property, generationTime, backingAnimation, newStyle, reversingAdjustedStartStyle, reversingShorteningFactor));
result->initialize(target, oldStyle, newStyle);
result->setTimingProperties(delay, duration);
return result;
}
CSSTransition::CSSTransition(Element& element, CSSPropertyID property, MonotonicTime generationTime, const Animation& backingAnimation, const RenderStyle& targetStyle, const RenderStyle& reversingAdjustedStartStyle, double reversingShorteningFactor)
: DeclarativeAnimation(element, backingAnimation)
, m_property(property)
, m_generationTime(generationTime)
, m_targetStyle(RenderStyle::clonePtr(targetStyle))
, m_reversingAdjustedStartStyle(RenderStyle::clonePtr(reversingAdjustedStartStyle))
, m_reversingShorteningFactor(reversingShorteningFactor)
{
}
void CSSTransition::resolve(RenderStyle& targetStyle)
{
DeclarativeAnimation::resolve(targetStyle);
m_currentStyle = RenderStyle::clonePtr(targetStyle);
}
void CSSTransition::setTimingProperties(Seconds delay, Seconds duration)
{
suspendEffectInvalidation();
auto* timing = effect()->timing();
timing->setFill(FillMode::Backwards);
timing->setDelay(delay);
timing->setIterationDuration(duration);
unsuspendEffectInvalidation();
}
bool CSSTransition::canBeListed() const
{
if (auto* transitionEffect = effect()) {
if (is<KeyframeEffectReadOnly>(transitionEffect)) {
if (!downcast<KeyframeEffectReadOnly>(effect())->hasBlendingKeyframes())
return false;
}
}
return WebAnimation::canBeListed();
}
}