Bug 1349750 - Store the entire ScrollThumbData in HitTestingTreeNode. r=kats
This is preparation for future changes that will add fields to ScrollThumbData
that will be accessed via HitTestingTreeNode.
To accomplish this, this patch also exposes the entire ScrollThumbData via
LayerMetricsWrapper and WebRenderScrollDataWrapper.
MozReview-Commit-ID: 1Ed8Z80Wk1V
--- a/gfx/layers/LayerMetricsWrapper.h
+++ b/gfx/layers/LayerMetricsWrapper.h
@@ -404,21 +404,21 @@ public:
MOZ_ASSERT(IsValid());
if (mLayer->AsContainerLayer()) {
return mLayer->AsContainerLayer()->GetEventRegionsOverride();
}
return EventRegionsOverride::NoOverride;
}
- ScrollDirection GetScrollbarDirection() const
+ const ScrollThumbData& GetScrollThumbData() const
{
MOZ_ASSERT(IsValid());
- return mLayer->GetScrollThumbData().mDirection;
+ return mLayer->GetScrollThumbData();
}
FrameMetrics::ViewID GetScrollbarTargetContainerId() const
{
MOZ_ASSERT(IsValid());
return mLayer->GetScrollbarTargetContainerId();
}
--- a/gfx/layers/apz/src/APZCTreeManager.cpp
+++ b/gfx/layers/apz/src/APZCTreeManager.cpp
@@ -513,17 +513,17 @@ APZCTreeManager::PrepareNodeForLayer(con
node = RecycleOrCreateNode(aState, nullptr, aLayersId);
AttachNodeToTree(node, aParent, aNextSibling);
node->SetHitTestData(
GetEventRegions(aLayer),
aLayer.GetTransformTyped(),
aLayer.GetClipRect() ? Some(ParentLayerIntRegion(*aLayer.GetClipRect())) : Nothing(),
GetEventRegionsOverride(aParent, aLayer));
node->SetScrollbarData(aLayer.GetScrollbarTargetContainerId(),
- aLayer.GetScrollbarDirection(),
+ aLayer.GetScrollThumbData(),
aLayer.IsScrollbarContainer());
node->SetFixedPosData(aLayer.GetFixedPositionScrollContainerId());
return node;
}
AsyncPanZoomController* apzc = nullptr;
// If we get here, aLayer is a scrollable layer and somebody
// has registered a GeckoContentController for it, so we need to ensure
@@ -702,17 +702,17 @@ APZCTreeManager::PrepareNodeForLayer(con
Some(clipRegion),
GetEventRegionsOverride(aParent, aLayer));
}
// Note: if layer properties must be propagated to nodes, RecvUpdate in
// LayerTransactionParent.cpp must ensure that APZ will be notified
// when those properties change.
node->SetScrollbarData(aLayer.GetScrollbarTargetContainerId(),
- aLayer.GetScrollbarDirection(),
+ aLayer.GetScrollThumbData(),
aLayer.IsScrollbarContainer());
node->SetFixedPosData(aLayer.GetFixedPositionScrollContainerId());
return node;
}
template<typename PanGestureOrScrollWheelInput>
static bool
WillHandleInput(const PanGestureOrScrollWheelInput& aPanInput)
--- a/gfx/layers/apz/src/HitTestingTreeNode.cpp
+++ b/gfx/layers/apz/src/HitTestingTreeNode.cpp
@@ -22,17 +22,16 @@ namespace layers {
HitTestingTreeNode::HitTestingTreeNode(AsyncPanZoomController* aApzc,
bool aIsPrimaryHolder,
uint64_t aLayersId)
: mApzc(aApzc)
, mIsPrimaryApzcHolder(aIsPrimaryHolder)
, mLayersId(aLayersId)
, mScrollViewId(FrameMetrics::NULL_SCROLL_ID)
- , mScrollDir(ScrollDirection::NONE)
, mIsScrollbarContainer(false)
, mFixedPosTarget(FrameMetrics::NULL_SCROLL_ID)
, mOverride(EventRegionsOverride::NoOverride)
{
if (mIsPrimaryApzcHolder) {
MOZ_ASSERT(mApzc);
}
MOZ_ASSERT(!mApzc || mApzc->GetLayersId() == mLayersId);
@@ -90,38 +89,38 @@ HitTestingTreeNode::SetLastChild(HitTest
MOZ_ASSERT(aChild->GetApzc() != parent);
aChild->SetApzcParent(parent);
}
}
}
void
HitTestingTreeNode::SetScrollbarData(FrameMetrics::ViewID aScrollViewId,
- ScrollDirection aDir,
+ const ScrollThumbData& aThumbData,
bool aIsScrollContainer)
{
mScrollViewId = aScrollViewId;
- mScrollDir = aDir;
+ mScrollThumbData = aThumbData;
mIsScrollbarContainer = aIsScrollContainer;
}
bool
HitTestingTreeNode::MatchesScrollDragMetrics(const AsyncDragMetrics& aDragMetrics) const
{
- return ((mScrollDir == ScrollDirection::HORIZONTAL &&
+ return ((mScrollThumbData.mDirection == ScrollDirection::HORIZONTAL &&
aDragMetrics.mDirection == AsyncDragMetrics::HORIZONTAL) ||
- (mScrollDir == ScrollDirection::VERTICAL &&
+ (mScrollThumbData.mDirection == ScrollDirection::VERTICAL &&
aDragMetrics.mDirection == AsyncDragMetrics::VERTICAL)) &&
mScrollViewId == aDragMetrics.mViewId;
}
bool
HitTestingTreeNode::IsScrollbarNode() const
{
- return mIsScrollbarContainer || (mScrollDir != ScrollDirection::NONE);
+ return mIsScrollbarContainer || (mScrollThumbData.mDirection != ScrollDirection::NONE);
}
FrameMetrics::ViewID
HitTestingTreeNode::GetScrollTargetId() const
{
return mScrollViewId;
}
--- a/gfx/layers/apz/src/HitTestingTreeNode.h
+++ b/gfx/layers/apz/src/HitTestingTreeNode.h
@@ -87,17 +87,17 @@ public:
const CSSTransformMatrix& aTransform,
const Maybe<ParentLayerIntRegion>& aClipRegion,
const EventRegionsOverride& aOverride);
bool IsOutsideClip(const ParentLayerPoint& aPoint) const;
/* Scrollbar info */
void SetScrollbarData(FrameMetrics::ViewID aScrollViewId,
- ScrollDirection aDir,
+ const ScrollThumbData& aThumbData,
bool aIsScrollContainer);
bool MatchesScrollDragMetrics(const AsyncDragMetrics& aDragMetrics) const;
bool IsScrollbarNode() const;
FrameMetrics::ViewID GetScrollTargetId() const;
/* Fixed pos info */
void SetFixedPosData(FrameMetrics::ViewID aFixedPosTarget);
@@ -127,17 +127,17 @@ private:
uint64_t mLayersId;
// This is set for both scroll track and scroll thumb Container layers, and
// represents the scroll id of the scroll frame scrolled by the scrollbar.
FrameMetrics::ViewID mScrollViewId;
// This is set for scroll thumb Container layers only.
- ScrollDirection mScrollDir;
+ ScrollThumbData mScrollThumbData;
// This is set for scroll track Container layers only.
bool mIsScrollbarContainer;
FrameMetrics::ViewID mFixedPosTarget;
/* Let {L,M} be the {layer, scrollable metrics} pair that this node
* corresponds to in the layer tree. mEventRegions contains the event regions
--- a/gfx/layers/wr/WebRenderScrollData.cpp
+++ b/gfx/layers/wr/WebRenderScrollData.cpp
@@ -38,17 +38,17 @@ WebRenderLayerScrollData::Initialize(Web
mTransformIsPerspective = aLayer->GetTransformIsPerspective();
mEventRegions = aLayer->GetEventRegions();
mReferentId = aLayer->AsRefLayer()
? Some(aLayer->AsRefLayer()->GetReferentId())
: Nothing();
mEventRegionsOverride = aLayer->AsContainerLayer()
? aLayer->AsContainerLayer()->GetEventRegionsOverride()
: EventRegionsOverride::NoOverride;
- mScrollbarDirection = aLayer->GetScrollThumbData().mDirection;
+ mScrollThumbData = aLayer->GetScrollThumbData();
mScrollbarTargetContainerId = aLayer->GetScrollbarTargetContainerId();
mIsScrollbarContainer = aLayer->IsScrollbarContainer();
mFixedPosScrollContainerId = aLayer->GetFixedPositionScrollContainerId();
}
int32_t
WebRenderLayerScrollData::GetDescendantCount() const
{
--- a/gfx/layers/wr/WebRenderScrollData.h
+++ b/gfx/layers/wr/WebRenderScrollData.h
@@ -48,17 +48,17 @@ public:
size_t aIndex) const;
bool IsScrollInfoLayer() const { return mIsScrollInfoLayer; }
gfx::Matrix4x4 GetTransform() const { return mTransform; }
bool GetTransformIsPerspective() const { return mTransformIsPerspective; }
EventRegions GetEventRegions() const { return mEventRegions; }
Maybe<uint64_t> GetReferentId() const { return mReferentId; }
EventRegionsOverride GetEventRegionsOverride() const { return mEventRegionsOverride; }
- ScrollDirection GetScrollbarDirection() const { return mScrollbarDirection; }
+ const ScrollThumbData& GetScrollThumbData() const { return mScrollThumbData; }
FrameMetrics::ViewID GetScrollbarTargetContainerId() const { return mScrollbarTargetContainerId; }
bool IsScrollbarContainer() const { return mIsScrollbarContainer; }
FrameMetrics::ViewID GetFixedPositionScrollContainerId() const { return mFixedPosScrollContainerId; }
friend struct IPC::ParamTraits<WebRenderLayerScrollData>;
private:
// The number of descendants this layer has (not including the layer itself).
@@ -77,17 +77,17 @@ private:
// over IPC, and use on the parent side in APZ.
bool mIsScrollInfoLayer;
gfx::Matrix4x4 mTransform;
bool mTransformIsPerspective;
EventRegions mEventRegions;
Maybe<uint64_t> mReferentId;
EventRegionsOverride mEventRegionsOverride;
- ScrollDirection mScrollbarDirection;
+ ScrollThumbData mScrollThumbData;
FrameMetrics::ViewID mScrollbarTargetContainerId;
bool mIsScrollbarContainer;
FrameMetrics::ViewID mFixedPosScrollContainerId;
};
// Data needed by APZ, for the whole layer tree. One instance of this class
// is created for each transaction sent over PWebRenderBridge. It is populated
// with information from the WebRender layer tree on the client side and the
@@ -143,50 +143,61 @@ private:
bool mIsFirstPaint;
};
} // namespace layers
} // namespace mozilla
namespace IPC {
+// When ScrollThumbData is stored on the layer tree, it's part of
+// SimpleAttributes which itself uses PlainOldDataSerializer, so
+// we don't need a ParamTraits specialization for ScrollThumbData
+// separately. Here, however, ScrollThumbData is stored as part
+// of WebRenderLayerScrollData whose fields are serialized
+// individually, so we do.
+template<>
+struct ParamTraits<mozilla::layers::ScrollThumbData>
+ : public PlainOldDataSerializer<mozilla::layers::ScrollThumbData>
+{ };
+
template<>
struct ParamTraits<mozilla::layers::WebRenderLayerScrollData>
{
typedef mozilla::layers::WebRenderLayerScrollData paramType;
static void
Write(Message* aMsg, const paramType& aParam)
{
WriteParam(aMsg, aParam.mDescendantCount);
WriteParam(aMsg, aParam.mScrollIds);
WriteParam(aMsg, aParam.mIsScrollInfoLayer);
WriteParam(aMsg, aParam.mTransform);
WriteParam(aMsg, aParam.mTransformIsPerspective);
WriteParam(aMsg, aParam.mEventRegions);
WriteParam(aMsg, aParam.mReferentId);
WriteParam(aMsg, aParam.mEventRegionsOverride);
- WriteParam(aMsg, aParam.mScrollbarDirection);
+ WriteParam(aMsg, aParam.mScrollThumbData);
WriteParam(aMsg, aParam.mScrollbarTargetContainerId);
WriteParam(aMsg, aParam.mIsScrollbarContainer);
WriteParam(aMsg, aParam.mFixedPosScrollContainerId);
}
static bool
Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
{
return ReadParam(aMsg, aIter, &aResult->mDescendantCount)
&& ReadParam(aMsg, aIter, &aResult->mScrollIds)
&& ReadParam(aMsg, aIter, &aResult->mIsScrollInfoLayer)
&& ReadParam(aMsg, aIter, &aResult->mTransform)
&& ReadParam(aMsg, aIter, &aResult->mTransformIsPerspective)
&& ReadParam(aMsg, aIter, &aResult->mEventRegions)
&& ReadParam(aMsg, aIter, &aResult->mReferentId)
&& ReadParam(aMsg, aIter, &aResult->mEventRegionsOverride)
- && ReadParam(aMsg, aIter, &aResult->mScrollbarDirection)
+ && ReadParam(aMsg, aIter, &aResult->mScrollThumbData)
&& ReadParam(aMsg, aIter, &aResult->mScrollbarTargetContainerId)
&& ReadParam(aMsg, aIter, &aResult->mIsScrollbarContainer)
&& ReadParam(aMsg, aIter, &aResult->mFixedPosScrollContainerId);
}
};
template<>
struct ParamTraits<mozilla::layers::WebRenderScrollData>
--- a/gfx/layers/wr/WebRenderScrollDataWrapper.h
+++ b/gfx/layers/wr/WebRenderScrollDataWrapper.h
@@ -274,20 +274,20 @@ public:
}
EventRegionsOverride GetEventRegionsOverride() const
{
MOZ_ASSERT(IsValid());
return mLayer->GetEventRegionsOverride();
}
- ScrollDirection GetScrollbarDirection() const
+ const ScrollThumbData& GetScrollThumbData() const
{
MOZ_ASSERT(IsValid());
- return mLayer->GetScrollbarDirection();
+ return mLayer->GetScrollThumbData();
}
FrameMetrics::ViewID GetScrollbarTargetContainerId() const
{
MOZ_ASSERT(IsValid());
return mLayer->GetScrollbarTargetContainerId();
}