mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-30 12:27:29 +09:00
CSS - Grid - intristic content with overflow:auto overlaps in grid
This commit is contained in:
parent
66276efa0a
commit
b9bbb5d201
18 changed files with 965 additions and 13 deletions
|
|
@ -93,6 +93,9 @@ ReflowInput::ReflowInput(nsPresContext* aPresContext,
|
|||
if (aFlags & B_CLAMP_MARGIN_BOX_MIN_SIZE) {
|
||||
mFlags.mBClampMarginBoxMinSize = true;
|
||||
}
|
||||
if (aFlags & I_APPLY_AUTO_MIN_SIZE) {
|
||||
mFlags.mApplyAutoMinSize = true;
|
||||
}
|
||||
|
||||
if (!(aFlags & CALLER_WILL_INIT)) {
|
||||
Init(aPresContext);
|
||||
|
|
@ -242,6 +245,7 @@ ReflowInput::ReflowInput(
|
|||
mFlags.mIOffsetsNeedCSSAlign = mFlags.mBOffsetsNeedCSSAlign = false;
|
||||
mFlags.mIClampMarginBoxMinSize = !!(aFlags & I_CLAMP_MARGIN_BOX_MIN_SIZE);
|
||||
mFlags.mBClampMarginBoxMinSize = !!(aFlags & B_CLAMP_MARGIN_BOX_MIN_SIZE);
|
||||
mFlags.mApplyAutoMinSize = !!(aFlags & I_APPLY_AUTO_MIN_SIZE);
|
||||
|
||||
mDiscoveredClearance = nullptr;
|
||||
mPercentBSizeObserver = (aParentReflowInput.mPercentBSizeObserver &&
|
||||
|
|
@ -1662,6 +1666,10 @@ ReflowInput::InitAbsoluteConstraints(nsPresContext* aPresContext,
|
|||
computeSizeFlags = ComputeSizeFlags(computeSizeFlags |
|
||||
ComputeSizeFlags::eBClampMarginBoxMinSize);
|
||||
}
|
||||
if (mFlags.mApplyAutoMinSize) {
|
||||
computeSizeFlags = ComputeSizeFlags(computeSizeFlags |
|
||||
ComputeSizeFlags::eIApplyAutoMinSize);
|
||||
}
|
||||
if (mFlags.mShrinkWrap) {
|
||||
computeSizeFlags =
|
||||
ComputeSizeFlags(computeSizeFlags | ComputeSizeFlags::eShrinkWrap);
|
||||
|
|
@ -2375,6 +2383,10 @@ ReflowInput::InitConstraints(nsPresContext* aPresContext,
|
|||
computeSizeFlags = ComputeSizeFlags(computeSizeFlags |
|
||||
ComputeSizeFlags::eBClampMarginBoxMinSize);
|
||||
}
|
||||
if (mFlags.mApplyAutoMinSize) {
|
||||
computeSizeFlags = ComputeSizeFlags(computeSizeFlags |
|
||||
ComputeSizeFlags::eIApplyAutoMinSize);
|
||||
}
|
||||
if (mFlags.mShrinkWrap) {
|
||||
computeSizeFlags =
|
||||
ComputeSizeFlags(computeSizeFlags | ComputeSizeFlags::eShrinkWrap);
|
||||
|
|
|
|||
|
|
@ -220,6 +220,7 @@ public:
|
|||
uint32_t mStaticPosIsCBOrigin:1; // the STATIC_POS_IS_CB_ORIGIN ctor flag
|
||||
uint32_t mIClampMarginBoxMinSize:1; // the I_CLAMP_MARGIN_BOX_MIN_SIZE ctor flag
|
||||
uint32_t mBClampMarginBoxMinSize:1; // the B_CLAMP_MARGIN_BOX_MIN_SIZE ctor flag
|
||||
uint32_t mApplyAutoMinSize : 1; // the I_APPLY_AUTO_MIN_SIZE ctor flag
|
||||
|
||||
// If set, the following two flags indicate that:
|
||||
// (1) this frame is absolutely-positioned (or fixed-positioned).
|
||||
|
|
@ -738,6 +739,9 @@ public:
|
|||
|
||||
// Pass ComputeSizeFlags::eBClampMarginBoxMinSize to ComputeSize().
|
||||
B_CLAMP_MARGIN_BOX_MIN_SIZE = (1<<6),
|
||||
|
||||
// Pass ComputeSizeFlags::eIApplyAutoMinSize to ComputeSize().
|
||||
I_APPLY_AUTO_MIN_SIZE = (1<<7),
|
||||
};
|
||||
|
||||
// This method initializes various data members. It is automatically
|
||||
|
|
|
|||
|
|
@ -4781,7 +4781,7 @@ nsFrame::ComputeSize(nsRenderingContext* aRenderingContext,
|
|||
ComputeISizeValue(aRenderingContext, aCBSize.ISize(aWM),
|
||||
boxSizingAdjust.ISize(aWM), boxSizingToMarginEdgeISize,
|
||||
minISizeCoord, aFlags);
|
||||
} else if (MOZ_UNLIKELY(isGridItem)) {
|
||||
} else if (MOZ_UNLIKELY(aFlags & eIApplyAutoMinSize)) {
|
||||
// This implements "Implied Minimum Size of Grid Items".
|
||||
// https://drafts.csswg.org/css-grid/#min-size-auto
|
||||
minISize = std::min(maxISize, GetMinISize(aRenderingContext));
|
||||
|
|
|
|||
|
|
@ -818,8 +818,11 @@ struct nsGridContainerFrame::GridItemInfo
|
|||
// Ditto *-content:[last ]baseline. Mutually exclusive w. eSelfBaseline.
|
||||
eContentBaseline = 0x10,
|
||||
eAllBaselineBits = eIsBaselineAligned | eSelfBaseline | eContentBaseline,
|
||||
// Should apply Automatic Minimum Size per:
|
||||
// https://drafts.csswg.org/css-grid/#min-size-auto
|
||||
eApplyAutoMinSize = 0x20,
|
||||
// Clamp per https://drafts.csswg.org/css-grid/#min-size-auto
|
||||
eClampMarginBoxMinSize = 0x20,
|
||||
eClampMarginBoxMinSize = 0x40,
|
||||
};
|
||||
|
||||
explicit GridItemInfo(nsIFrame* aFrame,
|
||||
|
|
@ -851,11 +854,11 @@ struct nsGridContainerFrame::GridItemInfo
|
|||
return aAlign;
|
||||
}
|
||||
|
||||
// Return true if we should we clamp this item's Automatic Minimum Size.
|
||||
// Return true if we should apply Automatic Minimum Size to this item.
|
||||
// https://drafts.csswg.org/css-grid/#min-size-auto
|
||||
bool ShouldClampMinSize(WritingMode aContainerWM,
|
||||
LogicalAxis aContainerAxis,
|
||||
nscoord aPercentageBasis) const
|
||||
bool ShouldApplyAutoMinSize(WritingMode aContainerWM,
|
||||
LogicalAxis aContainerAxis,
|
||||
nscoord aPercentageBasis) const
|
||||
{
|
||||
const auto pos = mFrame->StylePosition();
|
||||
const auto& size = aContainerAxis == eLogicalAxisInline ?
|
||||
|
|
@ -3977,9 +3980,9 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSizeStep1(
|
|||
WritingMode wm = aState.mWM;
|
||||
// Calculate data for "Automatic Minimum Size" clamping, if needed.
|
||||
bool needed = ((sz.mState & TrackSize::eIntrinsicMinSizing) ||
|
||||
aConstraint == SizingConstraint::eNoConstraint);
|
||||
if (needed && TrackSize::IsDefiniteMaxSizing(sz.mState) &&
|
||||
aGridItem.ShouldClampMinSize(wm, mAxis, aPercentageBasis)) {
|
||||
aConstraint == SizingConstraint::eNoConstraint) &&
|
||||
(aGridItem.mState[mAxis] & ItemState::eApplyAutoMinSize);
|
||||
if (needed && TrackSize::IsDefiniteMaxSizing(sz.mState)) {
|
||||
if (sz.mState & TrackSize::eIntrinsicMinSizing) {
|
||||
auto maxCoord = aFunctions.MaxSizingFor(aRange.mStart);
|
||||
cache.mMinSizeClamp =
|
||||
|
|
@ -4382,6 +4385,14 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
|
|||
iter.Reset();
|
||||
for (; !iter.AtEnd(); iter.Next()) {
|
||||
auto& gridItem = aGridItems[iter.GridItemIndex()];
|
||||
|
||||
// Check if we need to apply "Automatic Minimum Size" and cache it.
|
||||
MOZ_ASSERT(!(gridItem.mState[mAxis] & ItemState::eApplyAutoMinSize),
|
||||
"Why is eApplyAutoMinSize set already?");
|
||||
if (gridItem.ShouldApplyAutoMinSize(wm, mAxis, aPercentageBasis)) {
|
||||
gridItem.mState[mAxis] |= ItemState::eApplyAutoMinSize;
|
||||
}
|
||||
|
||||
const GridArea& area = gridItem.mArea;
|
||||
const LineRange& lineRange = area.*aRange;
|
||||
uint32_t span = lineRange.Extent();
|
||||
|
|
@ -4407,9 +4418,9 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
|
|||
CachedIntrinsicSizes cache;
|
||||
// Calculate data for "Automatic Minimum Size" clamping, if needed.
|
||||
bool needed = ((state & TrackSize::eIntrinsicMinSizing) ||
|
||||
aConstraint == SizingConstraint::eNoConstraint);
|
||||
if (needed && TrackSize::IsDefiniteMaxSizing(state) &&
|
||||
gridItem.ShouldClampMinSize(wm, mAxis, aPercentageBasis)) {
|
||||
aConstraint == SizingConstraint::eNoConstraint) &&
|
||||
(gridItem.mState[mAxis] & ItemState::eApplyAutoMinSize);
|
||||
if (needed && TrackSize::IsDefiniteMaxSizing(state)) {
|
||||
nscoord minSizeClamp = 0;
|
||||
for (auto i = lineRange.mStart, end = lineRange.mEnd; i < end; ++i) {
|
||||
auto maxCoord = aFunctions.MaxSizingFor(i);
|
||||
|
|
@ -4445,11 +4456,14 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
|
|||
gridItem.mState[mAxis] |= ItemState::eIsFlexing;
|
||||
} else if (aConstraint == SizingConstraint::eNoConstraint &&
|
||||
TrackSize::IsDefiniteMaxSizing(state) &&
|
||||
gridItem.ShouldClampMinSize(wm, mAxis, aPercentageBasis)) {
|
||||
(gridItem.mState[mAxis] & ItemState::eApplyAutoMinSize)) {
|
||||
gridItem.mState[mAxis] |= ItemState::eClampMarginBoxMinSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
MOZ_ASSERT(!(gridItem.mState[mAxis] & ItemState::eClampMarginBoxMinSize) ||
|
||||
(gridItem.mState[mAxis] & ItemState::eApplyAutoMinSize),
|
||||
"clamping only applies to Automatic Minimum Size");
|
||||
}
|
||||
|
||||
// Step 2.
|
||||
|
|
@ -5231,6 +5245,9 @@ nsGridContainerFrame::ReflowInFlowChild(nsIFrame* aChild,
|
|||
} else {
|
||||
aChild->Properties().Delete(BClampMarginBoxMinSizeProperty());
|
||||
}
|
||||
if ((aGridItemInfo->mState[childIAxis] & ItemState::eApplyAutoMinSize)) {
|
||||
flags |= ReflowInput::I_APPLY_AUTO_MIN_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isConstrainedBSize) {
|
||||
|
|
|
|||
|
|
@ -2105,6 +2105,14 @@ public:
|
|||
*/
|
||||
eIClampMarginBoxMinSize = 1 << 2, // clamp in our inline axis
|
||||
eBClampMarginBoxMinSize = 1 << 3, // clamp in our block axis
|
||||
/**
|
||||
* The frame is stretching (per CSS Box Alignment) and doesn't have an
|
||||
* Automatic Minimum Size in the indicated axis.
|
||||
* (may be used for both flex/grid items, but currently only used for Grid)
|
||||
* https://drafts.csswg.org/css-grid/#min-size-auto
|
||||
* https://drafts.csswg.org/css-align-3/#valdef-justify-self-stretch
|
||||
*/
|
||||
eIApplyAutoMinSize = 1 << 4, // only has an effect when eShrinkWrap is false
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue