gecko-dev/layout/style/TimelineCollection.cpp
Boris Chiou d548aea8a2 Bug 1814786 - Part 4: Introduce TimelineCollection and TimelineManager. r=emilio
Just like how we handle the CSSAnimation and CSSTransition. We use
TimelineCollection to store the named progress timeline objects created
by scroll-timeline-name and view-timeline-name, and reuse
ElementAnimationData to handle the life time of TimelineCollection.

Also, introduce TimelineManager to update timelines generated by CSS.

We add one test which mutates the scroll-timeline-axis to make sure we
restyle the animations associtated with the existing timelines. It will
be passed when we start to use the new framework, in the next patch.

Differential Revision: https://phabricator.services.mozilla.com/D169271
2023-03-07 23:57:54 +00:00

60 lines
1.9 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/. */
#include "TimelineCollection.h"
#include "mozilla/ElementAnimationData.h"
#include "mozilla/dom/Element.h"
#include "mozilla/dom/ScrollTimeline.h"
#include <type_traits>
namespace mozilla {
template <class TimelineType>
TimelineCollection<TimelineType>::~TimelineCollection() {
MOZ_COUNT_DTOR(TimelineCollection);
// FIXME: Bug 1774060. We have to restyle the animations which use the
// timelines associtated with this TimelineCollection.
LinkedListElement<SelfType>::remove();
}
template <class TimelineType>
void TimelineCollection<TimelineType>::Destroy() {
auto* data = mElement.GetAnimationData();
MOZ_ASSERT(data);
if constexpr (std::is_same_v<TimelineType, dom::ScrollTimeline>) {
MOZ_ASSERT(data->GetScrollTimelineCollection(mPseudo) == this);
data->ClearScrollTimelineCollectionFor(mPseudo);
} else {
// TODO: Bug 1808410. Add ViewTimeline.
}
}
template <class TimelineType>
/* static */ TimelineCollection<TimelineType>*
TimelineCollection<TimelineType>::Get(const dom::Element* aElement,
const PseudoStyleType aPseudoType) {
MOZ_ASSERT(aElement);
auto* data = aElement->GetAnimationData();
if (!data) {
return nullptr;
}
if constexpr (std::is_same_v<TimelineType, dom::ScrollTimeline>) {
return data->GetScrollTimelineCollection(aPseudoType);
}
// TODO: Bug 1808410. Add ViewTimeline.
return nullptr;
}
// Explicit class instantiations
template class TimelineCollection<dom::ScrollTimeline>;
// TODO: Bug 1808410. Add TimelineCollection<dom::ViewTimeline>;
} // namespace mozilla