mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-05 23:38:38 +09:00
CSS - Grid - transferred min-size contribution of percentage size grid item with an intrinsic ratio
This commit is contained in:
parent
b9bbb5d201
commit
8d256442ca
6 changed files with 199 additions and 31 deletions
|
|
@ -2092,6 +2092,18 @@ struct MOZ_STACK_CLASS nsGridContainerFrame::GridReflowInput
|
|||
LogicalSize& aContentBox,
|
||||
SizingConstraint aConstraint);
|
||||
|
||||
/**
|
||||
* Return the percentage basis for a grid item in its writing-mode.
|
||||
* If aAxis is eLogicalAxisInline then we return NS_UNCONSTRAINEDSIZE in
|
||||
* both axes since we know all track sizes are indefinite at this point
|
||||
* (we calculate column sizes before row sizes). Otherwise, assert that
|
||||
* column sizes are known and calculate the size for aGridItem.mArea.mCols
|
||||
* and use NS_UNCONSTRAINEDSIZE in the other axis.
|
||||
* @param aAxis the axis we're currently calculating track sizes for
|
||||
*/
|
||||
LogicalSize PercentageBasisFor(LogicalAxis aAxis,
|
||||
const GridItemInfo& aGridItem) const;
|
||||
|
||||
/**
|
||||
* Return the containing block for a grid item occupying aArea.
|
||||
*/
|
||||
|
|
@ -3734,18 +3746,20 @@ MeasuringReflow(nsIFrame* aChild,
|
|||
* the child's margin-box) in aAxis.
|
||||
*/
|
||||
static nscoord
|
||||
ContentContribution(const GridItemInfo& aGridItem,
|
||||
const GridReflowInput& aState,
|
||||
nsRenderingContext* aRC,
|
||||
WritingMode aCBWM,
|
||||
LogicalAxis aAxis,
|
||||
IntrinsicISizeType aConstraint,
|
||||
nscoord aMinSizeClamp = NS_MAXSIZE,
|
||||
uint32_t aFlags = 0)
|
||||
ContentContribution(const GridItemInfo& aGridItem,
|
||||
const GridReflowInput& aState,
|
||||
nsRenderingContext* aRC,
|
||||
WritingMode aCBWM,
|
||||
LogicalAxis aAxis,
|
||||
const Maybe<LogicalSize>& aPercentageBasis,
|
||||
IntrinsicISizeType aConstraint,
|
||||
nscoord aMinSizeClamp = NS_MAXSIZE,
|
||||
uint32_t aFlags = 0)
|
||||
{
|
||||
nsIFrame* child = aGridItem.mFrame;
|
||||
PhysicalAxis axis(aCBWM.PhysicalAxis(aAxis));
|
||||
nscoord size = nsLayoutUtils::IntrinsicForAxis(axis, aRC, child, aConstraint,
|
||||
aPercentageBasis,
|
||||
aFlags | nsLayoutUtils::BAIL_IF_REFLOW_NEEDED |
|
||||
nsLayoutUtils::ADD_PERCENTS,
|
||||
aMinSizeClamp);
|
||||
|
|
@ -3815,6 +3829,10 @@ struct CachedIntrinsicSizes
|
|||
Maybe<nscoord> mMinSize;
|
||||
Maybe<nscoord> mMinContentContribution;
|
||||
Maybe<nscoord> mMaxContentContribution;
|
||||
|
||||
// The item's percentage basis for intrinsic sizing purposes.
|
||||
Maybe<LogicalSize> mPercentageBasis;
|
||||
|
||||
// "if the grid item spans only grid tracks that have a fixed max track
|
||||
// sizing function, its automatic minimum size in that dimension is
|
||||
// further clamped to less than or equal to the size necessary to fit its
|
||||
|
|
@ -3835,7 +3853,11 @@ MinContentContribution(const GridItemInfo& aGridItem,
|
|||
if (aCache->mMinContentContribution.isSome()) {
|
||||
return aCache->mMinContentContribution.value();
|
||||
}
|
||||
if (aCache->mPercentageBasis.isNothing()) {
|
||||
aCache->mPercentageBasis.emplace(aState.PercentageBasisFor(aAxis, aGridItem));
|
||||
}
|
||||
nscoord s = ContentContribution(aGridItem, aState, aRC, aCBWM, aAxis,
|
||||
aCache->mPercentageBasis,
|
||||
nsLayoutUtils::MIN_ISIZE,
|
||||
aCache->mMinSizeClamp);
|
||||
aCache->mMinContentContribution.emplace(s);
|
||||
|
|
@ -3853,7 +3875,11 @@ MaxContentContribution(const GridItemInfo& aGridItem,
|
|||
if (aCache->mMaxContentContribution.isSome()) {
|
||||
return aCache->mMaxContentContribution.value();
|
||||
}
|
||||
if (aCache->mPercentageBasis.isNothing()) {
|
||||
aCache->mPercentageBasis.emplace(aState.PercentageBasisFor(aAxis, aGridItem));
|
||||
}
|
||||
nscoord s = ContentContribution(aGridItem, aState, aRC, aCBWM, aAxis,
|
||||
aCache->mPercentageBasis,
|
||||
nsLayoutUtils::PREF_ISIZE,
|
||||
aCache->mMinSizeClamp);
|
||||
aCache->mMaxContentContribution.emplace(s);
|
||||
|
|
@ -3907,7 +3933,11 @@ MinSize(const GridItemInfo& aGridItem,
|
|||
child->StyleDisplay()->mOverflowX == NS_STYLE_OVERFLOW_VISIBLE)) {
|
||||
// Now calculate the "content size" part and return whichever is smaller.
|
||||
MOZ_ASSERT(unit != eStyleUnit_Enumerated || sz == NS_UNCONSTRAINEDSIZE);
|
||||
if (aCache->mPercentageBasis.isNothing()) {
|
||||
aCache->mPercentageBasis.emplace(aState.PercentageBasisFor(aAxis, aGridItem));
|
||||
}
|
||||
sz = std::min(sz, ContentContribution(aGridItem, aState, aRC, aCBWM, aAxis,
|
||||
aCache->mPercentageBasis,
|
||||
nsLayoutUtils::MIN_ISIZE,
|
||||
aCache->mMinSizeClamp,
|
||||
nsLayoutUtils::MIN_INTRINSIC_ISIZE));
|
||||
|
|
@ -4721,7 +4751,8 @@ nsGridContainerFrame::Tracks::FindUsedFlexFraction(
|
|||
const GridItemInfo& item = aGridItems[iter.GridItemIndex()];
|
||||
if (item.mState[mAxis] & ItemState::eIsFlexing) {
|
||||
// XXX optimize: bug 1194446
|
||||
nscoord spaceToFill = ContentContribution(item, aState, rc, wm, mAxis,
|
||||
auto pb = Some(aState.PercentageBasisFor(mAxis, item));
|
||||
nscoord spaceToFill = ContentContribution(item, aState, rc, wm, mAxis, pb,
|
||||
nsLayoutUtils::PREF_ISIZE);
|
||||
if (spaceToFill <= 0) {
|
||||
continue;
|
||||
|
|
@ -5052,6 +5083,25 @@ nsGridContainerFrame::LineRange::ToPositionAndLengthForAbsPos(
|
|||
}
|
||||
}
|
||||
|
||||
LogicalSize
|
||||
nsGridContainerFrame::GridReflowInput::PercentageBasisFor(
|
||||
LogicalAxis aAxis,
|
||||
const GridItemInfo& aGridItem) const
|
||||
{
|
||||
auto wm = aGridItem.mFrame->GetWritingMode();
|
||||
if (aAxis == eLogicalAxisInline) {
|
||||
return LogicalSize(wm, NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE);
|
||||
}
|
||||
// Note: for now, we only resolve transferred percentages to row sizing.
|
||||
// We may need to adjust these assertions once we implement bug 1300366.
|
||||
MOZ_ASSERT(mCols.mCanResolveLineRangeSize);
|
||||
MOZ_ASSERT(!mRows.mCanResolveLineRangeSize);
|
||||
nscoord colSize = aGridItem.mArea.mCols.ToLength(mCols.mSizes);
|
||||
nscoord rowSize = NS_UNCONSTRAINEDSIZE;
|
||||
return !wm.IsOrthogonalTo(mWM) ?
|
||||
LogicalSize(wm, colSize, rowSize) : LogicalSize(wm, rowSize, colSize);
|
||||
}
|
||||
|
||||
LogicalRect
|
||||
nsGridContainerFrame::GridReflowInput::ContainingBlockFor(const GridArea& aArea) const
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue