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 {