diff --git a/layout/base/FrameLayerBuilder.cpp b/layout/base/FrameLayerBuilder.cpp index c31447db44be..9b5358bad7be 100644 --- a/layout/base/FrameLayerBuilder.cpp +++ b/layout/base/FrameLayerBuilder.cpp @@ -446,13 +446,8 @@ public: */ already_AddRefed GetContainerForImageLayer(nsDisplayListBuilder* aBuilder); - bool VisibleAboveRegionIntersects(const nsIntRect& aRect) const - { return mVisibleAboveRegion.Intersects(aRect); } bool VisibleAboveRegionIntersects(const nsIntRegion& aRegion) const { return !mVisibleAboveRegion.Intersect(aRegion).IsEmpty(); } - - bool VisibleRegionIntersects(const nsIntRect& aRect) const - { return mVisibleRegion.Intersects(aRect); } bool VisibleRegionIntersects(const nsIntRegion& aRegion) const { return !mVisibleRegion.Intersect(aRegion).IsEmpty(); } @@ -1088,6 +1083,13 @@ public: nsIFrame* GetContainerFrame() const { return mContainerFrame; } nsDisplayListBuilder* Builder() const { return mBuilder; } + /** + * Check if we are currently inside an inactive layer. + */ + bool IsInInactiveLayer() const { + return mLayerBuilder->GetContainingPaintedLayerData(); + } + /** * Sets aOuterVisibleRegion as aLayer's visible region. aOuterVisibleRegion * is in the coordinate space of the container reference frame. @@ -2584,12 +2586,22 @@ PaintedLayerDataNode::FindPaintedLayerFor(const nsIntRect& aVisibleRect, } else { PaintedLayerData* lowestUsableLayer = nullptr; for (auto& data : Reversed(mPaintedLayerDataStack)) { - if (data.VisibleAboveRegionIntersects(aVisibleRect)) { + if (data.mVisibleAboveRegion.Intersects(aVisibleRect)) { break; } MOZ_ASSERT(!data.mExclusiveToOneItem); lowestUsableLayer = &data; - if (data.VisibleRegionIntersects(aVisibleRect)) { + nsIntRegion visibleRegion = data.mVisibleRegion; + // When checking whether the visible region intersects the given + // visible rect, also include the event-regions in the visible region, + // unless we're in an inactive layer, in which case the event-regions + // will be hoisted out into their own layer. + ContainerState& contState = mTree.ContState(); + if (!contState.IsInInactiveLayer()) { + visibleRegion.OrWith(contState.ScaleRegionToOutsidePixels(data.mHitRegion)); + visibleRegion.OrWith(contState.ScaleRegionToOutsidePixels(data.mMaybeHitRegion)); + } + if (visibleRegion.Intersects(aVisibleRect)) { break; } }