mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 13:21:05 +00:00
722dd73447
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
59 lines
1.6 KiB
C++
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
|