Bug 1920160: Part 4 - Move CSSAlignmentForAbsPosChild to nsContainerFrame. r=jwatt,firefox-style-system-reviewers,emilio
Absolutely positioned elements can be aligned, so it no longer is grid-specific. Differential Revision: https://phabricator.services.mozilla.com/D226530
This commit is contained in:
@@ -2656,13 +2656,44 @@ StyleAlignFlags nsContainerFrame::CSSAlignmentForAbsPosChild(
|
|||||||
const ReflowInput& aChildRI, LogicalAxis aLogicalAxis) const {
|
const ReflowInput& aChildRI, LogicalAxis aLogicalAxis) const {
|
||||||
MOZ_ASSERT(aChildRI.mFrame->IsAbsolutelyPositioned(),
|
MOZ_ASSERT(aChildRI.mFrame->IsAbsolutelyPositioned(),
|
||||||
"This method should only be called for abspos children");
|
"This method should only be called for abspos children");
|
||||||
NS_ERROR(
|
StyleAlignFlags alignment =
|
||||||
"Child classes that use css box alignment for abspos children "
|
(aLogicalAxis == LogicalAxis::Inline)
|
||||||
"should provide their own implementation of this method!");
|
? aChildRI.mStylePosition->UsedJustifySelf(Style())._0
|
||||||
|
: aChildRI.mStylePosition->UsedAlignSelf(Style())._0;
|
||||||
|
|
||||||
// In the unexpected/unlikely event that this implementation gets invoked,
|
// Extract and strip the flag bits
|
||||||
// just use "start" alignment.
|
StyleAlignFlags alignmentFlags = alignment & StyleAlignFlags::FLAG_BITS;
|
||||||
return StyleAlignFlags::START;
|
alignment &= ~StyleAlignFlags::FLAG_BITS;
|
||||||
|
|
||||||
|
if (alignment == StyleAlignFlags::NORMAL) {
|
||||||
|
// "the 'normal' keyword behaves as 'start' on replaced
|
||||||
|
// absolutely-positioned boxes, and behaves as 'stretch' on all other
|
||||||
|
// absolutely-positioned boxes."
|
||||||
|
// https://drafts.csswg.org/css-align/#align-abspos
|
||||||
|
// https://drafts.csswg.org/css-align/#justify-abspos
|
||||||
|
alignment = aChildRI.mFrame->IsReplaced() ? StyleAlignFlags::START
|
||||||
|
: StyleAlignFlags::STRETCH;
|
||||||
|
} else if (alignment == StyleAlignFlags::FLEX_START) {
|
||||||
|
alignment = StyleAlignFlags::START;
|
||||||
|
} else if (alignment == StyleAlignFlags::FLEX_END) {
|
||||||
|
alignment = StyleAlignFlags::END;
|
||||||
|
} else if (alignment == StyleAlignFlags::LEFT ||
|
||||||
|
alignment == StyleAlignFlags::RIGHT) {
|
||||||
|
if (aLogicalAxis == LogicalAxis::Inline) {
|
||||||
|
const bool isLeft = (alignment == StyleAlignFlags::LEFT);
|
||||||
|
WritingMode wm = GetWritingMode();
|
||||||
|
alignment = (isLeft == wm.IsBidiLTR()) ? StyleAlignFlags::START
|
||||||
|
: StyleAlignFlags::END;
|
||||||
|
} else {
|
||||||
|
alignment = StyleAlignFlags::START;
|
||||||
|
}
|
||||||
|
} else if (alignment == StyleAlignFlags::BASELINE) {
|
||||||
|
alignment = StyleAlignFlags::START;
|
||||||
|
} else if (alignment == StyleAlignFlags::LAST_BASELINE) {
|
||||||
|
alignment = StyleAlignFlags::END;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (alignment | alignmentFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
nsOverflowContinuationTracker::nsOverflowContinuationTracker(
|
nsOverflowContinuationTracker::nsOverflowContinuationTracker(
|
||||||
|
|||||||
@@ -9751,51 +9751,6 @@ void nsGridContainerFrame::RemoveFrame(DestroyContext& aContext,
|
|||||||
nsContainerFrame::RemoveFrame(aContext, aListID, aOldFrame);
|
nsContainerFrame::RemoveFrame(aContext, aListID, aOldFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
StyleAlignFlags nsGridContainerFrame::CSSAlignmentForAbsPosChild(
|
|
||||||
const ReflowInput& aChildRI, LogicalAxis aLogicalAxis) const {
|
|
||||||
MOZ_ASSERT(aChildRI.mFrame->IsAbsolutelyPositioned(),
|
|
||||||
"This method should only be called for abspos children");
|
|
||||||
|
|
||||||
StyleAlignFlags alignment =
|
|
||||||
(aLogicalAxis == LogicalAxis::Inline)
|
|
||||||
? aChildRI.mStylePosition->UsedJustifySelf(Style())._0
|
|
||||||
: aChildRI.mStylePosition->UsedAlignSelf(Style())._0;
|
|
||||||
|
|
||||||
// Extract and strip the flag bits
|
|
||||||
StyleAlignFlags alignmentFlags = alignment & StyleAlignFlags::FLAG_BITS;
|
|
||||||
alignment &= ~StyleAlignFlags::FLAG_BITS;
|
|
||||||
|
|
||||||
if (alignment == StyleAlignFlags::NORMAL) {
|
|
||||||
// "the 'normal' keyword behaves as 'start' on replaced
|
|
||||||
// absolutely-positioned boxes, and behaves as 'stretch' on all other
|
|
||||||
// absolutely-positioned boxes."
|
|
||||||
// https://drafts.csswg.org/css-align/#align-abspos
|
|
||||||
// https://drafts.csswg.org/css-align/#justify-abspos
|
|
||||||
alignment = aChildRI.mFrame->IsReplaced() ? StyleAlignFlags::START
|
|
||||||
: StyleAlignFlags::STRETCH;
|
|
||||||
} else if (alignment == StyleAlignFlags::FLEX_START) {
|
|
||||||
alignment = StyleAlignFlags::START;
|
|
||||||
} else if (alignment == StyleAlignFlags::FLEX_END) {
|
|
||||||
alignment = StyleAlignFlags::END;
|
|
||||||
} else if (alignment == StyleAlignFlags::LEFT ||
|
|
||||||
alignment == StyleAlignFlags::RIGHT) {
|
|
||||||
if (aLogicalAxis == LogicalAxis::Inline) {
|
|
||||||
const bool isLeft = (alignment == StyleAlignFlags::LEFT);
|
|
||||||
WritingMode wm = GetWritingMode();
|
|
||||||
alignment = (isLeft == wm.IsBidiLTR()) ? StyleAlignFlags::START
|
|
||||||
: StyleAlignFlags::END;
|
|
||||||
} else {
|
|
||||||
alignment = StyleAlignFlags::START;
|
|
||||||
}
|
|
||||||
} else if (alignment == StyleAlignFlags::BASELINE) {
|
|
||||||
alignment = StyleAlignFlags::START;
|
|
||||||
} else if (alignment == StyleAlignFlags::LAST_BASELINE) {
|
|
||||||
alignment = StyleAlignFlags::END;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (alignment | alignmentFlags);
|
|
||||||
}
|
|
||||||
|
|
||||||
nscoord nsGridContainerFrame::SynthesizeBaseline(
|
nscoord nsGridContainerFrame::SynthesizeBaseline(
|
||||||
const FindItemInGridOrderResult& aGridOrderItem, LogicalAxis aAxis,
|
const FindItemInGridOrderResult& aGridOrderItem, LogicalAxis aAxis,
|
||||||
BaselineSharingGroup aGroup, const nsSize& aCBPhysicalSize, nscoord aCBSize,
|
BaselineSharingGroup aGroup, const nsSize& aCBPhysicalSize, nscoord aCBSize,
|
||||||
|
|||||||
@@ -149,8 +149,6 @@ class nsGridContainerFrame final : public nsContainerFrame,
|
|||||||
const nsLineList::iterator* aPrevFrameLine,
|
const nsLineList::iterator* aPrevFrameLine,
|
||||||
nsFrameList&& aFrameList) override;
|
nsFrameList&& aFrameList) override;
|
||||||
void RemoveFrame(DestroyContext&, ChildListID, nsIFrame*) override;
|
void RemoveFrame(DestroyContext&, ChildListID, nsIFrame*) override;
|
||||||
mozilla::StyleAlignFlags CSSAlignmentForAbsPosChild(
|
|
||||||
const ReflowInput& aChildRI, LogicalAxis aLogicalAxis) const override;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
void SetInitialChildList(ChildListID aListID,
|
void SetInitialChildList(ChildListID aListID,
|
||||||
|
|||||||
Reference in New Issue
Block a user