Created
January 12, 2018 07:53
-
-
Save birtles/65035e868a2bd4541312b3671f9b2c92 to your computer and use it in GitHub Desktop.
WIP Patch to change Web Animation timing interfaces in Gecko
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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