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:
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());
}
}