Bug 1384616 - Save APZ-relevant scrollbar data into the WR scroll data for layers-free transactions. r?jrmuizel
MozReview-Commit-ID: 6DQz9N6Wq0H
--- a/gfx/layers/wr/WebRenderScrollData.h
+++ b/gfx/layers/wr/WebRenderScrollData.h
@@ -65,20 +65,26 @@ public:
gfx::Matrix4x4 GetTransform() const { return mTransform; }
CSSTransformMatrix GetTransformTyped() const;
bool GetTransformIsPerspective() const { return mTransformIsPerspective; }
EventRegions GetEventRegions() const { return mEventRegions; }
const LayerIntRegion& GetVisibleRegion() const { return mVisibleRegion; }
void SetReferentId(uint64_t aReferentId) { mReferentId = Some(aReferentId); }
Maybe<uint64_t> GetReferentId() const { return mReferentId; }
EventRegionsOverride GetEventRegionsOverride() const { return mEventRegionsOverride; }
+
+ void SetScrollThumbData(const ScrollThumbData& aData) { mScrollThumbData = aData; }
const ScrollThumbData& GetScrollThumbData() const { return mScrollThumbData; }
+ void SetScrollbarAnimationId(const uint64_t& aId) { mScrollbarAnimationId = aId; }
const uint64_t& GetScrollbarAnimationId() const { return mScrollbarAnimationId; }
+ void SetScrollbarTargetContainerId(FrameMetrics::ViewID aId) { mScrollbarTargetContainerId = aId; }
FrameMetrics::ViewID GetScrollbarTargetContainerId() const { return mScrollbarTargetContainerId; }
+ void SetIsScrollbarContainer() { mIsScrollbarContainer = true; }
bool IsScrollbarContainer() const { return mIsScrollbarContainer; }
+
void SetFixedPositionScrollContainerId(FrameMetrics::ViewID aId) { mFixedPosScrollContainerId = aId; }
FrameMetrics::ViewID GetFixedPositionScrollContainerId() const { return mFixedPosScrollContainerId; }
void Dump(const WebRenderScrollData& aOwner) const;
friend struct IPC::ParamTraits<WebRenderLayerScrollData>;
private:
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -6385,16 +6385,38 @@ nsDisplayOwnLayer::BuildLayer(nsDisplayL
}
if (mFlags & GENERATE_SUBDOC_INVALIDATIONS) {
mFrame->PresContext()->SetNotifySubDocInvalidationData(layer);
}
return layer.forget();
}
+bool
+nsDisplayOwnLayer::UpdateScrollData(mozilla::layers::WebRenderScrollData* aData,
+ mozilla::layers::WebRenderLayerScrollData* aLayerData)
+{
+ bool ret = false;
+ if (IsScrollThumbLayer()) {
+ ret = true;
+ if (aLayerData) {
+ aLayerData->SetScrollThumbData(mThumbData);
+ aLayerData->SetScrollbarTargetContainerId(mScrollTarget);
+ }
+ }
+ if (mFlags & SCROLLBAR_CONTAINER) {
+ ret = true;
+ if (aLayerData) {
+ aLayerData->SetIsScrollbarContainer();
+ aLayerData->SetScrollbarTargetContainerId(mScrollTarget);
+ }
+ }
+ return ret;
+}
+
nsDisplaySubDocument::nsDisplaySubDocument(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame, nsDisplayList* aList,
uint32_t aFlags)
: nsDisplayOwnLayer(aBuilder, aFrame, aList, aBuilder->CurrentActiveScrolledRoot(), aFlags)
, mScrollParentId(aBuilder->GetCurrentScrollParentId())
{
MOZ_COUNT_CTOR(nsDisplaySubDocument);
mForceDispatchToContentRegion =
@@ -6692,17 +6714,17 @@ bool
nsDisplayFixedPosition::UpdateScrollData(mozilla::layers::WebRenderScrollData* aData,
mozilla::layers::WebRenderLayerScrollData* aLayerData)
{
if (aLayerData) {
FrameMetrics::ViewID id = nsLayoutUtils::ScrollIdForRootScrollFrame(
Frame()->PresContext());
aLayerData->SetFixedPositionScrollContainerId(id);
}
- return true;
+ return nsDisplayOwnLayer::UpdateScrollData(aData, aLayerData) | true;
}
TableType
GetTableTypeFromFrame(nsIFrame* aFrame)
{
if (aFrame->IsTableFrame()) {
return TableType::TABLE;
}
--- a/layout/painting/nsDisplayList.h
+++ b/layout/painting/nsDisplayList.h
@@ -4145,16 +4145,18 @@ 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 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
return false;
}