mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-17 06:09:19 +00:00
Bug 1923344. a=diannaS
Original Revision: https://phabricator.services.mozilla.com/D224958 Differential Revision: https://phabricator.services.mozilla.com/D224963
This commit is contained in:
parent
c811821f02
commit
4993da394f
@ -41,41 +41,33 @@ AnimationTimeline::~AnimationTimeline() { mAnimationOrder.clear(); }
|
||||
bool AnimationTimeline::Tick() {
|
||||
bool needsTicks = false;
|
||||
|
||||
nsTArray<Animation*> animationsToRemove;
|
||||
|
||||
for (Animation* animation = mAnimationOrder.getFirst(); animation;
|
||||
animation =
|
||||
static_cast<LinkedListElement<Animation>*>(animation)->getNext()) {
|
||||
AutoTArray<RefPtr<Animation>, 32> animationsToTick;
|
||||
for (Animation* animation : mAnimationOrder) {
|
||||
MOZ_ASSERT(mAnimations.Contains(animation),
|
||||
"The sampling order list should be a subset of the hashset");
|
||||
MOZ_ASSERT(!animation->IsHiddenByContentVisibility(),
|
||||
"The sampling order list should not contain any animations "
|
||||
"that are hidden by content-visibility");
|
||||
animationsToTick.AppendElement(animation);
|
||||
}
|
||||
|
||||
for (Animation* animation : animationsToTick) {
|
||||
// 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);
|
||||
RemoveAnimation(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.
|
||||
// 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->NeedsTicks()) {
|
||||
animationsToRemove.AppendElement(animation);
|
||||
RemoveAnimation(animation);
|
||||
}
|
||||
}
|
||||
|
||||
for (Animation* animation : animationsToRemove) {
|
||||
RemoveAnimation(animation);
|
||||
}
|
||||
|
||||
return needsTicks;
|
||||
}
|
||||
|
||||
@ -91,11 +83,12 @@ void AnimationTimeline::NotifyAnimationUpdated(Animation& aAnimation) {
|
||||
}
|
||||
|
||||
void AnimationTimeline::RemoveAnimation(Animation* aAnimation) {
|
||||
MOZ_ASSERT(!aAnimation->GetTimeline() || aAnimation->GetTimeline() == this);
|
||||
if (static_cast<LinkedListElement<Animation>*>(aAnimation)->isInList()) {
|
||||
if (static_cast<LinkedListElement<Animation>*>(aAnimation)->isInList() &&
|
||||
MOZ_LIKELY(!aAnimation->GetTimeline() ||
|
||||
aAnimation->GetTimeline() == this)) {
|
||||
static_cast<LinkedListElement<Animation>*>(aAnimation)->remove();
|
||||
MOZ_ASSERT(mAnimations.Contains(aAnimation),
|
||||
"The sampling order list should be a subset of the hashset");
|
||||
static_cast<LinkedListElement<Animation>*>(aAnimation)->remove();
|
||||
}
|
||||
mAnimations.Remove(aAnimation);
|
||||
}
|
||||
|
@ -13,13 +13,10 @@ namespace mozilla {
|
||||
NS_IMPL_CYCLE_COLLECTION(ScrollTimelineAnimationTracker, mPendingSet, mDocument)
|
||||
|
||||
void ScrollTimelineAnimationTracker::TriggerPendingAnimations() {
|
||||
for (auto iter = mPendingSet.begin(), end = mPendingSet.end(); iter != end;
|
||||
++iter) {
|
||||
dom::Animation* animation = *iter;
|
||||
|
||||
for (RefPtr<dom::Animation>& animation :
|
||||
ToTArray<AutoTArray<RefPtr<dom::Animation>, 32>>(mPendingSet)) {
|
||||
MOZ_ASSERT(animation->GetTimeline() &&
|
||||
!animation->GetTimeline()->IsMonotonicallyIncreasing());
|
||||
|
||||
// FIXME: Trigger now may not be correct because the spec says:
|
||||
// If a user agent determines that animation is immediately ready, it may
|
||||
// schedule the task (i.e. ResumeAt()) as a microtask such that it runs at
|
||||
@ -39,9 +36,7 @@ void ScrollTimelineAnimationTracker::TriggerPendingAnimations() {
|
||||
// inactive, and this also matches the current spec definition.
|
||||
continue;
|
||||
}
|
||||
|
||||
// Note: Remove() is legitimately called once per entry during the loop.
|
||||
mPendingSet.Remove(iter);
|
||||
mPendingSet.Remove(animation);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user