Bug 1328065 - Modify APZ hit testing to target the content scrolled by the scrollbar when a scrollbar is hit. r=kats
MozReview-Commit-ID: G2wMPIlUrz9
--- a/gfx/layers/apz/src/APZCTreeManager.cpp
+++ b/gfx/layers/apz/src/APZCTreeManager.cpp
@@ -1788,21 +1788,30 @@ APZCTreeManager::GetAPZCAtPoint(HitTesti
return TraversalFlag::Abort;
}
return TraversalFlag::Continue;
}
);
if (*aOutHitResult != HitNothing) {
MOZ_ASSERT(resultNode);
- if (aOutHitScrollbar) {
- for (HitTestingTreeNode* n = resultNode; n; n = n->GetParent()) {
- if (n->IsScrollbarNode()) {
+ for (HitTestingTreeNode* n = resultNode; n; n = n->GetParent()) {
+ if (n->IsScrollbarNode()) {
+ if (aOutHitScrollbar) {
*aOutHitScrollbar = true;
}
+ // If we hit a scrollbar, target the APZC for the content scrolled
+ // by the scrollbar. (The scrollbar itself doesn't scroll with the
+ // scrolled content, so it doesn't carry the scrolled content's
+ // scroll metadata).
+ ScrollableLayerGuid guid(n->GetLayersId(), 0, n->GetScrollTargetId());
+ if (RefPtr<HitTestingTreeNode> scrollTarget = GetTargetNode(guid, &GuidComparatorIgnoringPresShell)) {
+ MOZ_ASSERT(scrollTarget->GetApzc());
+ return scrollTarget->GetApzc();
+ }
}
}
AsyncPanZoomController* result = GetTargetApzcForNode(resultNode);
if (!result) {
result = FindRootApzcForLayersId(resultNode->GetLayersId());
MOZ_ASSERT(result);
APZCTM_LOG("Found target %p using root lookup\n", result);
--- a/gfx/layers/apz/src/HitTestingTreeNode.cpp
+++ b/gfx/layers/apz/src/HitTestingTreeNode.cpp
@@ -123,16 +123,22 @@ HitTestingTreeNode::GetScrollThumbLength
}
bool
HitTestingTreeNode::IsScrollbarNode() const
{
return mIsScrollbarContainer || (mScrollDir != ScrollDirection::NONE);
}
+FrameMetrics::ViewID
+HitTestingTreeNode::GetScrollTargetId() const
+{
+ return mScrollViewId;
+}
+
void
HitTestingTreeNode::SetFixedPosData(FrameMetrics::ViewID aFixedPosTarget)
{
mFixedPosTarget = aFixedPosTarget;
}
FrameMetrics::ViewID
HitTestingTreeNode::GetFixedPosTarget() const
--- a/gfx/layers/apz/src/HitTestingTreeNode.h
+++ b/gfx/layers/apz/src/HitTestingTreeNode.h
@@ -93,16 +93,17 @@ public:
void SetScrollbarData(FrameMetrics::ViewID aScrollViewId,
ScrollDirection aDir,
int32_t aScrollThumbLength,
bool aIsScrollContainer);
bool MatchesScrollDragMetrics(const AsyncDragMetrics& aDragMetrics) const;
LayerIntCoord GetScrollThumbLength() const;
bool IsScrollbarNode() const;
+ FrameMetrics::ViewID GetScrollTargetId() const;
/* Fixed pos info */
void SetFixedPosData(FrameMetrics::ViewID aFixedPosTarget);
FrameMetrics::ViewID GetFixedPosTarget() const;
/* Convert aPoint into the LayerPixel space for the layer corresponding to
* this node. */