gecko-dev/dom/animation/ScrollTimelineAnimationTracker.h
Boris Chiou 722dd73447 Bug 1771282 - Introduce ScrollTimelineAnimationTracker. r=hiro
It's possible to change the timeline if the animation is in pending. So
we still need an animation tracker to track the scroll-linked
animations. Besides, per the spec, we should keep this animation in
pending if its timeline is inactive. So in this patch, we always put the
scroll-linked animations into ScrollTimelineAnimationTracker, and if we
change the timeline but the animation is still in pending, we move the
animation into the correct animation tracker if needed.

Using two different animation trackers because we would like to trigger
scroll-linked animations after frame construction and reflow,
and don't want to ensure the paint is scheduled.

Note:
1. All tests in scroll-timeline-dynamic.tentative.html are failed. We
   will fix them in Bug 1774275.
2. Drop `animation-duration: infinite` from
   progress-based-animation-animation-longhand-properties.tentative.html,
   because infinite is not defined in animation-duration in [css-animations-1].

Differential Revision: https://phabricator.services.mozilla.com/D159650
2022-10-31 23:25:17 +00:00

59 lines
1.6 KiB
C++

/* -*- 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_ScrollTimelineAnimationTracker_h
#define mozilla_ScrollTimelineAnimationTracker_h
#include "mozilla/dom/Animation.h"
#include "nsCycleCollectionParticipant.h"
#include "nsTHashSet.h"
namespace mozilla {
namespace dom {
class Document;
}
/**
* Handle the pending animations which use scroll timeline while playing or
* pausing.
*/
class ScrollTimelineAnimationTracker final {
public:
explicit ScrollTimelineAnimationTracker(dom::Document* aDocument)
: mDocument(aDocument) {}
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(
ScrollTimelineAnimationTracker)
NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(ScrollTimelineAnimationTracker)
void AddPending(dom::Animation& aAnimation) {
mPendingSet.Insert(&aAnimation);
}
void RemovePending(dom::Animation& aAnimation) {
mPendingSet.Remove(&aAnimation);
}
bool HasPendingAnimations() const { return mPendingSet.Count() > 0; }
bool IsWaiting(const dom::Animation& aAnimation) const {
return mPendingSet.Contains(const_cast<dom::Animation*>(&aAnimation));
}
void TriggerPendingAnimations();
private:
~ScrollTimelineAnimationTracker() = default;
nsTHashSet<nsRefPtrHashKey<dom::Animation>> mPendingSet;
RefPtr<dom::Document> mDocument;
};
} // namespace mozilla
#endif // mozilla_ScrollTimelineAnimationTracker_h