mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-28 12:45:27 +00:00
823fa40439
The approach here is to lazily check if we have such animations. This allows animations to be modified after being added to the pending animation tracker (but not after HasPlayPendingGeometricAnimations is called since we cache the result at that point) and avoids poor performance when calling RemovePlayPending. MozReview-Commit-ID: LRLpCRnzvw --HG-- extra : rebase_source : 59d2fea0458f833a97a3b32413930f9970c7eddb extra : histedit_source : afbdb4148c21638160c3d2a3d57db71b07180862
102 lines
3.1 KiB
C++
102 lines
3.1 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_dom_PendingAnimationTracker_h
|
|
#define mozilla_dom_PendingAnimationTracker_h
|
|
|
|
#include "mozilla/dom/Animation.h"
|
|
#include "nsCycleCollectionParticipant.h"
|
|
#include "nsIDocument.h"
|
|
#include "nsTHashtable.h"
|
|
|
|
class nsIFrame;
|
|
|
|
namespace mozilla {
|
|
|
|
class PendingAnimationTracker final
|
|
{
|
|
public:
|
|
explicit PendingAnimationTracker(nsIDocument* aDocument)
|
|
: mDocument(aDocument)
|
|
{ }
|
|
|
|
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(PendingAnimationTracker)
|
|
NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(PendingAnimationTracker)
|
|
|
|
void AddPlayPending(dom::Animation& aAnimation)
|
|
{
|
|
MOZ_ASSERT(!IsWaitingToPause(aAnimation),
|
|
"Animation is already waiting to pause");
|
|
AddPending(aAnimation, mPlayPendingSet);
|
|
mHasPlayPendingGeometricAnimations = CheckState::Indeterminate;
|
|
}
|
|
void RemovePlayPending(dom::Animation& aAnimation)
|
|
{
|
|
RemovePending(aAnimation, mPlayPendingSet);
|
|
mHasPlayPendingGeometricAnimations = CheckState::Indeterminate;
|
|
}
|
|
bool IsWaitingToPlay(const dom::Animation& aAnimation) const
|
|
{
|
|
return IsWaiting(aAnimation, mPlayPendingSet);
|
|
}
|
|
|
|
void AddPausePending(dom::Animation& aAnimation)
|
|
{
|
|
MOZ_ASSERT(!IsWaitingToPlay(aAnimation),
|
|
"Animation is already waiting to play");
|
|
AddPending(aAnimation, mPausePendingSet);
|
|
}
|
|
void RemovePausePending(dom::Animation& aAnimation)
|
|
{
|
|
RemovePending(aAnimation, mPausePendingSet);
|
|
}
|
|
bool IsWaitingToPause(const dom::Animation& aAnimation) const
|
|
{
|
|
return IsWaiting(aAnimation, mPausePendingSet);
|
|
}
|
|
|
|
void TriggerPendingAnimationsOnNextTick(const TimeStamp& aReadyTime);
|
|
void TriggerPendingAnimationsNow();
|
|
bool HasPendingAnimations() const {
|
|
return mPlayPendingSet.Count() > 0 || mPausePendingSet.Count() > 0;
|
|
}
|
|
|
|
/**
|
|
* Looks amongst the set of play-pending animations, and, if there are
|
|
* animations that affect geometric properties, notifies all play-pending
|
|
* animations so that they can be synchronized, if needed.
|
|
*/
|
|
void MarkAnimationsThatMightNeedSynchronization();
|
|
|
|
private:
|
|
~PendingAnimationTracker() { }
|
|
|
|
bool HasPlayPendingGeometricAnimations();
|
|
void EnsurePaintIsScheduled();
|
|
|
|
typedef nsTHashtable<nsRefPtrHashKey<dom::Animation>> AnimationSet;
|
|
|
|
void AddPending(dom::Animation& aAnimation, AnimationSet& aSet);
|
|
void RemovePending(dom::Animation& aAnimation, AnimationSet& aSet);
|
|
bool IsWaiting(const dom::Animation& aAnimation,
|
|
const AnimationSet& aSet) const;
|
|
|
|
AnimationSet mPlayPendingSet;
|
|
AnimationSet mPausePendingSet;
|
|
nsCOMPtr<nsIDocument> mDocument;
|
|
|
|
enum class CheckState {
|
|
Indeterminate,
|
|
Absent,
|
|
Present
|
|
};
|
|
CheckState mHasPlayPendingGeometricAnimations = CheckState::Indeterminate;
|
|
};
|
|
|
|
} // namespace mozilla
|
|
|
|
#endif // mozilla_dom_PendingAnimationTracker_h
|