Files
David Shin 8b4c08cb8f Bug 2046559: Store full scoped name for named timelines. r=layout-scroll-driven-animation-reviewers,firefox-style-system-reviewers,boris
Timelines must do loosely scoped name matching. We store the full
context for doing the matching in Animation, which doesn't change
unless the animation target updates.

Differential Revision: https://phabricator.services.mozilla.com/D312590
2026-07-17 19:08:16 +00:00

86 lines
2.4 KiB
C++

/* 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_TimelineCollection_h
#define mozilla_TimelineCollection_h
#include "mozilla/LinkedList.h"
#include "mozilla/PseudoStyleRequest.h"
#include "mozilla/RefPtr.h"
#include "mozilla/dom/TimelineName.h"
#include "nsAtomHashKeys.h"
#include "nsStyleConsts.h"
#include "nsTHashMap.h"
class nsAtom;
namespace mozilla {
namespace dom {
class Element;
}
template <class TimelineType>
struct TimelineEntry {
RefPtr<TimelineType> mTimeline = {};
StyleCascadeLevel mCascadeLevel = {};
};
// The collection of ScrollTimeline or ViewTimeline. We use the template class
// to share the implementation for these two timeline types.
template <class TimelineType>
class TimelineCollection final
: public LinkedListElement<TimelineCollection<TimelineType>> {
public:
using SelfType = TimelineCollection<TimelineType>;
using TimelineMap =
nsTHashMap<RefPtr<const nsAtom>, TimelineEntry<TimelineType>>;
TimelineCollection(dom::Element& aElement,
const PseudoStyleRequest& aPseudoRequest)
: mElement(aElement), mPseudo(aPseudoRequest) {
MOZ_COUNT_CTOR(TimelineCollection);
}
~TimelineCollection();
TimelineEntry<TimelineType> Lookup(const nsAtom* aName) const {
auto entry = mTimelines.MaybeGet(aName);
if (!entry) {
return {};
}
return *entry;
}
already_AddRefed<TimelineType> Extract(const nsAtom* aName) {
auto entry = mTimelines.Extract(aName);
if (!entry) {
return nullptr;
}
// We're about to replace this entry, don't care about cascade level.
return entry->mTimeline.forget();
}
void Swap(TimelineMap& aValue) { mTimelines.SwapElements(aValue); }
void Destroy();
// Get the collection of timelines for the given |aElement| and or create it
// if it does not already exist.
static TimelineCollection* Get(const dom::Element* aElement,
const PseudoStyleRequest& aPseudoRequest);
const TimelineMap& Timelines() const { return mTimelines; }
private:
// The element. Weak reference is fine since it owns us.
dom::Element& mElement;
const PseudoStyleRequest mPseudo;
TimelineMap mTimelines;
};
} // namespace mozilla
#endif // mozilla_TimelineCollection_h