зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1627125 Part 1 - Allow ReflowFlexItem to take available size as an input, and output reflow status. r=dholbert
Differential Revision: https://phabricator.services.mozilla.com/D69469
This commit is contained in:
Родитель
97ea0f945d
Коммит
474e6992c6
|
@ -758,8 +758,9 @@ struct ReflowInput : public SizeComputationInput {
|
|||
* @param aPresContext Must be equal to aFrame->PresContext().
|
||||
* @param aFrame The frame for whose reflow input is being constructed.
|
||||
* @param aRenderingContext The rendering context to be used for measurements.
|
||||
* @param aAvailableSpace See comments for availableHeight and availableWidth
|
||||
* members.
|
||||
* @param aAvailableSpace The available space to reflow aFrame (in aFrame's
|
||||
* writing-mode). See comments for mAvailableHeight and mAvailableWidth
|
||||
* members for more information.
|
||||
* @param aFlags A set of flags used for additional boolean parameters (see
|
||||
* below).
|
||||
*/
|
||||
|
@ -775,8 +776,9 @@ struct ReflowInput : public SizeComputationInput {
|
|||
* @param aParentReflowInput A reference to an ReflowInput object that
|
||||
* is to be the parent of this object.
|
||||
* @param aFrame The frame for whose reflow input is being constructed.
|
||||
* @param aAvailableSpace See comments for availableHeight and availableWidth
|
||||
* members.
|
||||
* @param aAvailableSpace The available space to reflow aFrame (in aFrame's
|
||||
* writing-mode). See comments for mAvailableHeight and mAvailableWidth
|
||||
* members for more information.
|
||||
* @param aContainingBlockSize An optional size, in app units, specifying
|
||||
* the containing block size to use instead of the default which is
|
||||
* computed by ComputeContainingBlockRectangle().
|
||||
|
|
|
@ -4856,8 +4856,25 @@ void nsFlexContainerFrame::ReflowChildren(
|
|||
// to clear out a -webkit-line-clamp ellipsis, we can just reposition it
|
||||
// as-needed.
|
||||
if (item.NeedsFinalReflow()) {
|
||||
ReflowFlexItem(aAxisTracker, aReflowInput, item, framePos,
|
||||
containerSize, aHasLineClampEllipsis);
|
||||
// The available size must be in item's writing-mode.
|
||||
const WritingMode itemWM = item.GetWritingMode();
|
||||
LogicalSize availableSize = aReflowInput.ComputedSize(itemWM);
|
||||
|
||||
// XXX: Unconditionally give our children unconstrained block-size until
|
||||
// we support flex item fragmentation.
|
||||
availableSize.BSize(itemWM) = NS_UNCONSTRAINEDSIZE;
|
||||
|
||||
const nsReflowStatus childReflowStatus =
|
||||
ReflowFlexItem(aAxisTracker, aReflowInput, item, framePos,
|
||||
availableSize, containerSize, aHasLineClampEllipsis);
|
||||
|
||||
// XXXdholbert Once we do pagination / splitting, we'll need to actually
|
||||
// handle incomplete childReflowStatuses. But for now, we give our kids
|
||||
// unconstrained available height, which means they should always
|
||||
// complete.
|
||||
MOZ_ASSERT(childReflowStatus.IsComplete(),
|
||||
"We gave flex item unconstrained available height, so it "
|
||||
"should be complete");
|
||||
} else {
|
||||
MoveFlexItemToFinalPosition(aReflowInput, item, framePos,
|
||||
containerSize);
|
||||
|
@ -5026,16 +5043,14 @@ void nsFlexContainerFrame::MoveFlexItemToFinalPosition(
|
|||
PositionChildViews(aItem.Frame());
|
||||
}
|
||||
|
||||
void nsFlexContainerFrame::ReflowFlexItem(
|
||||
nsReflowStatus nsFlexContainerFrame::ReflowFlexItem(
|
||||
const FlexboxAxisTracker& aAxisTracker, const ReflowInput& aReflowInput,
|
||||
const FlexItem& aItem, LogicalPoint& aFramePos,
|
||||
const nsSize& aContainerSize, bool aHasLineClampEllipsis) {
|
||||
const LogicalSize& aAvailableSize, const nsSize& aContainerSize,
|
||||
bool aHasLineClampEllipsis) {
|
||||
WritingMode outerWM = aReflowInput.GetWritingMode();
|
||||
WritingMode wm = aItem.Frame()->GetWritingMode();
|
||||
LogicalSize availSize = aReflowInput.ComputedSize(wm);
|
||||
availSize.BSize(wm) = NS_UNCONSTRAINEDSIZE;
|
||||
ReflowInput childReflowInput(PresContext(), aReflowInput, aItem.Frame(),
|
||||
availSize);
|
||||
aAvailableSize);
|
||||
childReflowInput.mFlags.mInsideLineClamp = GetLineClampValue() != 0;
|
||||
// This is the final reflow of this flex item; if we previously had a
|
||||
// -webkit-line-clamp, and we missed our chance to clear the ellipsis
|
||||
|
@ -5124,19 +5139,13 @@ void nsFlexContainerFrame::ReflowFlexItem(
|
|||
|
||||
// XXXdholbert Perhaps we should call CheckForInterrupt here; see bug 1495532.
|
||||
|
||||
// XXXdholbert Once we do pagination / splitting, we'll need to actually
|
||||
// handle incomplete childReflowStatuses. But for now, we give our kids
|
||||
// unconstrained available height, which means they should always
|
||||
// complete.
|
||||
MOZ_ASSERT(childReflowStatus.IsComplete(),
|
||||
"We gave flex item unconstrained available height, so it "
|
||||
"should be complete");
|
||||
|
||||
FinishReflowChild(aItem.Frame(), PresContext(), childReflowOutput,
|
||||
&childReflowInput, outerWM, aFramePos, aContainerSize,
|
||||
ReflowChildFlags::ApplyRelativePositioning);
|
||||
|
||||
aItem.SetAscent(childReflowOutput.BlockStartAscent());
|
||||
|
||||
return childReflowStatus;
|
||||
}
|
||||
|
||||
void nsFlexContainerFrame::ReflowPlaceholders(
|
||||
|
|
|
@ -502,13 +502,19 @@ class nsFlexContainerFrame final : public nsContainerFrame {
|
|||
* @param aItem The flex item to be reflowed.
|
||||
* @param aFramePos The position where the flex item's frame should
|
||||
* be placed. (pre-relative positioning)
|
||||
* @param aAvailableSize The available size to reflow the child frame (in the
|
||||
* child frame's writing-mode).
|
||||
* @param aContainerSize The flex container's size (required by some methods
|
||||
* that we call, to interpret aFramePos correctly).
|
||||
* @return the child frame's reflow status.
|
||||
*/
|
||||
void ReflowFlexItem(const FlexboxAxisTracker& aAxisTracker,
|
||||
const ReflowInput& aReflowInput, const FlexItem& aItem,
|
||||
mozilla::LogicalPoint& aFramePos,
|
||||
const nsSize& aContainerSize, bool aHasLineClampEllipsis);
|
||||
nsReflowStatus ReflowFlexItem(const FlexboxAxisTracker& aAxisTracker,
|
||||
const ReflowInput& aReflowInput,
|
||||
const FlexItem& aItem,
|
||||
mozilla::LogicalPoint& aFramePos,
|
||||
const mozilla::LogicalSize& aAvailableSize,
|
||||
const nsSize& aContainerSize,
|
||||
bool aHasLineClampEllipsis);
|
||||
|
||||
/**
|
||||
* Helper-function to perform a "dummy reflow" on all our nsPlaceholderFrame
|
||||
|
|
Загрузка…
Ссылка в новой задаче