diff --git a/dom/animation/Animation.h b/dom/animation/Animation.h index ae168c52127d..7e946b2f124d 100644 --- a/dom/animation/Animation.h +++ b/dom/animation/Animation.h @@ -486,6 +486,41 @@ protected: return GetCurrentTimeForHoldTime(Nullable()); } + // Earlier side of the elapsed time range reported in CSS Animations and CSS + // Transitions events. + // + // https://drafts.csswg.org/css-animations-2/#interval-start + // https://drafts.csswg.org/css-transitions-2/#interval-start + StickyTimeDuration + IntervalStartTime(const StickyTimeDuration& aActiveDuration) const + { + MOZ_ASSERT(AsCSSTransition() || AsCSSAnimation(), + "Should be called for CSS animations or transitions"); + static constexpr StickyTimeDuration zeroDuration = StickyTimeDuration(); + return std::max( + std::min(StickyTimeDuration(-mEffect->SpecifiedTiming().Delay()), + aActiveDuration), + zeroDuration); + } + + // Later side of the elapsed time range reported in CSS Animations and CSS + // Transitions events. + // + // https://drafts.csswg.org/css-animations-2/#interval-end + // https://drafts.csswg.org/css-transitions-2/#interval-end + StickyTimeDuration + IntervalEndTime(const StickyTimeDuration& aActiveDuration) const + { + MOZ_ASSERT(AsCSSTransition() || AsCSSAnimation(), + "Should be called for CSS animations or transitions"); + + static constexpr StickyTimeDuration zeroDuration = StickyTimeDuration(); + return std::max( + std::min((EffectEnd() - mEffect->SpecifiedTiming().Delay()), + aActiveDuration), + zeroDuration); + } + nsIDocument* GetRenderedDocument() const; RefPtr mTimeline; diff --git a/layout/style/nsAnimationManager.cpp b/layout/style/nsAnimationManager.cpp index 1f541c3b6923..521a12cfa426 100755 --- a/layout/style/nsAnimationManager.cpp +++ b/layout/style/nsAnimationManager.cpp @@ -193,7 +193,6 @@ CSSAnimation::QueueEvents(const StickyTimeDuration& aActiveTime) return; } - static constexpr StickyTimeDuration zeroDuration = StickyTimeDuration(); uint64_t currentIteration = 0; ComputedTiming::AnimationPhase currentPhase; StickyTimeDuration intervalStartTime; @@ -211,14 +210,8 @@ CSSAnimation::QueueEvents(const StickyTimeDuration& aActiveTime) currentIteration == mPreviousIteration) { return; } - intervalStartTime = - std::max(std::min(StickyTimeDuration(-mEffect->SpecifiedTiming().Delay()), - computedTiming.mActiveDuration), - zeroDuration); - intervalEndTime = - std::max(std::min((EffectEnd() - mEffect->SpecifiedTiming().Delay()), - computedTiming.mActiveDuration), - zeroDuration); + intervalStartTime = IntervalStartTime(computedTiming.mActiveDuration); + intervalEndTime = IntervalEndTime(computedTiming.mActiveDuration); uint64_t iterationBoundary = mPreviousIteration > currentIteration ? currentIteration + 1 diff --git a/layout/style/nsTransitionManager.cpp b/layout/style/nsTransitionManager.cpp index 5ccbc35c2a55..9f8fa3338d56 100755 --- a/layout/style/nsTransitionManager.cpp +++ b/layout/style/nsTransitionManager.cpp @@ -206,12 +206,8 @@ CSSTransition::QueueEvents(const StickyTimeDuration& aActiveTime) ComputedTiming computedTiming = mEffect->GetComputedTiming(); currentPhase = static_cast(computedTiming.mPhase); - intervalStartTime = - std::max(std::min(StickyTimeDuration(-mEffect->SpecifiedTiming().Delay()), - computedTiming.mActiveDuration), zeroDuration); - intervalEndTime = - std::max(std::min((EffectEnd() - mEffect->SpecifiedTiming().Delay()), - computedTiming.mActiveDuration), zeroDuration); + intervalStartTime = IntervalStartTime(computedTiming.mActiveDuration); + intervalEndTime = IntervalEndTime(computedTiming.mActiveDuration); } // TimeStamps to use for ordering the events when they are dispatched. We