tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit b5aa6faa008b9aa0191c5671dafd558e86e3bb1b
parent 1e84ee418f199a3a1f3ea780299795e6dfa4b821
Author: Ting-Yu Lin <tlin@mozilla.com>
Date:   Tue, 25 Nov 2025 12:59:53 +0000

Bug 2001781 - Return nullptr from GetAbsoluteContainingBlock() when a frame is not an absolute container. r=dholbert,layout-reviewers

Differential Revision: https://phabricator.services.mozilla.com/D273941

Diffstat:
Mlayout/generic/nsBlockFrame.cpp | 3+--
Mlayout/generic/nsContainerFrame.cpp | 7+++----
Mlayout/generic/nsGridContainerFrame.cpp | 8+++-----
Mlayout/generic/nsIFrame.cpp | 17++++++++---------
4 files changed, 15 insertions(+), 20 deletions(-)

diff --git a/layout/generic/nsBlockFrame.cpp b/layout/generic/nsBlockFrame.cpp @@ -1646,8 +1646,7 @@ void nsBlockFrame::Reflow(nsPresContext* aPresContext, ReflowOutput& aMetrics, // resetting the size. Because of this, we must not reflow our abs-pos // children in that situation --- what we think is our "new size" will not be // our real new size. This also happens to be more efficient. - AbsoluteContainingBlock* absoluteContainer = - IsAbsoluteContainer() ? GetAbsoluteContainingBlock() : nullptr; + auto* absoluteContainer = GetAbsoluteContainingBlock(); if (absoluteContainer && absoluteContainer->PrepareAbsoluteFrames(this)) { bool haveInterrupt = aPresContext->HasPendingInterrupt(); if (aReflowInput.WillReflowAgainForClearance() || haveInterrupt) { diff --git a/layout/generic/nsContainerFrame.cpp b/layout/generic/nsContainerFrame.cpp @@ -181,8 +181,8 @@ void nsContainerFrame::RemoveFrame(DestroyContext& aContext, } void nsContainerFrame::DestroyAbsoluteFrames(DestroyContext& aContext) { - if (IsAbsoluteContainer()) { - GetAbsoluteContainingBlock()->DestroyFrames(aContext); + if (auto* absCB = GetAbsoluteContainingBlock()) { + absCB->DestroyFrames(aContext); MarkAsNotAbsoluteContainingBlock(); } } @@ -846,8 +846,7 @@ void nsContainerFrame::ReflowAbsoluteFrames(nsPresContext* aPresContext, ReflowOutput& aDesiredSize, const ReflowInput& aReflowInput, nsReflowStatus& aStatus) { - AbsoluteContainingBlock* absoluteContainer = - IsAbsoluteContainer() ? GetAbsoluteContainingBlock() : nullptr; + auto* absoluteContainer = GetAbsoluteContainingBlock(); if (absoluteContainer && absoluteContainer->PrepareAbsoluteFrames(this)) { // The containing block for the abs pos kids is formed by our padding edge. const auto wm = GetWritingMode(); diff --git a/layout/generic/nsGridContainerFrame.cpp b/layout/generic/nsGridContainerFrame.cpp @@ -3276,10 +3276,9 @@ struct MOZ_STACK_CLASS nsGridContainerFrame::GridReflowInput { MOZ_ASSERT(mGridItems.Length() == len + 1, "can't find GridItemInfo"); } - if (aGridContainerFrame->IsAbsoluteContainer()) { + if (auto* absCB = aGridContainerFrame->GetAbsoluteContainingBlock()) { // Prepare absolute frames before constructing GridItemInfo. - aGridContainerFrame->GetAbsoluteContainingBlock()->PrepareAbsoluteFrames( - aGridContainerFrame); + absCB->PrepareAbsoluteFrames(aGridContainerFrame); } // XXX NOTE: This is O(n^2) in the number of abs.pos. items. (bug 1252186) const nsFrameList& absPosChildren = aGridContainerFrame->GetChildList( @@ -9304,8 +9303,7 @@ nscoord nsGridContainerFrame::ReflowChildren(GridReflowInput& aGridRI, aDesiredSize.mOverflowAreas.UnionWith(ocBounds); aStatus.MergeCompletionStatusFrom(ocStatus); - AbsoluteContainingBlock* absoluteContainer = - IsAbsoluteContainer() ? GetAbsoluteContainingBlock() : nullptr; + auto* absoluteContainer = GetAbsoluteContainingBlock(); // We have prepared the absolute frames when initializing GridReflowInput. if (absoluteContainer && absoluteContainer->HasAbsoluteFrames()) { // 'gridOrigin' is the origin of the grid (the start of the first track), diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp @@ -259,13 +259,14 @@ NS_DECLARE_FRAME_PROPERTY_DELETABLE(AbsoluteContainingBlockProperty, AbsoluteContainingBlock) bool nsIFrame::HasAbsolutelyPositionedChildren() const { - return IsAbsoluteContainer() && - GetAbsoluteContainingBlock()->HasAbsoluteFrames(); + const auto* absCB = GetAbsoluteContainingBlock(); + return absCB && absCB->HasAbsoluteFrames(); } AbsoluteContainingBlock* nsIFrame::GetAbsoluteContainingBlock() const { - NS_ASSERTION(IsAbsoluteContainer(), - "The frame is not marked as an abspos container correctly"); + if (!IsAbsoluteContainer()) { + return nullptr; + } AbsoluteContainingBlock* absCB = GetProperty(AbsoluteContainingBlockProperty()); NS_ASSERTION(absCB, @@ -2039,8 +2040,7 @@ const nsFrameList& nsIFrame::GetChildList(ChildListID aListID) const { } void nsIFrame::GetChildLists(nsTArray<ChildList>* aLists) const { - if (IsAbsoluteContainer()) { - const auto* absCB = GetAbsoluteContainingBlock(); + if (const auto* absCB = GetAbsoluteContainingBlock()) { const nsFrameList& absoluteList = absCB->GetChildList(); absoluteList.AppendIfNonempty(aLists, GetAbsoluteListID()); const nsFrameList& pushedAbsoluteList = absCB->GetPushedChildList(); @@ -4573,9 +4573,8 @@ void nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, void nsIFrame::MarkAbsoluteFramesForDisplayList( nsDisplayListBuilder* aBuilder) { - if (IsAbsoluteContainer()) { - aBuilder->MarkFramesForDisplayList( - this, GetAbsoluteContainingBlock()->GetChildList()); + if (const auto* absCB = GetAbsoluteContainingBlock()) { + aBuilder->MarkFramesForDisplayList(this, absCB->GetChildList()); } }