Bug 1448841 - Part 4: Always put the CompositorHitTestInfo for inactive scrollports at the very top. r?mstange
MozReview-Commit-ID: 4SuL4ErQggS
--- a/layout/generic/nsGfxScrollFrame.cpp
+++ b/layout/generic/nsGfxScrollFrame.cpp
@@ -3003,38 +3003,16 @@ MaxZIndexInList(nsDisplayList* aList, ns
{
int32_t maxZIndex = -1;
for (nsDisplayItem* item = aList->GetBottom(); item; item = item->GetAbove()) {
maxZIndex = std::max(maxZIndex, item->ZIndex());
}
return maxZIndex;
}
-// Finds the max z-index of the items in aList that meet the following conditions
-// 1) have z-index auto or z-index >= 0.
-// 2) aFrame is a proper ancestor of the item's frame.
-// Returns -1 if there is no such item.
-static int32_t
-MaxZIndexInListOfItemsContainedInFrame(nsDisplayList* aList, nsIFrame* aFrame)
-{
- int32_t maxZIndex = -1;
- for (nsDisplayItem* item = aList->GetBottom(); item; item = item->GetAbove()) {
- nsIFrame* itemFrame = item->Frame();
- // Perspective items return the scroll frame as their Frame(), so consider
- // their TransformFrame() instead.
- if (item->GetType() == DisplayItemType::TYPE_PERSPECTIVE) {
- itemFrame = static_cast<nsDisplayPerspective*>(item)->TransformFrame();
- }
- if (nsLayoutUtils::IsProperAncestorFrame(aFrame, itemFrame)) {
- maxZIndex = std::max(maxZIndex, item->ZIndex());
- }
- }
- return maxZIndex;
-}
-
template<class T>
static void
AppendInternalItemToTop(const nsDisplayListSet& aLists,
T* aItem,
int32_t aZIndex)
{
if (aZIndex >= 0) {
aItem->SetOverrideZIndex(aZIndex);
@@ -3705,18 +3683,16 @@ ScrollFrameHelper::BuildDisplayList(nsDi
if (mWillBuildScrollableLayer && aBuilder->IsPaintingToWindow()) {
aBuilder->ForceLayerForScrollParent();
}
if (couldBuildLayer) {
// Make sure that APZ will dispatch events back to content so we can create
// a displayport for this frame. We'll add the item later on.
if (!mWillBuildScrollableLayer) {
- int32_t zIndex =
- MaxZIndexInListOfItemsContainedInFrame(scrolledContent.PositionedDescendants(), mOuter);
if (aBuilder->BuildCompositorHitTestInfo()) {
CompositorHitTestInfo info = CompositorHitTestInfo::eVisibleToHitTest
| CompositorHitTestInfo::eDispatchToContent;
// If the scroll frame has non-default overscroll-behavior, instruct
// APZ to require a target confirmation before processing events that
// hit this scroll frame (that is, to drop the events if a confirmation
// does not arrive within the timeout period). Otherwise, APZ's
// fallback behaviour of scrolling the enclosing scroll frame would
@@ -3724,23 +3700,23 @@ ScrollFrameHelper::BuildDisplayList(nsDi
ScrollbarStyles scrollbarStyles = GetScrollbarStylesFromFrame();
if (scrollbarStyles.mOverscrollBehaviorX != StyleOverscrollBehavior::Auto ||
scrollbarStyles.mOverscrollBehaviorY != StyleOverscrollBehavior::Auto) {
info |= CompositorHitTestInfo::eRequiresTargetConfirmation;
}
nsDisplayCompositorHitTestInfo* hitInfo =
MakeDisplayItem<nsDisplayCompositorHitTestInfo>(aBuilder, mScrolledFrame, info, 1,
Some(mScrollPort + aBuilder->ToReferenceFrame(mOuter)));
- AppendInternalItemToTop(scrolledContent, hitInfo, zIndex);
+ AppendInternalItemToTop(scrolledContent, hitInfo, INT32_MAX);
}
if (aBuilder->IsBuildingLayerEventRegions()) {
nsDisplayLayerEventRegions* inactiveRegionItem =
MakeDisplayItem<nsDisplayLayerEventRegions>(aBuilder, mScrolledFrame, 1);
inactiveRegionItem->AddInactiveScrollPort(mScrolledFrame, mScrollPort + aBuilder->ToReferenceFrame(mOuter));
- AppendInternalItemToTop(scrolledContent, inactiveRegionItem, zIndex);
+ AppendInternalItemToTop(scrolledContent, inactiveRegionItem, INT32_MAX);
}
}
if (aBuilder->ShouldBuildScrollInfoItemsForHoisting()) {
aBuilder->AppendNewScrollInfoItemForHoisting(
MakeDisplayItem<nsDisplayScrollInfoLayer>(aBuilder, mScrolledFrame,
mOuter));
}