Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / animation / TimedItem.cpp
index c251403..d837b66 100644 (file)
 
 namespace WebCore {
 
+namespace {
+
+Timing::FillMode resolvedFillMode(Timing::FillMode fillMode, bool isAnimation)
+{
+    if (fillMode != Timing::FillModeAuto)
+        return fillMode;
+    if (isAnimation)
+        return Timing::FillModeNone;
+    return Timing::FillModeBoth;
+}
+
+} // namespace
+
 TimedItem::TimedItem(const Timing& timing, PassOwnPtr<EventDelegate> eventDelegate)
     : m_parent(0)
     , m_startTime(0)
@@ -52,7 +65,7 @@ TimedItem::TimedItem(const Timing& timing, PassOwnPtr<EventDelegate> eventDelega
 
 double TimedItem::iterationDuration() const
 {
-    double result = m_specified.hasIterationDuration ? m_specified.iterationDuration : intrinsicIterationDuration();
+    double result = std::isnan(m_specified.iterationDuration) ? intrinsicIterationDuration() : m_specified.iterationDuration;
     ASSERT(result >= 0);
     return result;
 }
@@ -73,6 +86,14 @@ double TimedItem::activeDuration() const
     return result;
 }
 
+void TimedItem::updateSpecifiedTiming(const Timing& timing)
+{
+    m_specified = timing;
+    invalidate();
+    if (m_player)
+        m_player->setNeedsUpdate();
+}
+
 bool TimedItem::updateInheritedTime(double inheritedTime) const
 {
     bool needsUpdate = m_needsUpdate || (m_lastUpdateTime != inheritedTime && !(isNull(m_lastUpdateTime) && isNull(inheritedTime)));
@@ -90,7 +111,7 @@ bool TimedItem::updateInheritedTime(double inheritedTime) const
         const Phase currentPhase = calculatePhase(activeDuration, localTime, m_specified);
         // FIXME: parentPhase depends on groups being implemented.
         const TimedItem::Phase parentPhase = TimedItem::PhaseActive;
-        const double activeTime = calculateActiveTime(activeDuration, localTime, parentPhase, currentPhase, m_specified);
+        const double activeTime = calculateActiveTime(activeDuration, resolvedFillMode(m_specified.fillMode, isAnimation()), localTime, parentPhase, currentPhase, m_specified);
 
         double currentIteration;
         double timeFraction;
@@ -116,7 +137,7 @@ bool TimedItem::updateInheritedTime(double inheritedTime) const
             ASSERT(localActiveDuration >= 0);
             const double localLocalTime = localTime < m_specified.startDelay ? localTime : localActiveDuration + m_specified.startDelay;
             const TimedItem::Phase localCurrentPhase = calculatePhase(localActiveDuration, localLocalTime, m_specified);
-            const double localActiveTime = calculateActiveTime(localActiveDuration, localLocalTime, parentPhase, localCurrentPhase, m_specified);
+            const double localActiveTime = calculateActiveTime(localActiveDuration, resolvedFillMode(m_specified.fillMode, isAnimation()), localLocalTime, parentPhase, localCurrentPhase, m_specified);
             const double startOffset = m_specified.iterationStart * localIterationDuration;
             ASSERT(startOffset >= 0);
             const double scaledActiveTime = calculateScaledActiveTime(localActiveDuration, localActiveTime, startOffset, m_specified);
@@ -133,6 +154,7 @@ bool TimedItem::updateInheritedTime(double inheritedTime) const
         m_calculated.isInEffect = !isNull(activeTime);
         m_calculated.isInPlay = phase() == PhaseActive && (!m_parent || m_parent->isInPlay());
         m_calculated.isCurrent = phase() == PhaseBefore || isInPlay() || (m_parent && m_parent->isCurrent());
+        m_calculated.localTime = m_lastUpdateTime - m_startTime;
     }
 
     // Test for events even if timing didn't need an update as the player may have gained a start time.
@@ -149,9 +171,20 @@ bool TimedItem::updateInheritedTime(double inheritedTime) const
     if (needsUpdate)  {
         // FIXME: This probably shouldn't be recursive.
         didTriggerStyleRecalc = updateChildrenAndEffects();
-        m_calculated.timeToEffectChange = calculateTimeToEffectChange(localTime, timeToNextIteration);
+        m_calculated.timeToForwardsEffectChange = calculateTimeToEffectChange(true, localTime, timeToNextIteration);
+        m_calculated.timeToReverseEffectChange = calculateTimeToEffectChange(false, localTime, timeToNextIteration);
     }
     return didTriggerStyleRecalc;
 }
 
+const TimedItem::CalculatedTiming& TimedItem::ensureCalculated() const
+{
+    if (!m_player)
+        return m_calculated;
+    if (m_player->needsUpdate())
+        m_player->update();
+    ASSERT(!m_player->needsUpdate());
+    return m_calculated;
+}
+
 } // namespace WebCore