Skip to content

Instantly share code, notes, and snippets.

@birtles
Created January 12, 2018 07:53
Show Gist options
  • Save birtles/65035e868a2bd4541312b3671f9b2c92 to your computer and use it in GitHub Desktop.
Save birtles/65035e868a2bd4541312b3671f9b2c92 to your computer and use it in GitHub Desktop.
WIP Patch to change Web Animation timing interfaces in Gecko
# HG changeset patch
# Parent 95a3304b348929f76b694b27a64b1528f6dd3d35
diff --git a/dom/animation/Animation.h b/dom/animation/Animation.h
--- a/dom/animation/Animation.h
+++ b/dom/animation/Animation.h
@@ -15,6 +15,7 @@
#include "mozilla/EffectCompositor.h" // For EffectCompositor::CascadeLevel
#include "mozilla/LinkedList.h"
#include "mozilla/TimeStamp.h" // for TimeStamp, TimeDuration
+#include "mozilla/StickyTimeDuration.h"
#include "mozilla/dom/AnimationBinding.h" // for AnimationPlayState
#include "mozilla/dom/AnimationEffectReadOnly.h"
#include "mozilla/dom/AnimationTimeline.h"
diff --git a/dom/animation/AnimationEffectReadOnly.cpp b/dom/animation/AnimationEffectReadOnly.cpp
--- a/dom/animation/AnimationEffectReadOnly.cpp
+++ b/dom/animation/AnimationEffectReadOnly.cpp
@@ -17,15 +17,12 @@ namespace dom {
NS_IMPL_CYCLE_COLLECTION_CLASS(AnimationEffectReadOnly)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(AnimationEffectReadOnly)
- if (tmp->mTiming) {
- tmp->mTiming->Unlink();
- }
- NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocument, mTiming, mAnimation)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocument, mAnimation)
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(AnimationEffectReadOnly)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocument, mTiming, mAnimation)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocument, mAnimation)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(AnimationEffectReadOnly)
@@ -39,11 +36,10 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_INTERFACE_MAP_END
AnimationEffectReadOnly::AnimationEffectReadOnly(
- nsIDocument* aDocument, AnimationEffectTimingReadOnly* aTiming)
+ nsIDocument* aDocument, const TimingParams& aTiming)
: mDocument(aDocument)
, mTiming(aTiming)
{
- MOZ_ASSERT(aTiming);
}
// https://drafts.csswg.org/web-animations/#current
@@ -67,20 +63,40 @@ AnimationEffectReadOnly::IsInEffect() co
return !computedTiming.mProgress.IsNull();
}
-already_AddRefed<AnimationEffectTimingReadOnly>
-AnimationEffectReadOnly::Timing()
+void
+AnimationEffectReadOnly::SetTiming(
+ const EffectTiming& aTiming,
+ ErrorResult& aRv)
{
- RefPtr<AnimationEffectTimingReadOnly> temp(mTiming);
- return temp.forget();
+ TimingParams timing = TimingParams::FromEffectTiming(aTiming, mDocument, aRv);
+ if (aRv.Failed()) {
+ return;
+ }
+
+ SetSpecifiedTiming(timing);
+}
+
+void
+AnimationEffectReadOnly::UpdateTiming(
+ const PartialEffectTiming& aTiming,
+ ErrorResult &aRv)
+{
+ TimingParams timing =
+ TimingParams::MergePartialEffectTiming(mTiming, aTiming, mDocument, aRv);
+ if (aRv.Failed()) {
+ return;
+ }
+
+ SetSpecifiedTiming(timing);
}
void
AnimationEffectReadOnly::SetSpecifiedTiming(const TimingParams& aTiming)
{
- if (mTiming->AsTimingParams() == aTiming) {
+ if (mTiming == aTiming) {
return;
}
- mTiming->SetTimingParams(aTiming);
+ mTiming = aTiming;
if (mAnimation) {
mAnimation->NotifyEffectTimingUpdated();
if (AsKeyframeEffect()) {
@@ -273,24 +289,29 @@ AnimationEffectReadOnly::GetComputedTimi
playbackRate);
}
-// Helper functions for generating a ComputedTimingProperties dictionary
+// Helper functions for generating a ComputedEffectTiming dictionary
static void
GetComputedTimingDictionary(const ComputedTiming& aComputedTiming,
const Nullable<TimeDuration>& aLocalTime,
const TimingParams& aTiming,
- ComputedTimingProperties& aRetVal)
+ ComputedEffectTiming& aRetVal)
{
- // AnimationEffectTimingProperties
+ // EffectTiming
aRetVal.mDelay = aTiming.Delay().ToMilliseconds();
aRetVal.mEndDelay = aTiming.EndDelay().ToMilliseconds();
- aRetVal.mFill = aComputedTiming.mFill;
+ aRetVal.mFill = aTiming.Fill();
aRetVal.mIterations = aComputedTiming.mIterations;
aRetVal.mIterationStart = aComputedTiming.mIterationStart;
- aRetVal.mDuration.SetAsUnrestrictedDouble() =
- aComputedTiming.mDuration.ToMilliseconds();
+ if (aTiming.Duration()) {
+ aRetVal.mDuration.SetAsUnrestrictedDouble() =
+ aTiming.Duration()->ToMilliseconds();
+ }
+ // XXX Check "auto" is filled-in otherwise
aRetVal.mDirection = aTiming.Direction();
- // ComputedTimingProperties
+ // ComputedEffectTiming
+ aRetVal.mComputedDuration = aComputedTiming.mDuration.ToMilliseconds();
+ aRetVal.mComputedFillMode = aComputedTiming.mFill;
aRetVal.mActiveDuration = aComputedTiming.mActiveDuration.ToMilliseconds();
aRetVal.mEndTime = aComputedTiming.mEndTime.ToMilliseconds();
aRetVal.mLocalTime = AnimationUtils::TimeDurationToDouble(aLocalTime);
@@ -307,8 +328,7 @@ GetComputedTimingDictionary(const Comput
}
void
-AnimationEffectReadOnly::GetComputedTimingAsDict(
- ComputedTimingProperties& aRetVal) const
+AnimationEffectReadOnly::GetTimingAsDict(ComputedEffectTiming& aRetVal) const
{
double playbackRate = mAnimation ? mAnimation->PlaybackRate() : 1;
const Nullable<TimeDuration> currentTime = GetLocalTime();
@@ -322,11 +342,7 @@ AnimationEffectReadOnly::GetComputedTimi
AnimationEffectReadOnly::~AnimationEffectReadOnly()
{
- // 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();
- }
+ // This is just here so Animation can be an incomplete type in the header.
}
Nullable<TimeDuration>
diff --git a/dom/animation/AnimationEffectReadOnly.h b/dom/animation/AnimationEffectReadOnly.h
--- a/dom/animation/AnimationEffectReadOnly.h
+++ b/dom/animation/AnimationEffectReadOnly.h
@@ -8,7 +8,6 @@
#define mozilla_dom_AnimationEffectReadOnly_h
#include "mozilla/ComputedTiming.h"
-#include "mozilla/dom/AnimationEffectTimingReadOnly.h"
#include "mozilla/dom/BindingDeclarations.h"
#include "mozilla/dom/Nullable.h"
#include "mozilla/Maybe.h"
@@ -25,7 +24,6 @@ struct ElementPropertyTransition;
namespace dom {
class Animation;
-class AnimationEffectTimingReadOnly;
class KeyframeEffectReadOnly;
struct ComputedTimingProperties;
@@ -36,8 +34,7 @@ public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(AnimationEffectReadOnly)
- AnimationEffectReadOnly(nsIDocument* aDocument,
- AnimationEffectTimingReadOnly* aTiming);
+ AnimationEffectReadOnly(nsIDocument* aDocument, const TimingParams& aTiming);
virtual KeyframeEffectReadOnly* AsKeyframeEffect() { return nullptr; }
@@ -56,11 +53,11 @@ public:
return !SpecifiedTiming().ActiveDuration();
}
- already_AddRefed<AnimationEffectTimingReadOnly> Timing();
- const TimingParams& SpecifiedTiming() const
- {
- return mTiming->AsTimingParams();
- }
+ void SetTiming(const EffectTiming& aTiming, ErrorResult& aRv);
+ void UpdateTiming(const PartialEffectTiming& aTiming, ErrorResult& aRv);
+
+ // XXX Naming here could probably use some work
+ const TimingParams& SpecifiedTiming() const { return mTiming; }
void SetSpecifiedTiming(const TimingParams& aTiming);
// This function takes as input the timing parameters of an animation and
@@ -80,7 +77,7 @@ public:
// Shortcut that gets the computed timing using the current local time as
// calculated from the timeline time.
ComputedTiming GetComputedTiming(const TimingParams* aTiming = nullptr) const;
- void GetComputedTimingAsDict(ComputedTimingProperties& aRetVal) const;
+ void GetTimingAsDict(ComputedEffectTiming& aRetVal) const;
virtual void SetAnimation(Animation* aAnimation) = 0;
Animation* GetAnimation() const { return mAnimation; };
@@ -98,10 +95,9 @@ protected:
Nullable<TimeDuration> GetLocalTime() const;
-protected:
RefPtr<nsIDocument> mDocument;
- RefPtr<AnimationEffectTimingReadOnly> mTiming;
RefPtr<Animation> mAnimation;
+ TimingParams mTiming;
};
} // namespace dom
diff --git a/dom/animation/AnimationEffectTiming.cpp b/dom/animation/AnimationEffectTiming.cpp
deleted file mode 100644
--- a/dom/animation/AnimationEffectTiming.cpp
+++ /dev/null
@@ -1,152 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "mozilla/dom/AnimationEffectTiming.h"
-
-#include "mozilla/dom/AnimatableBinding.h"
-#include "mozilla/dom/AnimationEffectTimingBinding.h"
-#include "mozilla/dom/KeyframeEffect.h"
-#include "mozilla/TimingParams.h"
-#include "nsAString.h"
-
-namespace mozilla {
-namespace dom {
-
-JSObject*
-AnimationEffectTiming::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
-{
- return AnimationEffectTimingBinding::Wrap(aCx, this, aGivenProto);
-}
-
-static inline void
-PostSpecifiedTimingUpdated(KeyframeEffect* aEffect)
-{
- if (aEffect) {
- aEffect->NotifySpecifiedTimingUpdated();
- }
-}
-
-void
-AnimationEffectTiming::SetDelay(double aDelay)
-{
- TimeDuration delay = TimeDuration::FromMilliseconds(aDelay);
- if (mTiming.Delay() == delay) {
- return;
- }
- mTiming.SetDelay(delay);
-
- PostSpecifiedTimingUpdated(mEffect);
-}
-
-void
-AnimationEffectTiming::SetEndDelay(double aEndDelay)
-{
- TimeDuration endDelay = TimeDuration::FromMilliseconds(aEndDelay);
- if (mTiming.EndDelay() == endDelay) {
- return;
- }
- mTiming.SetEndDelay(endDelay);
-
- PostSpecifiedTimingUpdated(mEffect);
-}
-
-void
-AnimationEffectTiming::SetFill(const FillMode& aFill)
-{
- if (mTiming.Fill() == aFill) {
- return;
- }
- mTiming.SetFill(aFill);
-
- PostSpecifiedTimingUpdated(mEffect);
-}
-
-void
-AnimationEffectTiming::SetIterationStart(double aIterationStart,
- ErrorResult& aRv)
-{
- if (mTiming.IterationStart() == aIterationStart) {
- return;
- }
-
- TimingParams::ValidateIterationStart(aIterationStart, aRv);
- if (aRv.Failed()) {
- return;
- }
-
- mTiming.SetIterationStart(aIterationStart);
-
- PostSpecifiedTimingUpdated(mEffect);
-}
-
-void
-AnimationEffectTiming::SetIterations(double aIterations, ErrorResult& aRv)
-{
- if (mTiming.Iterations() == aIterations) {
- return;
- }
-
- TimingParams::ValidateIterations(aIterations, aRv);
- if (aRv.Failed()) {
- return;
- }
-
- mTiming.SetIterations(aIterations);
-
- PostSpecifiedTimingUpdated(mEffect);
-}
-
-void
-AnimationEffectTiming::SetDuration(const UnrestrictedDoubleOrString& aDuration,
- ErrorResult& aRv)
-{
- Maybe<StickyTimeDuration> newDuration =
- TimingParams::ParseDuration(aDuration, aRv);
- if (aRv.Failed()) {
- return;
- }
-
- if (mTiming.Duration() == newDuration) {
- return;
- }
-
- mTiming.SetDuration(Move(newDuration));
-
- PostSpecifiedTimingUpdated(mEffect);
-}
-
-void
-AnimationEffectTiming::SetDirection(const PlaybackDirection& aDirection)
-{
- if (mTiming.Direction() == aDirection) {
- return;
- }
-
- mTiming.SetDirection(aDirection);
-
- PostSpecifiedTimingUpdated(mEffect);
-}
-
-void
-AnimationEffectTiming::SetEasing(const nsAString& aEasing, ErrorResult& aRv)
-{
- Maybe<ComputedTimingFunction> newFunction =
- TimingParams::ParseEasing(aEasing, mDocument, aRv);
- if (aRv.Failed()) {
- return;
- }
-
- if (mTiming.TimingFunction() == newFunction) {
- return;
- }
-
- mTiming.SetTimingFunction(Move(newFunction));
-
- PostSpecifiedTimingUpdated(mEffect);
-}
-
-} // namespace dom
-} // namespace mozilla
diff --git a/dom/animation/AnimationEffectTiming.h b/dom/animation/AnimationEffectTiming.h
deleted file mode 100644
--- a/dom/animation/AnimationEffectTiming.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef mozilla_dom_AnimationEffectTiming_h
-#define mozilla_dom_AnimationEffectTiming_h
-
-#include "mozilla/dom/AnimationEffectTimingReadOnly.h"
-#include "mozilla/Attributes.h" // For MOZ_NON_OWNING_REF
-#include "nsStringFwd.h"
-
-namespace mozilla {
-namespace dom {
-
-class KeyframeEffect;
-
-class AnimationEffectTiming : public AnimationEffectTimingReadOnly
-{
-public:
- AnimationEffectTiming(nsIDocument* aDocument,
- const TimingParams& aTiming,
- KeyframeEffect* aEffect)
- : AnimationEffectTimingReadOnly(aDocument, aTiming)
- , mEffect(aEffect) { }
-
- JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
-
- void Unlink() override { mEffect = nullptr; }
-
- void SetDelay(double aDelay);
- void SetEndDelay(double aEndDelay);
- void SetFill(const FillMode& aFill);
- void SetIterationStart(double aIterationStart, ErrorResult& aRv);
- void SetIterations(double aIterations, ErrorResult& aRv);
- void SetDuration(const UnrestrictedDoubleOrString& aDuration,
- ErrorResult& aRv);
- void SetDirection(const PlaybackDirection& aDirection);
- void SetEasing(const nsAString& aEasing, ErrorResult& aRv);
-
-private:
- KeyframeEffect* MOZ_NON_OWNING_REF mEffect;
-};
-
-} // namespace dom
-} // namespace mozilla
-
-#endif // mozilla_dom_AnimationEffectTiming_h
diff --git a/dom/animation/AnimationEffectTimingReadOnly.cpp b/dom/animation/AnimationEffectTimingReadOnly.cpp
deleted file mode 100644
--- a/dom/animation/AnimationEffectTimingReadOnly.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "mozilla/dom/AnimationEffectTimingReadOnly.h"
-
-#include "mozilla/AnimationUtils.h"
-#include "mozilla/dom/AnimatableBinding.h"
-#include "mozilla/dom/AnimationEffectTimingReadOnlyBinding.h"
-#include "mozilla/dom/CSSPseudoElement.h"
-#include "mozilla/dom/KeyframeEffectBinding.h"
-
-namespace mozilla {
-namespace dom {
-
-NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(AnimationEffectTimingReadOnly, mDocument)
-
-NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(AnimationEffectTimingReadOnly, AddRef)
-NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(AnimationEffectTimingReadOnly, Release)
-
-JSObject*
-AnimationEffectTimingReadOnly::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
-{
- return AnimationEffectTimingReadOnlyBinding::Wrap(aCx, this, aGivenProto);
-}
-
-void
-AnimationEffectTimingReadOnly::GetDuration(
- OwningUnrestrictedDoubleOrString& aRetVal) const
-{
- if (mTiming.Duration()) {
- aRetVal.SetAsUnrestrictedDouble() = mTiming.Duration()->ToMilliseconds();
- } else {
- aRetVal.SetAsString().AssignLiteral("auto");
- }
-}
-
-void
-AnimationEffectTimingReadOnly::GetEasing(nsString& aRetVal) const
-{
- if (mTiming.TimingFunction()) {
- mTiming.TimingFunction()->AppendToString(aRetVal);
- } else {
- aRetVal.AssignLiteral("linear");
- }
-}
-
-} // namespace dom
-} // namespace mozilla
diff --git a/dom/animation/AnimationEffectTimingReadOnly.h b/dom/animation/AnimationEffectTimingReadOnly.h
deleted file mode 100644
--- a/dom/animation/AnimationEffectTimingReadOnly.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef mozilla_dom_AnimationEffectTimingReadOnly_h
-#define mozilla_dom_AnimationEffectTimingReadOnly_h
-
-#include "js/TypeDecls.h"
-#include "mozilla/Attributes.h"
-#include "mozilla/ErrorResult.h"
-#include "mozilla/TimingParams.h"
-#include "mozilla/dom/BindingDeclarations.h"
-#include "mozilla/dom/UnionTypes.h"
-#include "nsCycleCollectionParticipant.h"
-#include "nsWrapperCache.h"
-
-namespace mozilla {
-namespace dom {
-
-class AnimationEffectTimingReadOnly : public nsWrapperCache
-{
-public:
- AnimationEffectTimingReadOnly() = default;
- AnimationEffectTimingReadOnly(nsIDocument* aDocument,
- const TimingParams& aTiming)
- : mDocument(aDocument)
- , mTiming(aTiming) { }
-
- NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(AnimationEffectTimingReadOnly)
- NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(AnimationEffectTimingReadOnly)
-
-protected:
- virtual ~AnimationEffectTimingReadOnly() = default;
-
-public:
- nsISupports* GetParentObject() const { return mDocument; }
- JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
-
- double Delay() const { return mTiming.Delay().ToMilliseconds(); }
- double EndDelay() const { return mTiming.EndDelay().ToMilliseconds(); }
- FillMode Fill() const { return mTiming.Fill(); }
- double IterationStart() const { return mTiming.IterationStart(); }
- double Iterations() const { return mTiming.Iterations(); }
- void GetDuration(OwningUnrestrictedDoubleOrString& aRetVal) const;
- PlaybackDirection Direction() const { return mTiming.Direction(); }
- void GetEasing(nsString& aRetVal) const;
-
- const TimingParams& AsTimingParams() const { return mTiming; }
- void SetTimingParams(const TimingParams& aTiming) { mTiming = aTiming; }
-
- virtual void Unlink() { }
-
-protected:
- RefPtr<nsIDocument> mDocument;
- TimingParams mTiming;
-};
-
-} // namespace dom
-} // namespace mozilla
-
-#endif // mozilla_dom_AnimationEffectTimingReadOnly_h
diff --git a/dom/animation/KeyframeEffect.cpp b/dom/animation/KeyframeEffect.cpp
--- a/dom/animation/KeyframeEffect.cpp
+++ b/dom/animation/KeyframeEffect.cpp
@@ -8,7 +8,6 @@
#include "mozilla/dom/KeyframeAnimationOptionsBinding.h"
// For UnrestrictedDoubleOrKeyframeAnimationOptions
-#include "mozilla/dom/AnimationEffectTiming.h"
#include "mozilla/dom/KeyframeEffectBinding.h"
#include "nsDocument.h" // For nsDocument::IsWebAnimationsEnabled
#include "nsDOMMutationObserver.h" // For nsAutoAnimationMutationBatch
@@ -21,9 +20,7 @@ KeyframeEffect::KeyframeEffect(nsIDocume
const Maybe<OwningAnimationTarget>& aTarget,
const TimingParams& aTiming,
const KeyframeEffectParams& aOptions)
- : KeyframeEffectReadOnly(aDocument, aTarget,
- new AnimationEffectTiming(aDocument, aTiming, this),
- aOptions)
+ : KeyframeEffectReadOnly(aDocument, aTarget, aTiming, aOptions)
{
}
diff --git a/dom/animation/KeyframeEffectReadOnly.cpp b/dom/animation/KeyframeEffectReadOnly.cpp
--- a/dom/animation/KeyframeEffectReadOnly.cpp
+++ b/dom/animation/KeyframeEffectReadOnly.cpp
@@ -75,18 +75,6 @@ KeyframeEffectReadOnly::KeyframeEffectRe
const Maybe<OwningAnimationTarget>& aTarget,
const TimingParams& aTiming,
const KeyframeEffectParams& aOptions)
- : KeyframeEffectReadOnly(aDocument, aTarget,
- new AnimationEffectTimingReadOnly(aDocument,
- aTiming),
- aOptions)
-{
-}
-
-KeyframeEffectReadOnly::KeyframeEffectReadOnly(
- nsIDocument* aDocument,
- const Maybe<OwningAnimationTarget>& aTarget,
- AnimationEffectTimingReadOnly* aTiming,
- const KeyframeEffectParams& aOptions)
: AnimationEffectReadOnly(aDocument, aTiming)
, mTarget(aTarget)
, mEffectOptions(aOptions)
diff --git a/dom/animation/KeyframeEffectReadOnly.h b/dom/animation/KeyframeEffectReadOnly.h
--- a/dom/animation/KeyframeEffectReadOnly.h
+++ b/dom/animation/KeyframeEffectReadOnly.h
@@ -286,11 +286,6 @@ public:
}
protected:
- KeyframeEffectReadOnly(nsIDocument* aDocument,
- const Maybe<OwningAnimationTarget>& aTarget,
- AnimationEffectTimingReadOnly* aTiming,
- const KeyframeEffectParams& aOptions);
-
~KeyframeEffectReadOnly() override = default;
static Maybe<OwningAnimationTarget>
diff --git a/dom/animation/TimingParams.cpp b/dom/animation/TimingParams.cpp
--- a/dom/animation/TimingParams.cpp
+++ b/dom/animation/TimingParams.cpp
@@ -18,11 +18,11 @@
namespace mozilla {
template <class OptionsType>
-static const dom::AnimationEffectTimingProperties&
+static const dom::EffectTiming&
GetTimingProperties(const OptionsType& aOptions);
template <>
-/* static */ const dom::AnimationEffectTimingProperties&
+/* static */ const dom::EffectTiming&
GetTimingProperties(
const dom::UnrestrictedDoubleOrKeyframeEffectOptions& aOptions)
{
@@ -31,7 +31,7 @@ GetTimingProperties(
}
template <>
-/* static */ const dom::AnimationEffectTimingProperties&
+/* static */ const dom::EffectTiming&
GetTimingProperties(
const dom::UnrestrictedDoubleOrKeyframeAnimationOptions& aOptions)
{
@@ -46,6 +46,7 @@ TimingParams::FromOptionsType(const Opti
ErrorResult& aRv)
{
TimingParams result;
+
if (aOptions.IsUnrestrictedDouble()) {
double durationInMs = aOptions.GetAsUnrestrictedDouble();
if (durationInMs >= 0) {
@@ -55,39 +56,12 @@ TimingParams::FromOptionsType(const Opti
aRv.Throw(NS_ERROR_DOM_TYPE_ERR);
return result;
}
+
+ result.Update();
} else {
- const dom::AnimationEffectTimingProperties& timing =
- GetTimingProperties(aOptions);
-
- Maybe<StickyTimeDuration> duration =
- TimingParams::ParseDuration(timing.mDuration, aRv);
- if (aRv.Failed()) {
- return result;
- }
- TimingParams::ValidateIterationStart(timing.mIterationStart, aRv);
- if (aRv.Failed()) {
- return result;
- }
- TimingParams::ValidateIterations(timing.mIterations, aRv);
- if (aRv.Failed()) {
- return result;
- }
- Maybe<ComputedTimingFunction> easing =
- TimingParams::ParseEasing(timing.mEasing, aDocument, aRv);
- if (aRv.Failed()) {
- return result;
- }
-
- result.mDuration = duration;
- result.mDelay = TimeDuration::FromMilliseconds(timing.mDelay);
- result.mEndDelay = TimeDuration::FromMilliseconds(timing.mEndDelay);
- result.mIterations = timing.mIterations;
- result.mIterationStart = timing.mIterationStart;
- result.mDirection = timing.mDirection;
- result.mFill = timing.mFill;
- result.mFunction = easing;
+ const dom::EffectTiming& timing = GetTimingProperties(aOptions);
+ result = FromEffectTiming(timing, aDocument, aRv);
}
- result.Update();
return result;
}
@@ -110,6 +84,124 @@ TimingParams::FromOptionsUnion(
return FromOptionsType(aOptions, aDocument, aRv);
}
+/* static */ TimingParams
+TimingParams::FromEffectTiming(const dom::EffectTiming& aEffectTiming,
+ nsIDocument* aDocument,
+ ErrorResult& aRv)
+{
+ TimingParams result;
+
+ Maybe<StickyTimeDuration> duration =
+ TimingParams::ParseDuration(aEffectTiming.mDuration, aRv);
+ if (aRv.Failed()) {
+ return result;
+ }
+ TimingParams::ValidateIterationStart(aEffectTiming.mIterationStart, aRv);
+ if (aRv.Failed()) {
+ return result;
+ }
+ TimingParams::ValidateIterations(aEffectTiming.mIterations, aRv);
+ if (aRv.Failed()) {
+ return result;
+ }
+ Maybe<ComputedTimingFunction> easing =
+ TimingParams::ParseEasing(aEffectTiming.mEasing, aDocument, aRv);
+ if (aRv.Failed()) {
+ return result;
+ }
+
+ result.mDuration = duration;
+ result.mDelay = TimeDuration::FromMilliseconds(aEffectTiming.mDelay);
+ result.mEndDelay = TimeDuration::FromMilliseconds(aEffectTiming.mEndDelay);
+ result.mIterations = aEffectTiming.mIterations;
+ result.mIterationStart = aEffectTiming.mIterationStart;
+ result.mDirection = aEffectTiming.mDirection;
+ result.mFill = aEffectTiming.mFill;
+ result.mFunction = easing;
+
+ result.Update();
+
+ return result;
+}
+
+/* static */ TimingParams
+TimingParams::MergePartialEffectTiming(
+ const TimingParams& aSource,
+ const dom::PartialEffectTiming& aEffectTiming,
+ nsIDocument* aDocument,
+ ErrorResult& aRv)
+{
+ MOZ_ASSERT(!aRv.Failed(), "Initially return value should be ok");
+
+ TimingParams result = aSource;
+
+ Maybe<StickyTimeDuration> duration;
+ if (aEffectTiming.mDuration.WasPassed()) {
+ duration =
+ TimingParams::ParseDuration(aEffectTiming.mDuration.Value(), aRv);
+ if (aRv.Failed()) {
+ return result;
+ }
+ }
+
+ if (aEffectTiming.mIterationStart.WasPassed()) {
+ TimingParams::ValidateIterationStart(
+ aEffectTiming.mIterationStart.Value(), aRv);
+ if (aRv.Failed()) {
+ return result;
+ }
+ }
+
+ if (aEffectTiming.mIterations.WasPassed()) {
+ TimingParams::ValidateIterations(aEffectTiming.mIterations.Value(), aRv);
+ if (aRv.Failed()) {
+ return result;
+ }
+ }
+
+ Maybe<ComputedTimingFunction> easing;
+ if (aEffectTiming.mEasing.WasPassed()) {
+ easing =
+ TimingParams::ParseEasing(aEffectTiming.mEasing.Value(), aDocument, aRv);
+ if (aRv.Failed()) {
+ return result;
+ }
+ }
+
+ if (aEffectTiming.mDuration.WasPassed()) {
+ result.mDuration = duration;
+ }
+ if (aEffectTiming.mDelay.WasPassed()) {
+ result.mDelay =
+ TimeDuration::FromMilliseconds(aEffectTiming.mDelay.Value());
+ }
+ if (aEffectTiming.mEndDelay.WasPassed()) {
+ result.mEndDelay =
+ TimeDuration::FromMilliseconds(aEffectTiming.mEndDelay.Value());
+ }
+ if (aEffectTiming.mIterations.WasPassed()) {
+ result.mIterations =
+ aEffectTiming.mIterations.Value();
+ }
+ if (aEffectTiming.mIterationStart.WasPassed()) {
+ result.mIterationStart =
+ aEffectTiming.mIterationStart.Value();
+ }
+ if (aEffectTiming.mDirection.WasPassed()) {
+ result.mDirection = aEffectTiming.mDirection.Value();
+ }
+ if (aEffectTiming.mFill.WasPassed()) {
+ result.mFill = aEffectTiming.mFill.Value();
+ }
+ if (aEffectTiming.mEasing.WasPassed()) {
+ result.mFunction = easing;
+ }
+
+ result.Update();
+
+ return result;
+}
+
/* static */ Maybe<ComputedTimingFunction>
TimingParams::ParseEasing(const nsAString& aEasing,
nsIDocument* aDocument,
diff --git a/dom/animation/TimingParams.h b/dom/animation/TimingParams.h
--- a/dom/animation/TimingParams.h
+++ b/dom/animation/TimingParams.h
@@ -27,6 +27,7 @@ class nsIDocument;
namespace mozilla {
namespace dom {
+struct EffectTiming;
class UnrestrictedDoubleOrKeyframeEffectOptions;
class UnrestrictedDoubleOrKeyframeAnimationOptions;
}
@@ -79,6 +80,14 @@ struct TimingParams
static TimingParams FromOptionsUnion(
const dom::UnrestrictedDoubleOrKeyframeAnimationOptions& aOptions,
nsIDocument* aDocument, ErrorResult& aRv);
+ static TimingParams FromEffectTiming(
+ const dom::EffectTiming& aEffectTiming,
+ nsIDocument* aDocument,
+ ErrorResult& aRv);
+ static TimingParams MergePartialEffectTiming(
+ const TimingParams& aSource,
+ const dom::PartialEffectTiming& aEffectTiming,
+ nsIDocument* aDocument, ErrorResult& aRv);
// Range-checks and validates an UnrestrictedDoubleOrString or
// OwningUnrestrictedDoubleOrString object and converts to a
diff --git a/dom/animation/moz.build b/dom/animation/moz.build
--- a/dom/animation/moz.build
+++ b/dom/animation/moz.build
@@ -13,8 +13,6 @@ MOCHITEST_CHROME_MANIFESTS += ['test/chr
EXPORTS.mozilla.dom += [
'Animation.h',
'AnimationEffectReadOnly.h',
- 'AnimationEffectTiming.h',
- 'AnimationEffectTimingReadOnly.h',
'AnimationTimeline.h',
'CSSPseudoElement.h',
'DocumentTimeline.h',
@@ -44,8 +42,6 @@ EXPORTS.mozilla += [
UNIFIED_SOURCES += [
'Animation.cpp',
'AnimationEffectReadOnly.cpp',
- 'AnimationEffectTiming.cpp',
- 'AnimationEffectTimingReadOnly.cpp',
'AnimationPerformanceWarning.cpp',
'AnimationTimeline.cpp',
'AnimationUtils.cpp',
diff --git a/dom/tests/mochitest/general/test_interfaces.js b/dom/tests/mochitest/general/test_interfaces.js
--- a/dom/tests/mochitest/general/test_interfaces.js
+++ b/dom/tests/mochitest/general/test_interfaces.js
@@ -111,10 +111,6 @@ var interfaceNamesInGlobalScope =
// IMPORTANT: Do not change this list without review from a DOM peer!
{name: "AnimationEffectReadOnly", release: false},
// IMPORTANT: Do not change this list without review from a DOM peer!
- {name: "AnimationEffectTiming", release: false},
-// IMPORTANT: Do not change this list without review from a DOM peer!
- {name: "AnimationEffectTimingReadOnly", release: false},
-// IMPORTANT: Do not change this list without review from a DOM peer!
"AnimationEvent",
// IMPORTANT: Do not change this list without review from a DOM peer!
{name: "AnimationPlaybackEvent", release: false},
diff --git a/dom/webidl/AnimationEffectReadOnly.webidl b/dom/webidl/AnimationEffectReadOnly.webidl
--- a/dom/webidl/AnimationEffectReadOnly.webidl
+++ b/dom/webidl/AnimationEffectReadOnly.webidl
@@ -25,7 +25,7 @@ enum PlaybackDirection {
"alternate-reverse"
};
-dictionary AnimationEffectTimingProperties {
+dictionary EffectTiming {
double delay = 0.0;
double endDelay = 0.0;
FillMode fill = "auto";
@@ -36,7 +36,20 @@ dictionary AnimationEffectTimingProperti
DOMString easing = "linear";
};
-dictionary ComputedTimingProperties : AnimationEffectTimingProperties {
+dictionary PartialEffectTiming {
+ double delay;
+ double endDelay;
+ FillMode fill;
+ double iterationStart;
+ unrestricted double iterations;
+ (unrestricted double or DOMString) duration;
+ PlaybackDirection direction;
+ DOMString easing;
+};
+
+dictionary ComputedEffectTiming : EffectTiming {
+ unrestricted double computedDuration = 0.0;
+ FillMode computedFillMode = "none";
unrestricted double endTime = 0.0;
unrestricted double activeDuration = 0.0;
double? localTime = null;
@@ -46,8 +59,10 @@ dictionary ComputedTimingProperties : An
[Func="nsDocument::IsWebAnimationsEnabled"]
interface AnimationEffectReadOnly {
- [Cached, Constant]
- readonly attribute AnimationEffectTimingReadOnly timing;
- [BinaryName="getComputedTimingAsDict"]
- ComputedTimingProperties getComputedTiming();
+ [BinaryName="getTimingAsDict"]
+ ComputedEffectTiming getTiming();
+ [Throws]
+ void setTiming(optional EffectTiming timing);
+ [Throws]
+ void updateTiming(optional PartialEffectTiming timing);
};
diff --git a/dom/webidl/AnimationEffectTiming.webidl b/dom/webidl/AnimationEffectTiming.webidl
deleted file mode 100644
--- a/dom/webidl/AnimationEffectTiming.webidl
+++ /dev/null
@@ -1,27 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * The origin of this IDL file is
- * https://drafts.csswg.org/web-animations/#animationeffecttiming
- *
- * Copyright © 2015 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
- * liability, trademark and document use rules apply.
- */
-
-[Func="nsDocument::IsWebAnimationsEnabled"]
-interface AnimationEffectTiming : AnimationEffectTimingReadOnly {
- inherit attribute double delay;
- inherit attribute double endDelay;
- inherit attribute FillMode fill;
- [SetterThrows]
- inherit attribute double iterationStart;
- [SetterThrows]
- inherit attribute unrestricted double iterations;
- [SetterThrows]
- inherit attribute (unrestricted double or DOMString) duration;
- inherit attribute PlaybackDirection direction;
- [SetterThrows]
- inherit attribute DOMString easing;
-};
diff --git a/dom/webidl/AnimationEffectTimingReadOnly.webidl b/dom/webidl/AnimationEffectTimingReadOnly.webidl
deleted file mode 100644
--- a/dom/webidl/AnimationEffectTimingReadOnly.webidl
+++ /dev/null
@@ -1,23 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * The origin of this IDL file is
- * https://drafts.csswg.org/web-animations/#animationeffecttimingreadonly
- *
- * Copyright © 2015 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
- * liability, trademark and document use rules apply.
- */
-
-[Func="nsDocument::IsWebAnimationsEnabled"]
-interface AnimationEffectTimingReadOnly {
- readonly attribute double delay;
- readonly attribute double endDelay;
- readonly attribute FillMode fill;
- readonly attribute double iterationStart;
- readonly attribute unrestricted double iterations;
- readonly attribute (unrestricted double or DOMString) duration;
- readonly attribute PlaybackDirection direction;
- readonly attribute DOMString easing;
-};
diff --git a/dom/webidl/KeyframeEffect.webidl b/dom/webidl/KeyframeEffect.webidl
--- a/dom/webidl/KeyframeEffect.webidl
+++ b/dom/webidl/KeyframeEffect.webidl
@@ -15,7 +15,7 @@ enum IterationCompositeOperation {
"accumulate"
};
-dictionary KeyframeEffectOptions : AnimationEffectTimingProperties {
+dictionary KeyframeEffectOptions : EffectTiming {
IterationCompositeOperation iterationComposite = "replace";
CompositeOperation composite = "replace";
};
diff --git a/dom/webidl/moz.build b/dom/webidl/moz.build
--- a/dom/webidl/moz.build
+++ b/dom/webidl/moz.build
@@ -378,8 +378,6 @@ WEBIDL_FILES = [
'Animatable.webidl',
'Animation.webidl',
'AnimationEffectReadOnly.webidl',
- 'AnimationEffectTiming.webidl',
- 'AnimationEffectTimingReadOnly.webidl',
'AnimationEvent.webidl',
'AnimationTimeline.webidl',
'AnonymousContent.webidl',
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment