Bug 1386747 - Ensure that scroll thumb display items generate animation IDs. r?ethlin
We need to create a WebRenderAnimationData item in order to preserve the
animation id on the frame - this allows to re-use the same animation id
over multiple display list building phases.
MozReview-Commit-ID: 8JcChwm1IAV
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -6390,16 +6390,58 @@ nsDisplayOwnLayer::BuildLayer(nsDisplayL
if (mFlags & GENERATE_SUBDOC_INVALIDATIONS) {
mFrame->PresContext()->SetNotifySubDocInvalidationData(layer);
}
return layer.forget();
}
bool
+nsDisplayOwnLayer::CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
+ const StackingContextHelper& aSc,
+ nsTArray<WebRenderParentCommand>& aParentCommands,
+ WebRenderLayerManager* aManager,
+ nsDisplayListBuilder* aDisplayListBuilder)
+{
+ if (!aManager->AsyncPanZoomEnabled() ||
+ mThumbData.mDirection == ScrollDirection::NONE) {
+ return nsDisplayWrapList::CreateWebRenderCommands(aBuilder, aSc,
+ aParentCommands, aManager, aDisplayListBuilder);
+ }
+
+ // APZ is enabled and this is a scroll thumb, so we need to create and
+ // set an animation id. That way APZ can move this scrollthumb around as
+ // needed.
+ nsRect itemBounds = mList.GetClippedBoundsWithRespectToASR(aDisplayListBuilder, mActiveScrolledRoot);
+ nsRect childrenVisible = GetVisibleRectForChildren();
+ nsRect visibleRect = itemBounds.Intersect(childrenVisible);
+ float appUnitsPerDevPixel = mFrame->PresContext()->AppUnitsPerDevPixel();
+ LayerRect bounds = ViewAs<LayerPixel>(LayoutDeviceRect::FromAppUnits(visibleRect, appUnitsPerDevPixel),
+ PixelCastJustification::WebRenderHasUnitResolution);
+ LayerPoint origin = bounds.TopLeft();
+
+ RefPtr<WebRenderAnimationData> animationData = aManager->CreateOrRecycleWebRenderUserData<WebRenderAnimationData>(this);
+ AnimationInfo& animationInfo = animationData->GetAnimationInfo();
+ animationInfo.EnsureAnimationsId();
+ uint64_t animationsId = animationInfo.GetCompositorAnimationsId();
+
+ StackingContextHelper sc(aSc,
+ aBuilder,
+ bounds,
+ origin,
+ animationsId,
+ nullptr,
+ nullptr);
+
+ nsDisplayWrapList::CreateWebRenderCommands(aBuilder, sc,
+ aParentCommands, aManager, aDisplayListBuilder);
+ return true;
+}
+
+bool
nsDisplayOwnLayer::UpdateScrollData(mozilla::layers::WebRenderScrollData* aData,
mozilla::layers::WebRenderLayerScrollData* aLayerData)
{
bool ret = false;
if (IsScrollThumbLayer()) {
ret = true;
if (aLayerData) {
aLayerData->SetScrollThumbData(mThumbData);
--- a/layout/painting/nsDisplayList.h
+++ b/layout/painting/nsDisplayList.h
@@ -4145,16 +4145,21 @@ public:
bool aForceActive = true);
#ifdef NS_BUILD_REFCNT_LOGGING
virtual ~nsDisplayOwnLayer();
#endif
virtual bool ShouldBuildLayerEvenIfInvisible(nsDisplayListBuilder* aBuilder) override;
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
const ContainerLayerParameters& aContainerParameters) override;
+ virtual bool CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
+ const StackingContextHelper& aSc,
+ nsTArray<WebRenderParentCommand>& aParentCommands,
+ mozilla::layers::WebRenderLayerManager* aManager,
+ nsDisplayListBuilder* aDisplayListBuilder) override;
virtual bool UpdateScrollData(mozilla::layers::WebRenderScrollData* aData,
mozilla::layers::WebRenderLayerScrollData* aLayerData) override;
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
const ContainerLayerParameters& aParameters) override;
virtual bool TryMerge(nsDisplayItem* aItem) override
{
// Don't allow merging, each sublist must have its own layer