Populate scroll timeline information in FrameLayerBuilder draft
authorBotond Ballo <botond@mozilla.com>
Fri, 05 Aug 2016 15:25:53 -0400
changeset 397400 e9648de4147bc68a92ca241764cb4639c53f9dd0
parent 397399 bd628ac0f500eb33789dbc175c1923882dcda32a
child 397401 ac3cb4c92b9c8c25703d119ae91dfecf96772b56
push id25288
push userbballo@mozilla.com
push dateFri, 05 Aug 2016 19:41:51 +0000
milestone50.0a1
Populate scroll timeline information in FrameLayerBuilder MozReview-Commit-ID: CJmJfdXPL1J
dom/animation/AnimationTimeline.h
dom/animation/ScrollTimeline.h
layout/base/nsDisplayList.cpp
--- 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>();