Populate scroll timeline information in FrameLayerBuilder
MozReview-Commit-ID: CJmJfdXPL1J
--- a/dom/animation/AnimationTimeline.h
+++ b/dom/animation/AnimationTimeline.h
@@ -22,16 +22,17 @@
#ifdef GetCurrentTime
#undef GetCurrentTime
#endif
namespace mozilla {
namespace dom {
class Animation;
+class ScrollTimeline;
class AnimationTimeline
: public nsISupports
, public nsWrapperCache
{
public:
explicit AnimationTimeline(nsIGlobalObject* aWindow)
: mWindow(aWindow)
@@ -99,16 +100,18 @@ public:
* time.
*/
bool HasAnimations() const {
return !mAnimations.IsEmpty();
}
virtual void RemoveAnimation(Animation* aAnimation);
+ virtual const ScrollTimeline* AsScrollTimeline() const { return nullptr; }
+
virtual bool SupportsOMTA() const = 0;
protected:
nsCOMPtr<nsIGlobalObject> mWindow;
// Animations observing this timeline
//
// We store them in (a) a hashset for quick lookup, and (b) an array
--- a/dom/animation/ScrollTimeline.h
+++ b/dom/animation/ScrollTimeline.h
@@ -94,18 +94,23 @@ public:
void NotifyAnimationUpdated(Animation& aAnimation) override;
void RemoveAnimation(Animation* aAnimation) override;
void Tick();
void QueryScrollValues();
+ const ScrollTimeline* AsScrollTimeline() const override { return this; }
+
bool SupportsOMTA() const override { return false; }
+ ScrollDirection GetOrientation() const { return mOrientation; }
+ Element* GetScrollableElement() const { return mElement.get(); }
+ const StickyTimeDuration& GetTimeRange() const { return mTimeRange; }
protected:
nsIScrollableFrame* GetScrollFrame() const;
void CalculateTimeRange();
nsCOMPtr<nsIDocument> mDocument;
ScrollDirection mOrientation;
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -13,16 +13,17 @@
#include "nsDisplayList.h"
#include <stdint.h>
#include <algorithm>
#include "gfxUtils.h"
#include "mozilla/dom/TabChild.h"
#include "mozilla/dom/KeyframeEffect.h"
+#include "mozilla/dom/ScrollTimeline.h"
#include "mozilla/gfx/2D.h"
#include "mozilla/layers/PLayerTransaction.h"
#include "nsCSSRendering.h"
#include "nsRenderingContext.h"
#include "nsISelectionController.h"
#include "nsIPresShell.h"
#include "nsRegion.h"
#include "nsStyleStructInlines.h"
@@ -424,16 +425,25 @@ AddAnimationForProperty(nsIFrame* aFrame
animation->duration() = computedTiming.mDuration;
animation->iterations() = computedTiming.mIterations;
animation->iterationStart() = computedTiming.mIterationStart;
animation->direction() = static_cast<uint32_t>(timing.mDirection);
animation->property() = aProperty.mProperty;
animation->playbackRate() = aAnimation->PlaybackRate();
animation->data() = aData;
animation->easingFunction() = ToTimingFunction(timing.mFunction);
+ if (const ScrollTimeline* scrollTimeline = aAnimation->GetTimeline()->AsScrollTimeline()) {
+ animation->scrollTimelineInfo() = ScrollTimelineInfo{
+ scrollTimeline->GetOrientation(),
+ nsLayoutUtils::FindOrCreateIDFor(scrollTimeline->GetScrollableElement()),
+ TimeDuration{scrollTimeline->GetTimeRange()}
+ };
+ } else {
+ animation->scrollTimelineInfo() = null_t{};
+ }
for (uint32_t segIdx = 0; segIdx < aProperty.mSegments.Length(); segIdx++) {
const AnimationPropertySegment& segment = aProperty.mSegments[segIdx];
AnimationSegment* animSegment = animation->segments().AppendElement();
if (aProperty.mProperty == eCSSProperty_transform) {
animSegment->startState() = InfallibleTArray<TransformFunction>();
animSegment->endState() = InfallibleTArray<TransformFunction>();