author | Boris Chiou <boris.chiou@gmail.com> |
Thu, 05 May 2016 15:41:03 +0800 | |
changeset 302857 | 7526bb22d3a59f4675c6ea7f84952a937b8a5a42 |
parent 302856 | 4b7c8956efcbf3b0fac179972f5b42fe9a3ccdcf |
child 302858 | eedb4ecfeb3bcf52c8ebd00e211a3520d50b82c9 |
push id | 30376 |
push user | cbook@mozilla.com |
push date | Tue, 28 Jun 2016 14:09:36 +0000 |
treeherder | mozilla-central@e45890951ce7 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | birtles |
bugs | 1244590 |
milestone | 50.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/animation/KeyframeEffect.cpp +++ b/dom/animation/KeyframeEffect.cpp @@ -72,30 +72,34 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_ NS_INTERFACE_MAP_END_INHERITING(AnimationEffectReadOnly) NS_IMPL_ADDREF_INHERITED(KeyframeEffectReadOnly, AnimationEffectReadOnly) NS_IMPL_RELEASE_INHERITED(KeyframeEffectReadOnly, AnimationEffectReadOnly) KeyframeEffectReadOnly::KeyframeEffectReadOnly( nsIDocument* aDocument, const Maybe<OwningAnimationTarget>& aTarget, - const TimingParams& aTiming) + const TimingParams& aTiming, + const KeyframeEffectParams& aOptions) : KeyframeEffectReadOnly(aDocument, aTarget, new AnimationEffectTimingReadOnly(aDocument, - aTiming)) + aTiming), + aOptions) { } KeyframeEffectReadOnly::KeyframeEffectReadOnly( nsIDocument* aDocument, const Maybe<OwningAnimationTarget>& aTarget, - AnimationEffectTimingReadOnly* aTiming) + AnimationEffectTimingReadOnly* aTiming, + const KeyframeEffectParams& aOptions) : AnimationEffectReadOnly(aDocument) , mTarget(aTarget) , mTiming(aTiming) + , mEffectOptions(aOptions) , mInEffectOnLastAnimationTimingUpdate(false) , mCumulativeChangeHint(nsChangeHint(0)) { MOZ_ASSERT(aTiming); } JSObject* KeyframeEffectReadOnly::WrapObject(JSContext* aCx, @@ -746,18 +750,20 @@ KeyframeEffectReadOnly::ConstructKeyfram TimingParams timingParams = TimingParams::FromOptionsUnion(aOptions, doc, aRv); if (aRv.Failed()) { return nullptr; } Maybe<OwningAnimationTarget> target = ConvertTarget(aTarget); + // TODO: Use options data from input in the next patch. + KeyframeEffectParams effectOptions; RefPtr<KeyframeEffectType> effect = - new KeyframeEffectType(doc, target, timingParams); + new KeyframeEffectType(doc, target, timingParams, effectOptions); effect->SetKeyframes(aGlobal.Context(), aKeyframes, aRv); if (aRv.Failed()) { return nullptr; } return effect.forget(); } @@ -1362,19 +1368,21 @@ KeyframeEffectReadOnly::CanIgnoreIfNotVi //--------------------------------------------------------------------- // // KeyframeEffect // //--------------------------------------------------------------------- KeyframeEffect::KeyframeEffect(nsIDocument* aDocument, const Maybe<OwningAnimationTarget>& aTarget, - const TimingParams& aTiming) + const TimingParams& aTiming, + const KeyframeEffectParams& aOptions) : KeyframeEffectReadOnly(aDocument, aTarget, - new AnimationEffectTiming(aDocument, aTiming, this)) + new AnimationEffectTiming(aDocument, aTiming, this), + aOptions) { } JSObject* KeyframeEffect::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) { return KeyframeEffectBinding::Wrap(aCx, this, aGivenProto);
--- a/dom/animation/KeyframeEffect.h +++ b/dom/animation/KeyframeEffect.h @@ -14,19 +14,19 @@ #include "nsTArray.h" #include "nsWrapperCache.h" #include "mozilla/AnimationPerformanceWarning.h" #include "mozilla/AnimationTarget.h" #include "mozilla/Attributes.h" #include "mozilla/ComputedTiming.h" #include "mozilla/ComputedTimingFunction.h" #include "mozilla/EffectCompositor.h" +#include "mozilla/KeyframeEffectParams.h" #include "mozilla/LayerAnimationInfo.h" // LayerAnimations::kRecords #include "mozilla/Maybe.h" -#include "mozilla/OwningNonNull.h" // OwningNonNull<...> #include "mozilla/StickyTimeDuration.h" #include "mozilla/StyleAnimationValue.h" #include "mozilla/TimeStamp.h" #include "mozilla/TimingParams.h" #include "mozilla/dom/AnimationEffectReadOnly.h" #include "mozilla/dom/AnimationEffectTimingReadOnly.h" #include "mozilla/dom/Element.h" #include "mozilla/dom/Nullable.h" @@ -191,17 +191,18 @@ namespace dom { class Animation; class KeyframeEffectReadOnly : public AnimationEffectReadOnly { public: KeyframeEffectReadOnly(nsIDocument* aDocument, const Maybe<OwningAnimationTarget>& aTarget, - const TimingParams& aTiming); + const TimingParams& aTiming, + const KeyframeEffectParams& aOptions); NS_DECL_ISUPPORTS_INHERITED NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(KeyframeEffectReadOnly, AnimationEffectReadOnly) virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override; @@ -231,18 +232,19 @@ public: void GetKeyframes(JSContext*& aCx, nsTArray<JSObject*>& aResult, ErrorResult& aRv); void GetProperties(nsTArray<AnimationPropertyDetails>& aProperties, ErrorResult& aRv) const; IterationCompositeOperation IterationComposite() const; CompositeOperation Composite() const; - void GetSpacing(nsString& aRetVal) const { - aRetVal.AssignLiteral("distribute"); + void GetSpacing(nsString& aRetVal) const + { + mEffectOptions.GetSpacingAsString(aRetVal); } already_AddRefed<AnimationEffectTimingReadOnly> Timing() const override; const TimingParams& SpecifiedTiming() const { return mTiming->AsTimingParams(); } @@ -350,17 +352,18 @@ public: // can ignore painting if the animation is not visible. // See nsChangeHint_Hints_CanIgnoreIfNotVisible in nsChangeHint.h // in detail which change hint can be ignored. bool CanIgnoreIfNotVisible() const; protected: KeyframeEffectReadOnly(nsIDocument* aDocument, const Maybe<OwningAnimationTarget>& aTarget, - AnimationEffectTimingReadOnly* aTiming); + AnimationEffectTimingReadOnly* aTiming, + const KeyframeEffectParams& aOptions); virtual ~KeyframeEffectReadOnly(); template<class KeyframeEffectType, class OptionsType> static already_AddRefed<KeyframeEffectType> ConstructKeyframeEffect(const GlobalObject& aGlobal, const Nullable<ElementOrCSSPseudoElement>& aTarget, JS::Handle<JSObject*> aKeyframes, @@ -384,16 +387,17 @@ protected: void UnregisterTarget(); void RequestRestyle(EffectCompositor::RestyleType aRestyleType); Maybe<OwningAnimationTarget> mTarget; RefPtr<Animation> mAnimation; RefPtr<AnimationEffectTimingReadOnly> mTiming; + KeyframeEffectParams mEffectOptions; // The specified keyframes. nsTArray<Keyframe> mKeyframes; // A set of per-property value arrays, derived from |mKeyframes|. nsTArray<AnimationProperty> mProperties; // The computed progress last time we composed the style rule. This is @@ -424,17 +428,18 @@ private: static const TimeDuration OverflowRegionRefreshInterval(); }; class KeyframeEffect : public KeyframeEffectReadOnly { public: KeyframeEffect(nsIDocument* aDocument, const Maybe<OwningAnimationTarget>& aTarget, - const TimingParams& aTiming); + const TimingParams& aTiming, + const KeyframeEffectParams& aOptions); JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override; static already_AddRefed<KeyframeEffect> Constructor(const GlobalObject& aGlobal, const Nullable<ElementOrCSSPseudoElement>& aTarget, JS::Handle<JSObject*> aKeyframes,
new file mode 100644 --- /dev/null +++ b/dom/animation/KeyframeEffectParams.h @@ -0,0 +1,42 @@ +/* -*- 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_KeyframeEffectParams_h +#define mozilla_KeyframeEffectParams_h + +#include "nsCSSProps.h" +#include "nsString.h" + +namespace mozilla { + +enum class SpacingMode +{ + distribute, + paced +}; + +struct KeyframeEffectParams +{ + void GetSpacingAsString(nsAString& aSpacing) const + { + if (mSpacingMode == SpacingMode::distribute) { + aSpacing.AssignLiteral("distribute"); + } else { + aSpacing.AssignLiteral("paced("); + aSpacing.AppendASCII(nsCSSProps::GetStringValue(mPacedProperty).get()); + aSpacing.AppendLiteral(")"); + } + } + + // FIXME: Bug 1216843: Add IterationCompositeOperations and + // Bug 1216844: Add CompositeOperation + SpacingMode mSpacingMode = SpacingMode::distribute; + nsCSSProperty mPacedProperty = eCSSProperty_UNKNOWN; +}; + +} // namespace mozilla + +#endif // mozilla_KeyframeEffectParams_h
--- a/dom/animation/moz.build +++ b/dom/animation/moz.build @@ -23,16 +23,17 @@ EXPORTS.mozilla += [ 'AnimationPerformanceWarning.h', 'AnimationTarget.h', 'AnimationUtils.h', 'AnimValuesStyleRule.h', 'ComputedTiming.h', 'ComputedTimingFunction.h', 'EffectCompositor.h', 'EffectSet.h', + 'KeyframeEffectParams.h', 'KeyframeUtils.h', 'PendingAnimationTracker.h', 'PseudoElementHashEntry.h', 'TimingParams.h', ] UNIFIED_SOURCES += [ 'Animation.cpp',
--- a/layout/style/nsAnimationManager.cpp +++ b/layout/style/nsAnimationManager.cpp @@ -633,18 +633,20 @@ CSSAnimationBuilder::Build(nsPresContext isStylePaused, mStyleContext); return oldAnim.forget(); } // mTarget is non-null here, so we emplace it directly. Maybe<OwningAnimationTarget> target; target.emplace(mTarget, mStyleContext->GetPseudoType()); + KeyframeEffectParams effectOptions; RefPtr<KeyframeEffectReadOnly> effect = - new KeyframeEffectReadOnly(aPresContext->Document(), target, timing); + new KeyframeEffectReadOnly(aPresContext->Document(), target, timing, + effectOptions); effect->SetKeyframes(Move(keyframes), mStyleContext); RefPtr<CSSAnimation> animation = new CSSAnimation(aPresContext->Document()->GetScopeObject(), aSrc.GetName()); animation->SetOwningElement( OwningElementRef(*mTarget, mStyleContext->GetPseudoType()));
--- a/layout/style/nsTransitionManager.cpp +++ b/layout/style/nsTransitionManager.cpp @@ -757,19 +757,21 @@ nsTransitionManager::ConsiderStartingTra timing.mDelay = TimeDuration::FromMilliseconds(delay); timing.mIterations = 1.0; timing.mDirection = dom::PlaybackDirection::Normal; timing.mFill = dom::FillMode::Backwards; // aElement is non-null here, so we emplace it directly. Maybe<OwningAnimationTarget> target; target.emplace(aElement, aNewStyleContext->GetPseudoType()); + KeyframeEffectParams effectOptions; RefPtr<ElementPropertyTransition> pt = new ElementPropertyTransition(aElement->OwnerDoc(), target, timing, - startForReversingTest, reversePortion); + startForReversingTest, reversePortion, + effectOptions); pt->SetKeyframes(GetTransitionKeyframes(aNewStyleContext, aProperty, Move(startValue), Move(endValue), tf), aNewStyleContext); MOZ_ASSERT(mPresContext->RestyleManager()->IsGecko(), "ServoRestyleManager should not use nsTransitionManager " "for transitions");
--- a/layout/style/nsTransitionManager.h +++ b/layout/style/nsTransitionManager.h @@ -34,18 +34,19 @@ struct StyleTransition; namespace mozilla { struct ElementPropertyTransition : public dom::KeyframeEffectReadOnly { ElementPropertyTransition(nsIDocument* aDocument, Maybe<OwningAnimationTarget>& aTarget, const TimingParams &aTiming, StyleAnimationValue aStartForReversingTest, - double aReversePortion) - : dom::KeyframeEffectReadOnly(aDocument, aTarget, aTiming) + double aReversePortion, + const KeyframeEffectParams& aEffectOptions) + : dom::KeyframeEffectReadOnly(aDocument, aTarget, aTiming, aEffectOptions) , mStartForReversingTest(aStartForReversingTest) , mReversePortion(aReversePortion) { } ElementPropertyTransition* AsTransition() override { return this; } const ElementPropertyTransition* AsTransition() const override { return this;