void DocumentTimeline::RemoveAnimation(Animation* aAnimation) { AnimationTimeline::RemoveAnimation(aAnimation); if (mIsObservingRefreshDriver && mAnimations.IsEmpty()) { UnregisterFromRefreshDriver(); } }
void DocumentTimeline::WillRefresh(mozilla::TimeStamp aTime) { MOZ_ASSERT(mIsObservingRefreshDriver); MOZ_ASSERT(GetRefreshDriver(), "Should be able to reach refresh driver from within WillRefresh"); bool needsTicks = false; nsTArray<Animation*> animationsToRemove(mAnimations.Count()); nsAutoAnimationMutationBatch mb(mDocument); for (Animation* animation = mAnimationOrder.getFirst(); animation; animation = animation->getNext()) { // Skip any animations that are longer need associated with this timeline. if (animation->GetTimeline() != this) { // If animation has some other timeline, it better not be also in the // animation list of this timeline object! MOZ_ASSERT(!animation->GetTimeline()); animationsToRemove.AppendElement(animation); continue; } needsTicks |= animation->NeedsTicks(); // Even if |animation| doesn't need future ticks, we should still // Tick it this time around since it might just need a one-off tick in // order to dispatch events. animation->Tick(); if (!animation->IsRelevant() && !animation->NeedsTicks()) { animationsToRemove.AppendElement(animation); } } for (Animation* animation : animationsToRemove) { RemoveAnimation(animation); } if (!needsTicks) { // We already assert that GetRefreshDriver() is non-null at the beginning // of this function but we check it again here to be sure that ticking // animations does not have any side effects that cause us to lose the // connection with the refresh driver, such as triggering the destruction // of mDocument's PresShell. MOZ_ASSERT(GetRefreshDriver(), "Refresh driver should still be valid at end of WillRefresh"); UnregisterFromRefreshDriver(); } }
void ScrollbarActivity::ActivityStarted() { mNestedActivityCounter++; CancelFadeBeginTimer(); if (!SetIsFading(false)) { return; } UnregisterFromRefreshDriver(); StartListeningForScrollbarEvents(); StartListeningForScrollAreaEvents(); SetIsActive(true); NS_ASSERTION(mIsActive, "need to be active during activity"); NS_ASSERTION(!mIsFading, "must not be fading during activity"); }
void ScrollbarActivity::EndFade() { NS_ASSERTION(mIsActive, "still need to be active at this point"); NS_ASSERTION(!IsActivityOngoing(), "why wasn't the fade end timer cancelled when scrollbar activity started?"); if (!SetIsFading(false)) { return; } SetIsActive(false); UnregisterFromRefreshDriver(); StopListeningForScrollbarEvents(); if (!mDisplayOnMouseMove) { StopListeningForScrollAreaEvents(); } NS_ASSERTION(!mIsActive, "should have gone inactive after fade end"); NS_ASSERTION(!mIsFading, "shouldn't be fading anymore"); }