
This is an automated email from the git hooks/post-receive script. pierov pushed a commit to branch geckoview-99.0.1-11.0-1 in repository tor-browser. commit d8d3ed7215b641eb2d5af77082c3398946606a5a Author: Miko Mynttinen <mikokm@gmail.com> AuthorDate: Thu Mar 24 17:40:32 2022 +0000 Bug 1736069 - Unconditionally create nsDisplayStickyPosition items r=tnikkel a=dmeehan Differential Revision: https://phabricator.services.mozilla.com/D141925 --- layout/generic/nsIFrame.cpp | 28 ++++++++++++++++---------- layout/painting/RetainedDisplayListBuilder.cpp | 4 +++- layout/painting/nsDisplayList.h | 14 ++++++++++++- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp index be46eba2110bc..c2c4d31eb218c 100644 --- a/layout/generic/nsIFrame.cpp +++ b/layout/generic/nsIFrame.cpp @@ -3349,15 +3349,7 @@ void nsIFrame::BuildDisplayListForStackingContext( aBuilder->EnterSVGEffectsContents(this, &hoistedScrollInfoItemsStorage); } - bool useStickyPosition = false; - if (disp->mPosition == StylePositionProperty::Sticky) { - StickyScrollContainer* stickyScrollContainer = - StickyScrollContainer::GetStickyScrollContainerForFrame(this); - if (stickyScrollContainer && - stickyScrollContainer->ScrollFrame()->IsMaybeAsynchronouslyScrolled()) { - useStickyPosition = true; - } - } + bool useStickyPosition = disp->mPosition == StylePositionProperty::Sticky; bool useFixedPosition = disp->mPosition == StylePositionProperty::Fixed && @@ -3837,11 +3829,25 @@ void nsIFrame::BuildDisplayListForStackingContext( // descendants). const ActiveScrolledRoot* stickyASR = ActiveScrolledRoot::PickAncestor( containerItemASR, aBuilder->CurrentActiveScrolledRoot()); - resultList.AppendNewToTop<nsDisplayStickyPosition>( + + auto* stickyItem = MakeDisplayItem<nsDisplayStickyPosition>( aBuilder, this, &resultList, stickyASR, aBuilder->CurrentActiveScrolledRoot(), clipState.IsClippedToDisplayPort()); - ct.TrackContainer(resultList.GetTop()); + + bool shouldFlatten = true; + + StickyScrollContainer* stickyScrollContainer = + StickyScrollContainer::GetStickyScrollContainerForFrame(this); + if (stickyScrollContainer && + stickyScrollContainer->ScrollFrame()->IsMaybeAsynchronouslyScrolled()) { + shouldFlatten = false; + } + + stickyItem->SetShouldFlatten(shouldFlatten); + + resultList.AppendToTop(stickyItem); + ct.TrackContainer(stickyItem); // If the sticky element is inside a filter, annotate the scroll frame that // scrolls the filter as having out-of-flow content inside a filter (this diff --git a/layout/painting/RetainedDisplayListBuilder.cpp b/layout/painting/RetainedDisplayListBuilder.cpp index 2af75e88f207c..1bd2b49b25a6b 100644 --- a/layout/painting/RetainedDisplayListBuilder.cpp +++ b/layout/painting/RetainedDisplayListBuilder.cpp @@ -596,10 +596,12 @@ class MergeState { return true; } - if (type == DisplayItemType::TYPE_SUBDOCUMENT) { + if (type == DisplayItemType::TYPE_SUBDOCUMENT || + type == DisplayItemType::TYPE_STICKY_POSITION) { // nsDisplaySubDocument::mShouldFlatten can change without an invalidation // (and is the reason we unconditionally build the subdocument item), so // always use the new one to make sure we get the right value. + // Same for |nsDisplayStickyPosition::mShouldFlatten|. return true; } diff --git a/layout/painting/nsDisplayList.h b/layout/painting/nsDisplayList.h index b41bb874c1f04..fab406241272f 100644 --- a/layout/painting/nsDisplayList.h +++ b/layout/painting/nsDisplayList.h @@ -5532,7 +5532,8 @@ class nsDisplayStickyPosition : public nsDisplayOwnLayer { const nsDisplayStickyPosition& aOther) : nsDisplayOwnLayer(aBuilder, aOther), mContainerASR(aOther.mContainerASR), - mClippedToDisplayPort(aOther.mClippedToDisplayPort) { + mClippedToDisplayPort(aOther.mClippedToDisplayPort), + mShouldFlatten(false) { MOZ_COUNT_CTOR(nsDisplayStickyPosition); } @@ -5564,6 +5565,14 @@ class nsDisplayStickyPosition : public nsDisplayOwnLayer { bool CanMoveAsync() override { return true; } + void SetShouldFlatten(bool aShouldFlatten) { + mShouldFlatten = aShouldFlatten; + } + + bool ShouldFlattenAway(nsDisplayListBuilder* aBuilder) final { + return mShouldFlatten; + } + private: NS_DISPLAY_ALLOW_CLONING() @@ -5590,6 +5599,9 @@ class nsDisplayStickyPosition : public nsDisplayOwnLayer { // checkerboarded. Note that the sticky item will still be subject to the // scrollport clip. bool mClippedToDisplayPort; + + // True if this item should be flattened away. + bool mShouldFlatten; }; class nsDisplayFixedPosition : public nsDisplayOwnLayer { -- To stop receiving notification emails like this one, please contact the administrator of this repository.