commit 997c4612a97971d64bf5318e9c1e50df4007a387
parent eab71dafcd077fe161f0759e83d8badb04665ba1
Author: Ting-Yu Lin <tlin@mozilla.com>
Date: Tue, 18 Nov 2025 18:53:06 +0000
Bug 2000759 - Add IsMasonry overload that take a WritingMode parameter. r=jfkthame,layout-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D272986
Diffstat:
5 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/layout/generic/nsContainerFrame.cpp b/layout/generic/nsContainerFrame.cpp
@@ -2056,8 +2056,7 @@ LogicalSize nsContainerFrame::ComputeSizeWithIntrinsicDimensions(
*styleBSize, aspectRatio, aFlags)
.mISize;
} else if (MOZ_UNLIKELY(isGridItem) &&
- !parentFrame->IsMasonry(isOrthogonal ? LogicalAxis::Block
- : LogicalAxis::Inline)) {
+ !parentFrame->IsMasonry(aWM, LogicalAxis::Inline)) {
MOZ_ASSERT(!IsTrueOverflowContainer());
// 'auto' inline-size for grid-level box - apply 'stretch' as needed:
auto cbSize = aCBSize.ISize(aWM);
@@ -2119,8 +2118,7 @@ LogicalSize nsContainerFrame::ComputeSizeWithIntrinsicDimensions(
aCBSize.BSize(aWM), aMargin.BSize(aWM), aBorderPadding.BSize(aWM),
boxSizingAdjust.BSize(aWM), *styleBSize);
} else if (MOZ_UNLIKELY(isGridItem) &&
- !parentFrame->IsMasonry(isOrthogonal ? LogicalAxis::Inline
- : LogicalAxis::Block)) {
+ !parentFrame->IsMasonry(aWM, LogicalAxis::Block)) {
MOZ_ASSERT(!IsTrueOverflowContainer());
// 'auto' block-size for grid-level box - apply 'stretch' as needed:
auto cbSize = aCBSize.BSize(aWM);
diff --git a/layout/generic/nsGridContainerFrame.cpp b/layout/generic/nsGridContainerFrame.cpp
@@ -10650,7 +10650,7 @@ bool nsGridContainerFrame::GridItemShouldStretch(const nsIFrame* aChild,
const auto cbwm = GetWritingMode();
const bool isOrthogonal = wm.IsOrthogonalTo(cbwm);
- if (IsMasonry(isOrthogonal ? GetOrthogonalAxis(aAxis) : aAxis)) {
+ if (IsMasonry(wm, aAxis)) {
// The child is in the container's masonry-axis.
// AlignJustifyTracksInMasonryAxis will stretch it, so we don't report that
// here.
diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp
@@ -6682,8 +6682,7 @@ nsIFrame::SizeComputationResult nsIFrame::ComputeSize(
bool mayUseAspectRatio = aspectRatio && !isAutoBSize;
if (!aFlags.contains(ComputeSizeFlag::ShrinkWrap) &&
!StyleMargin()->HasInlineAxisAuto(aWM, anchorResolutionParams) &&
- !alignCB->IsMasonry(isOrthogonal ? LogicalAxis::Block
- : LogicalAxis::Inline)) {
+ !alignCB->IsMasonry(aWM, LogicalAxis::Inline)) {
auto inlineAxisAlignment =
isOrthogonal ? StylePosition()->UsedAlignSelf(alignCB->Style())._0
: StylePosition()->UsedJustifySelf(alignCB->Style())._0;
@@ -6883,8 +6882,7 @@ nsIFrame::SizeComputationResult nsIFrame::ComputeSize(
} else if (MOZ_UNLIKELY(isGridItem) && styleBSize->IsAuto() &&
!aFlags.contains(ComputeSizeFlag::IsGridMeasuringReflow) &&
!IsTrueOverflowContainer() &&
- !alignCB->IsMasonry(isOrthogonal ? LogicalAxis::Inline
- : LogicalAxis::Block)) {
+ !alignCB->IsMasonry(aWM, LogicalAxis::Block)) {
auto cbSize = aCBSize.BSize(aWM);
if (cbSize != NS_UNCONSTRAINEDSIZE) {
// 'auto' block-size for grid-level box - fill the CB for 'stretch' /
diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h
@@ -4720,12 +4720,21 @@ class nsIFrame : public nsQueryFrame {
inline bool IsLegacyWebkitBox() const;
/**
- * Return true if this frame has masonry layout in aAxis.
+ * Return true if this frame has masonry layout in aAxis (in this frame's own
+ * writing mode).
* @note only valid to call on nsGridContainerFrames
*/
inline bool IsMasonry(mozilla::LogicalAxis aAxis) const;
/**
+ * Return true if this frame has masonry layout in aAxis (in the writing
+ * mode aWM).
+ * @note only valid to call on nsGridContainerFrames
+ */
+ inline bool IsMasonry(mozilla::WritingMode aWM,
+ mozilla::LogicalAxis aAxis) const;
+
+ /**
* @return true if this frame is used as a table caption.
*/
inline bool IsTableCaption() const;
diff --git a/layout/generic/nsIFrameInlines.h b/layout/generic/nsIFrameInlines.h
@@ -49,6 +49,17 @@ bool nsIFrame::IsMasonry(mozilla::LogicalAxis aAxis) const {
: NS_STATE_GRID_IS_COL_MASONRY);
}
+bool nsIFrame::IsMasonry(mozilla::WritingMode aWM,
+ mozilla::LogicalAxis aAxis) const {
+ MOZ_DIAGNOSTIC_ASSERT(IsGridContainerFrame());
+ const auto axisInOurWM = aWM.IsOrthogonalTo(GetWritingMode())
+ ? mozilla::GetOrthogonalAxis(aAxis)
+ : aAxis;
+ return HasAnyStateBits(axisInOurWM == mozilla::LogicalAxis::Block
+ ? NS_STATE_GRID_IS_ROW_MASONRY
+ : NS_STATE_GRID_IS_COL_MASONRY);
+}
+
bool nsIFrame::IsTableCaption() const {
return StyleDisplay()->mDisplay == mozilla::StyleDisplay::TableCaption &&
GetParent()->Style()->GetPseudoType() ==