Bug 1049975 - Part 7: Add SetEffectNoUpdate.
Use SetEffectNoUpdate() for the procedure of setting effect, and let SetEffect()
also calls PostUpdate(), so we can use SetEffectNoUpdate() if we don't want to
call RequestRestyle(RestyleType::layer).
MozReview-Commit-ID: CaWA34UebpH
--- a/dom/animation/Animation.cpp
+++ b/dom/animation/Animation.cpp
@@ -103,17 +103,17 @@ Animation::Constructor(const GlobalObjec
if (!document) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
timeline = document->Timeline();
}
animation->SetTimelineNoUpdate(timeline);
- animation->SetEffect(aEffect);
+ animation->SetEffectNoUpdate(aEffect);
return animation.forget();
}
void
Animation::SetId(const nsAString& aId)
{
if (mId == aId) {
@@ -121,16 +121,23 @@ Animation::SetId(const nsAString& aId)
}
mId = aId;
nsNodeUtils::AnimationChanged(this);
}
void
Animation::SetEffect(AnimationEffectReadOnly* aEffect)
{
+ SetEffectNoUpdate(aEffect);
+ PostUpdate();
+}
+
+void
+Animation::SetEffectNoUpdate(AnimationEffectReadOnly* aEffect)
+{
RefPtr<Animation> kungFuDeathGrip(this);
if (mEffect == aEffect) {
return;
}
if (mEffect) {
mEffect->SetAnimation(nullptr);
}
--- a/dom/animation/Animation.h
+++ b/dom/animation/Animation.h
@@ -93,17 +93,17 @@ public:
static already_AddRefed<Animation>
Constructor(const GlobalObject& aGlobal,
KeyframeEffectReadOnly* aEffect,
const Optional<AnimationTimeline*>& aTimeline,
ErrorResult& aRv);
void GetId(nsAString& aResult) const { aResult = mId; }
void SetId(const nsAString& aId);
AnimationEffectReadOnly* GetEffect() const { return mEffect; }
- virtual void SetEffect(AnimationEffectReadOnly* aEffect);
+ void SetEffect(AnimationEffectReadOnly* aEffect);
AnimationTimeline* GetTimeline() const { return mTimeline; }
void SetTimeline(AnimationTimeline* aTimeline);
Nullable<TimeDuration> GetStartTime() const { return mStartTime; }
void SetStartTime(const Nullable<TimeDuration>& aNewStartTime);
Nullable<TimeDuration> GetCurrentTime() const;
void SetCurrentTime(const TimeDuration& aNewCurrentTime);
double PlaybackRate() const { return mPlaybackRate; }
void SetPlaybackRate(double aPlaybackRate);
@@ -141,16 +141,17 @@ public:
* CSSAnimation::PauseFromJS so we leave it for now.
*/
void PauseFromJS(ErrorResult& aRv) { Pause(aRv); }
// Wrapper functions for Animation DOM methods when called from style.
virtual void CancelFromStyle() { CancelNoUpdate(); }
void SetTimelineNoUpdate(AnimationTimeline* aTimeline);
+ void SetEffectNoUpdate(AnimationEffectReadOnly* aEffect);
virtual void Tick();
bool NeedsTicks() const
{
AnimationPlayState playState = PlayState();
return playState == AnimationPlayState::Running ||
playState == AnimationPlayState::Pending;
}
--- a/layout/style/nsAnimationManager.cpp
+++ b/layout/style/nsAnimationManager.cpp
@@ -647,17 +647,17 @@ CSSAnimationBuilder::Build(nsPresContext
RefPtr<CSSAnimation> animation =
new CSSAnimation(aPresContext->Document()->GetScopeObject(),
aSrc.GetName());
animation->SetOwningElement(
OwningElementRef(*mTarget, mStyleContext->GetPseudoType()));
animation->SetTimelineNoUpdate(mTimeline);
- animation->SetEffect(effect);
+ animation->SetEffectNoUpdate(effect);
if (isStylePaused) {
animation->PauseFromStyle();
} else {
animation->PlayFromStyle();
}
return animation.forget();
--- a/layout/style/nsTransitionManager.cpp
+++ b/layout/style/nsTransitionManager.cpp
@@ -263,19 +263,19 @@ CSSTransition::GetCurrentTimeAt(const Do
result.SetValue((timelineTime.Value() - aStartTime)
.MultDouble(aPlaybackRate));
}
return result;
}
void
-CSSTransition::SetEffect(AnimationEffectReadOnly* aEffect)
+CSSTransition::SetEffectFromStyle(AnimationEffectReadOnly* aEffect)
{
- Animation::SetEffect(aEffect);
+ Animation::SetEffectNoUpdate(aEffect);
// Initialize transition property.
ElementPropertyTransition* pt = aEffect ? aEffect->AsTransition() : nullptr;
if (eCSSProperty_UNKNOWN == mTransitionProperty && pt) {
mTransitionProperty = pt->TransitionProperty();
mTransitionToValue = pt->ToValue();
}
}
@@ -797,17 +797,17 @@ nsTransitionManager::ConsiderStartingTra
OwningElementRef(*aElement, aNewStyleContext->GetPseudoType()));
animation->SetTimelineNoUpdate(timeline);
animation->SetCreationSequence(
mPresContext->RestyleManager()->AsGecko()->GetAnimationGeneration());
// The order of the following two calls is important since PlayFromStyle
// will add the animation to the PendingAnimationTracker of its effect's
// document. When we come to make effect writeable (bug 1049975) we should
// remove this dependency.
- animation->SetEffect(pt);
+ animation->SetEffectFromStyle(pt);
animation->PlayFromStyle();
if (!aElementTransitions) {
bool createdCollection = false;
aElementTransitions =
CSSTransitionCollection::GetOrCreateAnimationCollection(
aElement, aNewStyleContext->GetPseudoType(), &createdCollection);
if (!aElementTransitions) {
--- a/layout/style/nsTransitionManager.h
+++ b/layout/style/nsTransitionManager.h
@@ -164,16 +164,18 @@ public:
// It is important we do this *after* calling CancelFromStyle().
// This is because CancelFromStyle() will end up posting a restyle and
// that restyle should target the *transitions* level of the cascade.
// However, once we clear the owning element, CascadeLevel() will begin
// returning CascadeLevel::Animations.
mOwningElement = OwningElementRef();
}
+ void SetEffectFromStyle(AnimationEffectReadOnly* aEffect);
+
void Tick() override;
nsCSSPropertyID TransitionProperty() const;
StyleAnimationValue ToValue() const;
bool HasLowerCompositeOrderThan(const CSSTransition& aOther) const;
EffectCompositor::CascadeLevel CascadeLevel() const override
{
@@ -206,18 +208,16 @@ public:
// because the animation on the compositor may be running ahead while
// main-thread is busy.
static Nullable<TimeDuration> GetCurrentTimeAt(
const DocumentTimeline& aTimeline,
const TimeStamp& aBaseTime,
const TimeDuration& aStartTime,
double aPlaybackRate);
- void SetEffect(AnimationEffectReadOnly* aEffect) override;
-
protected:
virtual ~CSSTransition()
{
MOZ_ASSERT(!mOwningElement.IsSet(), "Owning element should be cleared "
"before a CSS transition is destroyed");
}
// Animation overrides