Bug 1456394 - Add AnimationEffect.getTiming(); r?hiro,bz draft
authorBrian Birtles <birtles@gmail.com>
Mon, 07 May 2018 12:32:38 +0900
changeset 793998 b2d965d5c5f91df832c66bb8605ca8605a4079d1
parent 793997 6816d483250c333b9b79ddcb891563300410494b
child 793999 6589f368dd17d05d17e7489fd338dda30a85a3ca
push id109561
push userbmo:bbirtles@mozilla.com
push dateFri, 11 May 2018 06:43:46 +0000
reviewershiro, bz
bugs1456394
milestone62.0a1
Bug 1456394 - Add AnimationEffect.getTiming(); r?hiro,bz https://drafts.csswg.org/web-animations-1/#dom-animationeffect-gettiming MozReview-Commit-ID: 8gnd5Gl0UkK
dom/animation/AnimationEffect.cpp
dom/animation/AnimationEffect.h
dom/webidl/AnimationEffect.webidl
testing/web-platform/meta/css/css-timing/cubic-bezier-timing-functions-output.html.ini
testing/web-platform/meta/web-animations/interfaces/Animatable/animate.html.ini
testing/web-platform/meta/web-animations/interfaces/KeyframeEffect/constructor.html.ini
testing/web-platform/meta/web-animations/interfaces/KeyframeEffect/copy-constructor.html.ini
--- 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
-