Bug 1456394 - Add AnimationEffect.getTiming(); r?hiro,bz
https://drafts.csswg.org/web-animations-1/#dom-animationeffect-gettiming
MozReview-Commit-ID: 8gnd5Gl0UkK
--- a/dom/animation/AnimationEffect.cpp
+++ b/dom/animation/AnimationEffect.cpp
@@ -268,64 +268,70 @@ ComputedTiming
AnimationEffect::GetComputedTiming(const TimingParams* aTiming) const
{
double playbackRate = mAnimation ? mAnimation->PlaybackRate() : 1;
return GetComputedTimingAt(GetLocalTime(),
aTiming ? *aTiming : SpecifiedTiming(),
playbackRate);
}
-// Helper functions for generating a ComputedEffectTiming dictionary
+// Helper function for generating an (Computed)EffectTiming dictionary
static void
-GetComputedTimingDictionary(const ComputedTiming& aComputedTiming,
- const Nullable<TimeDuration>& aLocalTime,
- const TimingParams& aTiming,
- ComputedEffectTiming& aRetVal)
+GetEffectTimingDictionary(const TimingParams& aTiming, EffectTiming& aRetVal)
{
- // EffectTiming
aRetVal.mDelay = aTiming.Delay().ToMilliseconds();
aRetVal.mEndDelay = aTiming.EndDelay().ToMilliseconds();
- aRetVal.mFill = aComputedTiming.mFill;
- aRetVal.mIterationStart = aComputedTiming.mIterationStart;
- aRetVal.mIterations = aComputedTiming.mIterations;
- aRetVal.mDuration.SetAsUnrestrictedDouble() =
- aComputedTiming.mDuration.ToMilliseconds();
+ aRetVal.mFill = aTiming.Fill();
+ aRetVal.mIterationStart = aTiming.IterationStart();
+ aRetVal.mIterations = aTiming.Iterations();
+ if (aTiming.Duration()) {
+ aRetVal.mDuration.SetAsUnrestrictedDouble() =
+ aTiming.Duration()->ToMilliseconds();
+ }
aRetVal.mDirection = aTiming.Direction();
if (aTiming.TimingFunction()) {
aRetVal.mEasing.Truncate();
aTiming.TimingFunction()->AppendToString(aRetVal.mEasing);
}
-
- // ComputedEffectTiming
- aRetVal.mActiveDuration = aComputedTiming.mActiveDuration.ToMilliseconds();
- aRetVal.mEndTime = aComputedTiming.mEndTime.ToMilliseconds();
- aRetVal.mLocalTime = AnimationUtils::TimeDurationToDouble(aLocalTime);
- aRetVal.mProgress = aComputedTiming.mProgress;
+}
- if (!aRetVal.mProgress.IsNull()) {
- // Convert the returned currentIteration into Infinity if we set
- // (uint64_t) aComputedTiming.mCurrentIteration to UINT64_MAX
- double iteration = aComputedTiming.mCurrentIteration == UINT64_MAX
- ? PositiveInfinity<double>()
- : static_cast<double>(aComputedTiming.mCurrentIteration);
- aRetVal.mCurrentIteration.SetValue(iteration);
- }
+void
+AnimationEffect::GetTiming(EffectTiming& aRetVal) const
+{
+ GetEffectTimingDictionary(SpecifiedTiming(), aRetVal);
}
void
AnimationEffect::GetComputedTimingAsDict(ComputedEffectTiming& aRetVal) const
{
+ // Specified timing
+ GetEffectTimingDictionary(SpecifiedTiming(), aRetVal);
+
+ // Computed timing
double playbackRate = mAnimation ? mAnimation->PlaybackRate() : 1;
const Nullable<TimeDuration> currentTime = GetLocalTime();
- GetComputedTimingDictionary(GetComputedTimingAt(currentTime,
- SpecifiedTiming(),
- playbackRate),
- currentTime,
- SpecifiedTiming(),
- aRetVal);
+ ComputedTiming computedTiming =
+ GetComputedTimingAt(currentTime, SpecifiedTiming(), playbackRate);
+
+ aRetVal.mDuration.SetAsUnrestrictedDouble() =
+ computedTiming.mDuration.ToMilliseconds();
+ aRetVal.mFill = computedTiming.mFill;
+ aRetVal.mActiveDuration = computedTiming.mActiveDuration.ToMilliseconds();
+ aRetVal.mEndTime = computedTiming.mEndTime.ToMilliseconds();
+ aRetVal.mLocalTime = AnimationUtils::TimeDurationToDouble(currentTime);
+ aRetVal.mProgress = computedTiming.mProgress;
+
+ if (!aRetVal.mProgress.IsNull()) {
+ // Convert the returned currentIteration into Infinity if we set
+ // (uint64_t) computedTiming.mCurrentIteration to UINT64_MAX
+ double iteration = computedTiming.mCurrentIteration == UINT64_MAX
+ ? PositiveInfinity<double>()
+ : static_cast<double>(computedTiming.mCurrentIteration);
+ aRetVal.mCurrentIteration.SetValue(iteration);
+ }
}
AnimationEffect::~AnimationEffect()
{
// mTiming is cycle collected, so we have to do null check first even though
// mTiming shouldn't be null during the lifetime of KeyframeEffect.
if (mTiming) {
mTiming->Unlink();
--- a/dom/animation/AnimationEffect.h
+++ b/dom/animation/AnimationEffect.h
@@ -51,16 +51,18 @@ public:
bool IsCurrent() const;
bool IsInEffect() const;
bool HasFiniteActiveDuration() const
{
return SpecifiedTiming().ActiveDuration() != TimeDuration::Forever();
}
+ void GetTiming(EffectTiming& aRetVal) const;
+
already_AddRefed<AnimationEffectTimingReadOnly> Timing();
const TimingParams& SpecifiedTiming() const
{
return mTiming->AsTimingParams();
}
void SetSpecifiedTiming(const TimingParams& aTiming);
// This function takes as input the timing parameters of an animation and
--- a/dom/webidl/AnimationEffect.webidl
+++ b/dom/webidl/AnimationEffect.webidl
@@ -43,11 +43,12 @@ dictionary ComputedEffectTiming : Effect
double? progress = null;
unrestricted double? currentIteration = null;
};
[Func="nsDocument::IsWebAnimationsEnabled"]
interface AnimationEffect {
[Cached, Constant]
readonly attribute AnimationEffectTimingReadOnly timing;
+ EffectTiming getTiming();
[BinaryName="getComputedTimingAsDict"]
ComputedEffectTiming getComputedTiming();
};
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-timing/cubic-bezier-timing-functions-output.html.ini
+++ /dev/null
@@ -1,13 +0,0 @@
-[cubic-bezier-timing-functions-output.html]
- [cubic-bezier easing with input progress greater than 1]
- expected: FAIL
-
- [cubic-bezier easing with input progress greater than 1 and where the tangent on the upper boundary is infinity]
- expected: FAIL
-
- [cubic-bezier easing with input progress less than 0]
- expected: FAIL
-
- [cubic-bezier easing with input progress less than 0 and where the tangent on the lower boundary is infinity]
- expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/web-animations/interfaces/Animatable/animate.html.ini
+++ /dev/null
@@ -1,13 +0,0 @@
-[animate.html]
- [Element.animate() accepts a double as an options argument]
- expected: FAIL
-
- [Element.animate() accepts a KeyframeAnimationOptions argument]
- expected: FAIL
-
- [Element.animate() accepts an absent options argument]
- expected: FAIL
-
- [Element.animate() accepts a duration of 'auto' using a dictionary object]
- expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/web-animations/interfaces/KeyframeEffect/constructor.html.ini
+++ /dev/null
@@ -1,34 +0,0 @@
-[constructor.html]
- [easing values are parsed correctly when passed to the KeyframeEffect constructor in KeyframeEffectOptions]
- expected: FAIL
-
- [A KeyframeEffect constructed without any KeyframeEffectOptions object]
- expected: FAIL
-
- [A KeyframeEffect constructed by an empty KeyframeEffectOptions object]
- expected: FAIL
-
- [A KeyframeEffect constructed by a normal KeyframeEffectOptions object]
- expected: FAIL
-
- [A KeyframeEffect constructed by a double value]
- expected: FAIL
-
- [A KeyframeEffect constructed by +Infinity]
- expected: FAIL
-
- [A KeyframeEffect constructed by an Infinity duration]
- expected: FAIL
-
- [A KeyframeEffect constructed by an auto duration]
- expected: FAIL
-
- [A KeyframeEffect constructed by an Infinity iterations]
- expected: FAIL
-
- [A KeyframeEffect constructed by an auto fill]
- expected: FAIL
-
- [A KeyframeEffect constructed by a forwards fill]
- expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/web-animations/interfaces/KeyframeEffect/copy-constructor.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[copy-constructor.html]
- [Copied KeyframeEffect has the same timing content]
- expected: FAIL
-