Bug 1349320 part 1 - [css-grid] Calculate (and cache) an item's percentage basis to use for resolving transferred percentages in intrinsic sizing. r=dholbert

MozReview-Commit-ID: 7SsRRqM7Vbk
This commit is contained in:
Mats Palmgren 2017-05-11 02:33:14 +02:00
Родитель 02bf8c4425
Коммит 216858e554
1 изменённых файлов: 58 добавлений и 9 удалений

Просмотреть файл

@ -1847,6 +1847,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.
*/
@ -3501,14 +3513,15 @@ 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));
@ -3582,6 +3595,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
@ -3602,7 +3619,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);
@ -3620,7 +3641,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);
@ -3674,7 +3699,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));
@ -4488,7 +4517,8 @@ nsGridContainerFrame::Tracks::FindUsedFlexFraction(
const GridItemInfo& item = aGridItems[iter.ItemIndex()];
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;
@ -4819,6 +4849,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
{