diff --git a/layout/style/AnimationCommon.cpp b/layout/style/AnimationCommon.cpp index b98301e0612a..fe9cf87c681d 100644 --- a/layout/style/AnimationCommon.cpp +++ b/layout/style/AnimationCommon.cpp @@ -99,39 +99,23 @@ CommonAnimationManager::RemoveAllElementCollections() } void -CommonAnimationManager::MaybeStartObservingRefreshDriver() -{ - if (mIsObservingRefreshDriver || !NeedsRefresh()) { - return; - } - - mPresContext->RefreshDriver()->AddRefreshObserver(this, Flush_Style); - mIsObservingRefreshDriver = true; -} - -void -CommonAnimationManager::MaybeStartOrStopObservingRefreshDriver() -{ - bool needsRefresh = NeedsRefresh(); - if (needsRefresh && !mIsObservingRefreshDriver) { - mPresContext->RefreshDriver()->AddRefreshObserver(this, Flush_Style); - } else if (!needsRefresh && mIsObservingRefreshDriver) { - mPresContext->RefreshDriver()->RemoveRefreshObserver(this, Flush_Style); - } - mIsObservingRefreshDriver = needsRefresh; -} - -bool -CommonAnimationManager::NeedsRefresh() const +CommonAnimationManager::CheckNeedsRefresh() { for (PRCList *l = PR_LIST_HEAD(&mElementCollections); l != &mElementCollections; l = PR_NEXT_LINK(l)) { if (static_cast(l)->mNeedsRefreshes) { - return true; + if (!mIsObservingRefreshDriver) { + mPresContext->RefreshDriver()->AddRefreshObserver(this, Flush_Style); + mIsObservingRefreshDriver = true; + } + return; } } - return false; + if (mIsObservingRefreshDriver) { + mIsObservingRefreshDriver = false; + mPresContext->RefreshDriver()->RemoveRefreshObserver(this, Flush_Style); + } } AnimationPlayerCollection* @@ -292,7 +276,7 @@ void CommonAnimationManager::NotifyCollectionUpdated(AnimationPlayerCollection& aCollection) { - MaybeStartObservingRefreshDriver(); + CheckNeedsRefresh(); mPresContext->ClearLastStyleUpdateForAllAnimations(); mPresContext->RestyleManager()->IncrementAnimationGeneration(); aCollection.UpdateAnimationGeneration(mPresContext); @@ -392,9 +376,21 @@ CommonAnimationManager::GetAnimationRule(mozilla::dom::Element* aElement, return nullptr; } - collection->EnsureStyleRuleFor( - mPresContext->RefreshDriver()->MostRecentRefresh(), - EnsureStyleRule_IsNotThrottled); + // Animations should already be refreshed, but transitions may not be. + // Note that this is temporary, we would like both animations and transitions + // to both be refreshed by this point. + if (IsAnimationManager()) { + NS_WARN_IF_FALSE(!collection->mNeedsRefreshes || + collection->mStyleRuleRefreshTime == + mPresContext->RefreshDriver()->MostRecentRefresh(), + "should already have refreshed style rule"); + } else { + // FIXME: Remove this assignment. See bug 1061364. + collection->mNeedsRefreshes = true; + collection->EnsureStyleRuleFor( + mPresContext->RefreshDriver()->MostRecentRefresh(), + EnsureStyleRule_IsNotThrottled); + } return collection->mStyleRule; } @@ -744,7 +740,7 @@ AnimationPlayerCollection::EnsureStyleRuleFor(TimeStamp aRefreshTime, } } - mManager->MaybeStartObservingRefreshDriver(); + mManager->CheckNeedsRefresh(); // If one of our animations just started or stopped filling, we need // to notify the transition manager. This does the notification a bit diff --git a/layout/style/AnimationCommon.h b/layout/style/AnimationCommon.h index 08e4b2032939..b24e9d37a786 100644 --- a/layout/style/AnimationCommon.h +++ b/layout/style/AnimationCommon.h @@ -131,15 +131,11 @@ protected: friend struct mozilla::AnimationPlayerCollection; void AddElementCollection(AnimationPlayerCollection* aCollection); - void ElementCollectionRemoved() { MaybeStartOrStopObservingRefreshDriver(); } + void ElementCollectionRemoved() { CheckNeedsRefresh(); } void RemoveAllElementCollections(); - // We should normally only call MaybeStartOrStopObservingRefreshDriver in - // situations where we will also queue events since otherwise we may stop - // getting refresh driver ticks before we queue the necessary events. - void MaybeStartObservingRefreshDriver(); - void MaybeStartOrStopObservingRefreshDriver(); - bool NeedsRefresh() const; + // Check to see if we should stop or start observing the refresh driver + void CheckNeedsRefresh(); virtual nsIAtom* GetAnimationsAtom() = 0; virtual nsIAtom* GetAnimationsBeforeAtom() = 0;