Bug 1354501 - Factor out calculations for interval start/end times. r?birtles
MozReview-Commit-ID: H9iXX9VLXLr
--- a/dom/animation/Animation.h
+++ b/dom/animation/Animation.h
@@ -481,16 +481,51 @@ protected:
Nullable<TimeDuration> GetCurrentTimeForHoldTime(
const Nullable<TimeDuration>& aHoldTime) const;
Nullable<TimeDuration> GetUnconstrainedCurrentTime() const
{
return GetCurrentTimeForHoldTime(Nullable<TimeDuration>());
}
+ // 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<AnimationTimeline> mTimeline;
RefPtr<AnimationEffect> mEffect;
// The beginning of the delay period.
Nullable<TimeDuration> mStartTime; // Timeline timescale
Nullable<TimeDuration> mHoldTime; // Animation timescale
Nullable<TimeDuration> mPendingReadyTime; // Timeline timescale
--- a/layout/style/nsAnimationManager.cpp
+++ b/layout/style/nsAnimationManager.cpp
@@ -188,17 +188,16 @@ CSSAnimation::QueueEvents(const StickyTi
return;
}
nsPresContext* presContext = mOwningElement.GetPresContext();
if (!presContext) {
return;
}
- static constexpr StickyTimeDuration zeroDuration = StickyTimeDuration();
uint64_t currentIteration = 0;
ComputedTiming::AnimationPhase currentPhase;
StickyTimeDuration intervalStartTime;
StickyTimeDuration intervalEndTime;
StickyTimeDuration iterationStartTime;
if (!mEffect) {
currentPhase = GetAnimationPhaseWithoutEffect
@@ -206,24 +205,18 @@ CSSAnimation::QueueEvents(const StickyTi
} else {
ComputedTiming computedTiming = mEffect->GetComputedTiming();
currentPhase = computedTiming.mPhase;
currentIteration = computedTiming.mCurrentIteration;
if (currentPhase == mPreviousPhase &&
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
: currentIteration;
iterationStartTime =
computedTiming.mDuration.MultDouble(
(iterationBoundary - computedTiming.mIterationStart));
}
--- a/layout/style/nsTransitionManager.cpp
+++ b/layout/style/nsTransitionManager.cpp
@@ -201,22 +201,18 @@ CSSTransition::QueueEvents(const StickyT
StickyTimeDuration intervalEndTime;
if (!mEffect) {
currentPhase = GetAnimationPhaseWithoutEffect<TransitionPhase>(*this);
} else {
ComputedTiming computedTiming = mEffect->GetComputedTiming();
currentPhase = static_cast<TransitionPhase>(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
// use a TimeStamp so we can compare events produced by different elements,
// perhaps even with different timelines.
// The zero timestamp is for transitionrun events where we ignore the delay
// for the purpose of ordering events.
TimeStamp zeroTimeStamp = AnimationTimeToTimeStamp(zeroDuration);