Bug 1958914: Treat AnchorResolved-using types as instantiations, not subtypes. r=layout-reviewers,emilio

Differential Revision: https://phabricator.services.mozilla.com/D244658
This commit is contained in:
David Shin
2025-04-08 02:29:19 +00:00
parent c6aa1be101
commit c291c3a105
9 changed files with 127 additions and 199 deletions

View File

@@ -4687,12 +4687,12 @@ nscoord nsLayoutUtils::IntrinsicForAxis(
: stylePos->GetMinHeight(positionProperty); : stylePos->GetMinHeight(positionProperty);
auto styleISize = [&]() { auto styleISize = [&]() {
if (aFlags & MIN_INTRINSIC_ISIZE) { if (aFlags & MIN_INTRINSIC_ISIZE) {
return AnchorResolvedSize::Overridden(*styleMinISize); return AnchorResolvedSizeHelper::Overridden(*styleMinISize);
} }
const Maybe<StyleSize>& styleISizeOverride = const Maybe<StyleSize>& styleISizeOverride =
isInlineAxis ? aSizeOverrides.mStyleISize : aSizeOverrides.mStyleBSize; isInlineAxis ? aSizeOverrides.mStyleISize : aSizeOverrides.mStyleBSize;
return styleISizeOverride return styleISizeOverride
? AnchorResolvedSize::Overridden(*styleISizeOverride) ? AnchorResolvedSizeHelper::Overridden(*styleISizeOverride)
: (horizontalAxis ? stylePos->GetWidth(positionProperty) : (horizontalAxis ? stylePos->GetWidth(positionProperty)
: stylePos->GetHeight(positionProperty)); : stylePos->GetHeight(positionProperty));
}(); }();
@@ -4707,13 +4707,13 @@ nscoord nsLayoutUtils::IntrinsicForAxis(
AnchorResolvedSize& aMinSize, AnchorResolvedSize& aMinSize,
AnchorResolvedMaxSize& aMaxSize) { AnchorResolvedMaxSize& aMaxSize) {
if (!aSize->IsLengthPercentage()) { if (!aSize->IsLengthPercentage()) {
aSize = AnchorResolvedSize::Auto(); aSize = AnchorResolvedSizeHelper::Auto();
} }
if (!aMinSize->IsLengthPercentage()) { if (!aMinSize->IsLengthPercentage()) {
aMinSize = AnchorResolvedSize::Auto(); aMinSize = AnchorResolvedSizeHelper::Auto();
} }
if (!aMaxSize->IsLengthPercentage()) { if (!aMaxSize->IsLengthPercentage()) {
aMaxSize = AnchorResolvedMaxSize::None(); aMaxSize = AnchorResolvedMaxSizeHelper::None();
} }
}; };
// According to the spec, max-content and min-content should behave as the // According to the spec, max-content and min-content should behave as the
@@ -4758,7 +4758,7 @@ nscoord nsLayoutUtils::IntrinsicForAxis(
isInlineAxis ? aSizeOverrides.mStyleBSize : aSizeOverrides.mStyleISize; isInlineAxis ? aSizeOverrides.mStyleBSize : aSizeOverrides.mStyleISize;
auto styleBSize = auto styleBSize =
styleBSizeOverride styleBSizeOverride
? AnchorResolvedSize::Overridden(*styleBSizeOverride) ? AnchorResolvedSizeHelper::Overridden(*styleBSizeOverride)
: (horizontalAxis ? stylePos->GetHeight(positionProperty) : (horizontalAxis ? stylePos->GetHeight(positionProperty)
: stylePos->GetWidth(positionProperty)); : stylePos->GetWidth(positionProperty));
auto styleMinBSize = horizontalAxis ? stylePos->GetMinHeight(positionProperty) auto styleMinBSize = horizontalAxis ? stylePos->GetMinHeight(positionProperty)
@@ -5071,10 +5071,10 @@ nscoord nsLayoutUtils::MinSizeContributionForAxis(
// if needed. // if needed.
if (aAxis != ourInlineAxis) { if (aAxis != ourInlineAxis) {
if (size->BehavesLikeInitialValueOnBlockAxis()) { if (size->BehavesLikeInitialValueOnBlockAxis()) {
size = AnchorResolvedSize::Auto(); size = AnchorResolvedSizeHelper::Auto();
} }
if (maxSize->BehavesLikeInitialValueOnBlockAxis()) { if (maxSize->BehavesLikeInitialValueOnBlockAxis()) {
maxSize = AnchorResolvedMaxSize::None(); maxSize = AnchorResolvedMaxSizeHelper::None();
} }
} }
@@ -5092,7 +5092,7 @@ nscoord nsLayoutUtils::MinSizeContributionForAxis(
// values in block axis. // values in block axis.
if (aAxis != ourInlineAxis && if (aAxis != ourInlineAxis &&
size->BehavesLikeInitialValueOnBlockAxis()) { size->BehavesLikeInitialValueOnBlockAxis()) {
size = AnchorResolvedSize::Auto(); size = AnchorResolvedSizeHelper::Auto();
} }
fixedMinSize = GetAbsoluteSize(*size); fixedMinSize = GetAbsoluteSize(*size);

View File

@@ -2131,11 +2131,6 @@ inline bool StyleMaxSize::BehavesLikeInitialValue(LogicalAxis aAxis) const {
// Definitions of inline methods for nsStylePosition, declared in // Definitions of inline methods for nsStylePosition, declared in
// nsStyleStruct.h but not defined there because they need WritingMode. // nsStyleStruct.h but not defined there because they need WritingMode.
inline AnchorResolvedInset::AnchorResolvedInset(
const mozilla::StyleInset& aValue, mozilla::LogicalAxis aAxis,
mozilla::WritingMode aWM, mozilla::StylePositionProperty aPosition)
: AnchorResolved<mozilla::StyleInset>{FromUnresolved(
aValue, ToStylePhysicalAxis(aWM.PhysicalAxis(aAxis)), aPosition)} {}
inline AnchorResolvedInset nsStylePosition::GetAnchorResolvedInset( inline AnchorResolvedInset nsStylePosition::GetAnchorResolvedInset(
mozilla::LogicalSide aSide, WritingMode aWM, mozilla::LogicalSide aSide, WritingMode aWM,

View File

@@ -2207,14 +2207,14 @@ LogicalSize nsContainerFrame::ComputeSizeWithIntrinsicDimensions(
const auto positionProperty = StyleDisplay()->mPosition; const auto positionProperty = StyleDisplay()->mPosition;
const auto styleISize = const auto styleISize =
aSizeOverrides.mStyleISize aSizeOverrides.mStyleISize
? AnchorResolvedSize::Overridden(*aSizeOverrides.mStyleISize) ? AnchorResolvedSizeHelper::Overridden(*aSizeOverrides.mStyleISize)
: stylePos->ISize(aWM, positionProperty); : stylePos->ISize(aWM, positionProperty);
// TODO(dholbert): if styleBSize is 'stretch' here, we should probably // TODO(dholbert): if styleBSize is 'stretch' here, we should probably
// resolve it like we do in nsIFrame::ComputeSize. See bug 1937275. // resolve it like we do in nsIFrame::ComputeSize. See bug 1937275.
const auto styleBSize = const auto styleBSize =
aSizeOverrides.mStyleBSize aSizeOverrides.mStyleBSize
? AnchorResolvedSize::Overridden(*aSizeOverrides.mStyleBSize) ? AnchorResolvedSizeHelper::Overridden(*aSizeOverrides.mStyleBSize)
: stylePos->BSize(aWM, positionProperty); : stylePos->BSize(aWM, positionProperty);
const auto& aspectRatio = const auto& aspectRatio =
aSizeOverrides.mAspectRatio ? *aSizeOverrides.mAspectRatio : aAspectRatio; aSizeOverrides.mAspectRatio ? *aSizeOverrides.mAspectRatio : aAspectRatio;

View File

@@ -338,7 +338,7 @@ struct RepeatTrackSizingInput {
// When computing the intrinsic inline size, disregard the explicit // When computing the intrinsic inline size, disregard the explicit
// inline-size property as it should not affect the final result. // inline-size property as it should not affect the final result.
const auto styleSize = aAxis == LogicalAxis::Inline const auto styleSize = aAxis == LogicalAxis::Inline
? AnchorResolvedSize::Auto() ? AnchorResolvedSizeHelper::Auto()
: pos->BSize(aWM, positionProperty); : pos->BSize(aWM, positionProperty);
if (styleSize->ConvertsToLength()) { if (styleSize->ConvertsToLength()) {
size = std::clamp(adjustForBoxSizing(styleSize->ToLength()), min, max); size = std::clamp(adjustForBoxSizing(styleSize->ToLength()), min, max);

View File

@@ -6473,7 +6473,7 @@ nsIFrame::SizeComputationResult nsIFrame::ComputeSize(
: GetAspectRatio(); : GetAspectRatio();
const auto styleISize = const auto styleISize =
aSizeOverrides.mStyleISize aSizeOverrides.mStyleISize
? AnchorResolvedSize::Overridden(*aSizeOverrides.mStyleISize) ? AnchorResolvedSizeHelper::Overridden(*aSizeOverrides.mStyleISize)
: stylePos->ISize(aWM, positionProperty); : stylePos->ISize(aWM, positionProperty);
// For bsize, we consider overrides *and then* we resolve 'stretch' to a // For bsize, we consider overrides *and then* we resolve 'stretch' to a
// nscoord value, for convenience (so that we can assume that either // nscoord value, for convenience (so that we can assume that either
@@ -6481,7 +6481,7 @@ nsIFrame::SizeComputationResult nsIFrame::ComputeSize(
const auto styleBSize = [&] { const auto styleBSize = [&] {
auto styleBSizeConsideringOverrides = auto styleBSizeConsideringOverrides =
(aSizeOverrides.mStyleBSize) (aSizeOverrides.mStyleBSize)
? AnchorResolvedSize::Overridden(*aSizeOverrides.mStyleBSize) ? AnchorResolvedSizeHelper::Overridden(*aSizeOverrides.mStyleBSize)
: stylePos->BSize(aWM, positionProperty); : stylePos->BSize(aWM, positionProperty);
if (styleBSizeConsideringOverrides->BehavesLikeStretchOnBlockAxis() && if (styleBSizeConsideringOverrides->BehavesLikeStretchOnBlockAxis() &&
aCBSize.BSize(aWM) != NS_UNCONSTRAINEDSIZE) { aCBSize.BSize(aWM) != NS_UNCONSTRAINEDSIZE) {
@@ -6489,7 +6489,7 @@ nsIFrame::SizeComputationResult nsIFrame::ComputeSize(
nscoord stretchBSize = nsLayoutUtils::ComputeStretchBSize( nscoord stretchBSize = nsLayoutUtils::ComputeStretchBSize(
aCBSize.BSize(aWM), aMargin.BSize(aWM), aBorderPadding.BSize(aWM), aCBSize.BSize(aWM), aMargin.BSize(aWM), aBorderPadding.BSize(aWM),
stylePos->mBoxSizing); stylePos->mBoxSizing);
return AnchorResolvedSize::LengthPercentage( return AnchorResolvedSizeHelper::LengthPercentage(
LengthPercentage::FromAppUnits(stretchBSize)); LengthPercentage::FromAppUnits(stretchBSize));
} }
return styleBSizeConsideringOverrides; return styleBSizeConsideringOverrides;
@@ -6928,7 +6928,7 @@ LogicalSize nsIFrame::ComputeAutoSize(
// don't bother setting it if the result won't be used // don't bother setting it if the result won't be used
const auto styleISize = const auto styleISize =
aSizeOverrides.mStyleISize aSizeOverrides.mStyleISize
? AnchorResolvedSize::Overridden(*aSizeOverrides.mStyleISize) ? AnchorResolvedSizeHelper::Overridden(*aSizeOverrides.mStyleISize)
: StylePosition()->ISize(aWM, positionProperty); : StylePosition()->ISize(aWM, positionProperty);
if (styleISize->IsAuto()) { if (styleISize->IsAuto()) {
nscoord availBased = nsLayoutUtils::ComputeStretchContentBoxISize( nscoord availBased = nsLayoutUtils::ComputeStretchContentBoxISize(
@@ -6936,7 +6936,7 @@ LogicalSize nsIFrame::ComputeAutoSize(
const auto* stylePos = StylePosition(); const auto* stylePos = StylePosition();
const auto styleBSize = const auto styleBSize =
aSizeOverrides.mStyleBSize aSizeOverrides.mStyleBSize
? AnchorResolvedSize::Overridden(*aSizeOverrides.mStyleBSize) ? AnchorResolvedSizeHelper::Overridden(*aSizeOverrides.mStyleBSize)
: stylePos->BSize(aWM, positionProperty); : stylePos->BSize(aWM, positionProperty);
const LogicalSize contentEdgeToBoxSizing = const LogicalSize contentEdgeToBoxSizing =
stylePos->mBoxSizing == StyleBoxSizing::Border ? aBorderPadding stylePos->mBoxSizing == StyleBoxSizing::Border ? aBorderPadding
@@ -6981,11 +6981,11 @@ LogicalSize nsIFrame::ComputeAbsolutePosAutoSize(
const auto positionProperty = StyleDisplay()->mPosition; const auto positionProperty = StyleDisplay()->mPosition;
const auto& styleISize = const auto& styleISize =
aSizeOverrides.mStyleISize aSizeOverrides.mStyleISize
? AnchorResolvedSize::Overridden(*aSizeOverrides.mStyleISize) ? AnchorResolvedSizeHelper::Overridden(*aSizeOverrides.mStyleISize)
: stylePos->ISize(aWM, positionProperty); : stylePos->ISize(aWM, positionProperty);
const auto& styleBSize = const auto& styleBSize =
aSizeOverrides.mStyleBSize aSizeOverrides.mStyleBSize
? AnchorResolvedSize::Overridden(*aSizeOverrides.mStyleBSize) ? AnchorResolvedSizeHelper::Overridden(*aSizeOverrides.mStyleBSize)
: stylePos->BSize(aWM, positionProperty); : stylePos->BSize(aWM, positionProperty);
const auto iStartOffsetIsAuto = const auto iStartOffsetIsAuto =
stylePos stylePos

View File

@@ -1844,7 +1844,7 @@ already_AddRefed<CSSValue> nsComputedDOMStyle::DoGetMinHeight() {
if (minHeight->IsAuto() && if (minHeight->IsAuto() &&
!ShouldHonorMinSizeAutoInAxis(PhysicalAxis::Vertical)) { !ShouldHonorMinSizeAutoInAxis(PhysicalAxis::Vertical)) {
minHeight = AnchorResolvedSize::Zero(); minHeight = AnchorResolvedSizeHelper::Zero();
} }
SetValueToSize(val, minHeight); SetValueToSize(val, minHeight);
@@ -1858,7 +1858,7 @@ already_AddRefed<CSSValue> nsComputedDOMStyle::DoGetMinWidth() {
if (minWidth->IsAuto() && if (minWidth->IsAuto() &&
!ShouldHonorMinSizeAutoInAxis(PhysicalAxis::Horizontal)) { !ShouldHonorMinSizeAutoInAxis(PhysicalAxis::Horizontal)) {
minWidth = AnchorResolvedSize::Zero(); minWidth = AnchorResolvedSizeHelper::Zero();
} }
SetValueToSize(val, minWidth); SetValueToSize(val, minWidth);

View File

@@ -286,9 +286,8 @@ static StyleRect<T> StyleRectWithAllSides(const T& aSide) {
return {aSide, aSide, aSide, aSide}; return {aSide, aSide, aSide, aSide};
} }
AnchorResolved<mozilla::StyleMargin> AnchorResolvedMargin::ResolveAnchor( AnchorResolvedMargin AnchorResolvedMarginHelper::ResolveAnchor(
const mozilla::StyleMargin& aValue, const StyleMargin& aValue, StylePositionProperty aPosition) {
mozilla::StylePositionProperty aPosition) {
MOZ_ASSERT(aValue.HasAnchorPositioningFunction(), MOZ_ASSERT(aValue.HasAnchorPositioningFunction(),
"Calling anchor resolution without using it?"); "Calling anchor resolution without using it?");
if (aValue.IsAnchorSizeFunction()) { if (aValue.IsAnchorSizeFunction()) {
@@ -296,12 +295,15 @@ AnchorResolved<mozilla::StyleMargin> AnchorResolvedMargin::ResolveAnchor(
Servo_ResolveAnchorSizeFunction(&*aValue.AsAnchorSizeFunction(), aPosition, Servo_ResolveAnchorSizeFunction(&*aValue.AsAnchorSizeFunction(), aPosition,
&resolved); &resolved);
if (resolved.IsInvalid()) { if (resolved.IsInvalid()) {
return Invalid(); return AnchorResolvedMargin::Evaluated(
StyleMargin::LengthPercentage(StyleLengthPercentage::Zero()));
} }
if (resolved.IsResolvedReference()) { if (resolved.IsResolvedReference()) {
return Evaluated(*resolved.AsResolvedReference()); return AnchorResolvedMargin::Evaluated(
StyleMargin::LengthPercentage(*resolved.AsResolvedReference()));
} }
return Evaluated(resolved.AsResolved()); return AnchorResolvedMargin::Evaluated(
StyleMargin::LengthPercentage(resolved.AsResolved()));
} }
const auto& lp = aValue.AsAnchorContainingCalcFunction(); const auto& lp = aValue.AsAnchorContainingCalcFunction();
@@ -309,9 +311,11 @@ AnchorResolved<mozilla::StyleMargin> AnchorResolvedMargin::ResolveAnchor(
auto result = StyleCalcAnchorPositioningFunctionResolution::Invalid(); auto result = StyleCalcAnchorPositioningFunctionResolution::Invalid();
Servo_ResolveAnchorFunctionsInCalcPercentage(&c, nullptr, aPosition, &result); Servo_ResolveAnchorFunctionsInCalcPercentage(&c, nullptr, aPosition, &result);
if (result.IsInvalid()) { if (result.IsInvalid()) {
return Invalid(); return AnchorResolvedMargin::Evaluated(
StyleMargin::LengthPercentage(StyleLengthPercentage::Zero()));
} }
return Evaluated(result.AsValid()); return AnchorResolvedMargin::Evaluated(
StyleMargin::LengthPercentage(result.AsValid()));
} }
nsStyleMargin::nsStyleMargin() nsStyleMargin::nsStyleMargin()
@@ -1363,10 +1367,9 @@ StyleJustifySelf nsStylePosition::UsedJustifySelf(
return {StyleAlignFlags::NORMAL}; return {StyleAlignFlags::NORMAL};
} }
AnchorResolved<mozilla::StyleInset> AnchorResolvedInset::ResolveAnchor( AnchorResolvedInset AnchorResolvedInsetHelper::ResolveAnchor(
const mozilla::StyleInset& aValue, mozilla::StylePhysicalAxis aAxis, const mozilla::StyleInset& aValue, mozilla::StylePhysicalAxis aAxis,
mozilla::StylePositionProperty aPosition) { mozilla::StylePositionProperty aPosition) {
// TODO(dshin): Maybe worth pref-gating here.
static_assert(static_cast<uint8_t>(mozilla::PhysicalAxis::Vertical) == static_assert(static_cast<uint8_t>(mozilla::PhysicalAxis::Vertical) ==
static_cast<uint8_t>(StylePhysicalAxis::Vertical), static_cast<uint8_t>(StylePhysicalAxis::Vertical),
"Vertical axis doesn't match"); "Vertical axis doesn't match");
@@ -1383,41 +1386,46 @@ AnchorResolved<mozilla::StyleInset> AnchorResolvedInset::ResolveAnchor(
Servo_ResolveAnchorFunctionsInCalcPercentage(&c, &aAxis, aPosition, Servo_ResolveAnchorFunctionsInCalcPercentage(&c, &aAxis, aPosition,
&result); &result);
if (result.IsInvalid()) { if (result.IsInvalid()) {
return Invalid(); return AnchorResolvedInset::Evaluated(StyleInset::Auto());
} }
return Evaluated(result.AsValid()); return AnchorResolvedInset::Evaluated(
StyleInset::LengthPercentage(result.AsValid()));
} }
case StyleInset::Tag::AnchorFunction: { case StyleInset::Tag::AnchorFunction: {
auto resolved = StyleAnchorPositioningFunctionResolution::Invalid(); auto resolved = StyleAnchorPositioningFunctionResolution::Invalid();
Servo_ResolveAnchorFunction(&*aValue.AsAnchorFunction(), aAxis, aPosition, Servo_ResolveAnchorFunction(&*aValue.AsAnchorFunction(), aAxis, aPosition,
&resolved); &resolved);
if (resolved.IsInvalid()) { if (resolved.IsInvalid()) {
return Invalid(); return AnchorResolvedInset::Evaluated(StyleInset::Auto());
} }
if (resolved.IsResolvedReference()) { if (resolved.IsResolvedReference()) {
return Evaluated(*resolved.AsResolvedReference()); return AnchorResolvedInset::Evaluated(
StyleInset::LengthPercentage(*resolved.AsResolvedReference()));
} }
return Evaluated(resolved.AsResolved()); return AnchorResolvedInset::Evaluated(
StyleInset::LengthPercentage(resolved.AsResolved()));
} }
case StyleInset::Tag::AnchorSizeFunction: { case StyleInset::Tag::AnchorSizeFunction: {
auto resolved = StyleAnchorPositioningFunctionResolution::Invalid(); auto resolved = StyleAnchorPositioningFunctionResolution::Invalid();
Servo_ResolveAnchorSizeFunction(&*aValue.AsAnchorSizeFunction(), Servo_ResolveAnchorSizeFunction(&*aValue.AsAnchorSizeFunction(),
aPosition, &resolved); aPosition, &resolved);
if (resolved.IsInvalid()) { if (resolved.IsInvalid()) {
return Invalid(); return AnchorResolvedInset::Evaluated(StyleInset::Auto());
} }
if (resolved.IsResolvedReference()) { if (resolved.IsResolvedReference()) {
return Evaluated(*resolved.AsResolvedReference()); return AnchorResolvedInset::Evaluated(
StyleInset::LengthPercentage(*resolved.AsResolvedReference()));
} }
return Evaluated(resolved.AsResolved()); return AnchorResolvedInset::Evaluated(
StyleInset::LengthPercentage(resolved.AsResolved()));
} }
default: default:
MOZ_ASSERT_UNREACHABLE("Unhandled inset type"); MOZ_ASSERT_UNREACHABLE("Unhandled inset type");
return Invalid(); return AnchorResolvedInset::Evaluated(StyleInset::Auto());
} }
} }
AnchorResolved<mozilla::StyleSize> AnchorResolvedSize::ResolveAnchor( AnchorResolvedSize AnchorResolvedSizeHelper::ResolveAnchor(
const mozilla::StyleSize& aValue, const mozilla::StyleSize& aValue,
mozilla::StylePositionProperty aPosition) { mozilla::StylePositionProperty aPosition) {
MOZ_ASSERT(aValue.HasAnchorPositioningFunction(), MOZ_ASSERT(aValue.HasAnchorPositioningFunction(),
@@ -1427,12 +1435,14 @@ AnchorResolved<mozilla::StyleSize> AnchorResolvedSize::ResolveAnchor(
Servo_ResolveAnchorSizeFunction(&*aValue.AsAnchorSizeFunction(), aPosition, Servo_ResolveAnchorSizeFunction(&*aValue.AsAnchorSizeFunction(), aPosition,
&resolved); &resolved);
if (resolved.IsInvalid()) { if (resolved.IsInvalid()) {
return Invalid(); return AnchorResolvedSize::Evaluated(StyleSize::Auto());
} }
if (resolved.IsResolvedReference()) { if (resolved.IsResolvedReference()) {
return Evaluated(*resolved.AsResolvedReference()); return AnchorResolvedSize::Evaluated(
StyleSize::LengthPercentage(*resolved.AsResolvedReference()));
} }
return Evaluated(resolved.AsResolved()); return AnchorResolvedSize::Evaluated(
StyleSize::LengthPercentage(resolved.AsResolved()));
} }
const auto& lp = aValue.AsAnchorContainingCalcFunction(); const auto& lp = aValue.AsAnchorContainingCalcFunction();
@@ -1441,12 +1451,13 @@ AnchorResolved<mozilla::StyleSize> AnchorResolvedSize::ResolveAnchor(
auto result = StyleCalcAnchorPositioningFunctionResolution::Invalid(); auto result = StyleCalcAnchorPositioningFunctionResolution::Invalid();
Servo_ResolveAnchorFunctionsInCalcPercentage(&c, nullptr, aPosition, &result); Servo_ResolveAnchorFunctionsInCalcPercentage(&c, nullptr, aPosition, &result);
if (result.IsInvalid()) { if (result.IsInvalid()) {
return Invalid(); return AnchorResolvedSize::Evaluated(StyleSize::Auto());
} }
return Evaluated(result.AsValid()); return AnchorResolvedSize::Evaluated(
StyleSize::LengthPercentage(result.AsValid()));
} }
AnchorResolved<mozilla::StyleMaxSize> AnchorResolvedMaxSize::ResolveAnchor( AnchorResolvedMaxSize AnchorResolvedMaxSizeHelper::ResolveAnchor(
const mozilla::StyleMaxSize& aValue, const mozilla::StyleMaxSize& aValue,
mozilla::StylePositionProperty aPosition) { mozilla::StylePositionProperty aPosition) {
MOZ_ASSERT(aValue.HasAnchorPositioningFunction(), MOZ_ASSERT(aValue.HasAnchorPositioningFunction(),
@@ -1456,12 +1467,14 @@ AnchorResolved<mozilla::StyleMaxSize> AnchorResolvedMaxSize::ResolveAnchor(
Servo_ResolveAnchorSizeFunction(&*aValue.AsAnchorSizeFunction(), aPosition, Servo_ResolveAnchorSizeFunction(&*aValue.AsAnchorSizeFunction(), aPosition,
&resolved); &resolved);
if (resolved.IsInvalid()) { if (resolved.IsInvalid()) {
return Invalid(); return AnchorResolvedMaxSize::Evaluated(StyleMaxSize::None());
} }
if (resolved.IsResolvedReference()) { if (resolved.IsResolvedReference()) {
return Evaluated(*resolved.AsResolvedReference()); return AnchorResolvedMaxSize::Evaluated(
StyleMaxSize::LengthPercentage(*resolved.AsResolvedReference()));
} }
return Evaluated(resolved.AsResolved()); return AnchorResolvedMaxSize::Evaluated(
StyleMaxSize::LengthPercentage(resolved.AsResolved()));
} }
const auto& lp = aValue.AsAnchorContainingCalcFunction(); const auto& lp = aValue.AsAnchorContainingCalcFunction();
@@ -1470,9 +1483,10 @@ AnchorResolved<mozilla::StyleMaxSize> AnchorResolvedMaxSize::ResolveAnchor(
auto result = StyleCalcAnchorPositioningFunctionResolution::Invalid(); auto result = StyleCalcAnchorPositioningFunctionResolution::Invalid();
Servo_ResolveAnchorFunctionsInCalcPercentage(&c, nullptr, aPosition, &result); Servo_ResolveAnchorFunctionsInCalcPercentage(&c, nullptr, aPosition, &result);
if (result.IsInvalid()) { if (result.IsInvalid()) {
return Invalid(); return AnchorResolvedMaxSize::Evaluated(StyleMaxSize::None());
} }
return Evaluated(result.AsValid()); return AnchorResolvedMaxSize::Evaluated(
StyleMaxSize::LengthPercentage(result.AsValid()));
} }
// -------------------- // --------------------

View File

@@ -428,7 +428,6 @@ class AnchorResolved {
AnchorResolved(const AnchorResolved& aOther) = delete; AnchorResolved(const AnchorResolved& aOther) = delete;
AnchorResolved& operator=(const AnchorResolved& aOther) = delete; AnchorResolved& operator=(const AnchorResolved& aOther) = delete;
protected:
static AnchorResolved Evaluated(T&& aValue) { static AnchorResolved Evaluated(T&& aValue) {
AnchorResolved result; AnchorResolved result;
result.mIsValue = true; result.mIsValue = true;
@@ -457,38 +456,22 @@ class AnchorResolved {
}; };
}; };
class AnchorResolvedMargin final : public AnchorResolved<mozilla::StyleMargin> { using AnchorResolvedMargin = AnchorResolved<mozilla::StyleMargin>;
public:
AnchorResolvedMargin(const mozilla::StyleMargin& aValue,
mozilla::StylePositionProperty aPosition)
: AnchorResolved{FromUnresolved(aValue, aPosition)} {}
private: struct AnchorResolvedMarginHelper {
static AnchorResolved<mozilla::StyleMargin> FromUnresolved( static AnchorResolvedMargin FromUnresolved(
const mozilla::StyleMargin& aValue, const mozilla::StyleMargin& aValue,
mozilla::StylePositionProperty aPosition) { mozilla::StylePositionProperty aPosition) {
if (!aValue.HasAnchorPositioningFunction()) { if (!aValue.HasAnchorPositioningFunction()) {
return Unchanged(aValue); return AnchorResolvedMargin::Unchanged(aValue);
} }
return ResolveAnchor(aValue, aPosition); return ResolveAnchor(aValue, aPosition);
} }
static AnchorResolved<mozilla::StyleMargin> ResolveAnchor(
private:
static AnchorResolvedMargin ResolveAnchor(
const mozilla::StyleMargin& aValue, const mozilla::StyleMargin& aValue,
mozilla::StylePositionProperty aPosition); mozilla::StylePositionProperty aPosition);
static AnchorResolved<mozilla::StyleMargin> Invalid() {
return AnchorResolved::Evaluated(mozilla::StyleMargin::LengthPercentage(
mozilla::StyleLengthPercentage::Zero()));
}
static AnchorResolved<mozilla::StyleMargin> Evaluated(
mozilla::StyleLengthPercentage&& aLP) {
return AnchorResolved::Evaluated(
mozilla::StyleMargin::LengthPercentage(aLP));
}
static AnchorResolved<mozilla::StyleMargin> Evaluated(
const mozilla::StyleLengthPercentage& aLP) {
return AnchorResolved::Evaluated(
mozilla::StyleMargin::LengthPercentage(aLP));
}
}; };
struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleMargin { struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleMargin {
@@ -533,7 +516,8 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleMargin {
// a later point. // a later point.
AnchorResolvedMargin GetMargin( AnchorResolvedMargin GetMargin(
mozilla::Side aSide, mozilla::StylePositionProperty aPosition) const { mozilla::Side aSide, mozilla::StylePositionProperty aPosition) const {
return {mMargin.Get(aSide), aPosition}; return AnchorResolvedMarginHelper::FromUnresolved(mMargin.Get(aSide),
aPosition);
} }
bool MarginEquals(const nsStyleMargin& aOther) const { bool MarginEquals(const nsStyleMargin& aOther) const {
@@ -825,155 +809,89 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStylePage {
StylePageOrientation mPageOrientation = StylePageOrientation::Upright; StylePageOrientation mPageOrientation = StylePageOrientation::Upright;
}; };
class AnchorResolvedInset final : public AnchorResolved<mozilla::StyleInset> { using AnchorResolvedInset = AnchorResolved<mozilla::StyleInset>;
public:
AnchorResolvedInset(const mozilla::StyleInset& aValue,
mozilla::StylePhysicalAxis aAxis,
mozilla::StylePositionProperty aPosition)
: AnchorResolved<mozilla::StyleInset>{
FromUnresolved(aValue, aAxis, aPosition)} {}
inline AnchorResolvedInset(const mozilla::StyleInset& aValue,
mozilla::LogicalAxis aAxis,
mozilla::WritingMode aWM,
mozilla::StylePositionProperty aPosition);
private: struct AnchorResolvedInsetHelper {
static AnchorResolved<mozilla::StyleInset> FromUnresolved( static AnchorResolvedInset FromUnresolved(
const mozilla::StyleInset& aValue, mozilla::StylePhysicalAxis aAxis, const mozilla::StyleInset& aValue, mozilla::StylePhysicalAxis aAxis,
mozilla::StylePositionProperty aPosition) { mozilla::StylePositionProperty aPosition) {
if (!aValue.HasAnchorPositioningFunction()) { if (!aValue.HasAnchorPositioningFunction()) {
return AnchorResolved::Unchanged(aValue); return AnchorResolvedInset::Unchanged(aValue);
} }
return ResolveAnchor(aValue, aAxis, aPosition); return ResolveAnchor(aValue, aAxis, aPosition);
} }
static AnchorResolved<mozilla::StyleInset> ResolveAnchor(
private:
static AnchorResolvedInset ResolveAnchor(
const mozilla::StyleInset& aValue, mozilla::StylePhysicalAxis aAxis, const mozilla::StyleInset& aValue, mozilla::StylePhysicalAxis aAxis,
mozilla::StylePositionProperty aPosition); mozilla::StylePositionProperty aPosition);
static AnchorResolved<mozilla::StyleInset> Invalid() {
return AnchorResolved::Evaluated(mozilla::StyleInset::Auto());
}
static AnchorResolved<mozilla::StyleInset> Evaluated(
mozilla::StyleLengthPercentage&& aLP) {
return AnchorResolved::Evaluated(
mozilla::StyleInset::LengthPercentage(aLP));
}
static AnchorResolved<mozilla::StyleInset> Evaluated(
const mozilla::StyleLengthPercentage& aLP) {
return AnchorResolved::Evaluated(
mozilla::StyleInset::LengthPercentage(aLP));
}
}; };
class AnchorResolvedSize final : public AnchorResolved<mozilla::StyleSize> { using AnchorResolvedSize = AnchorResolved<mozilla::StyleSize>;
public:
AnchorResolvedSize(const mozilla::StyleSize& aValue, struct AnchorResolvedSizeHelper {
mozilla::StylePositionProperty aPosition) static AnchorResolvedSize FromUnresolved(
: AnchorResolved<mozilla::StyleSize>{FromUnresolved(aValue, aPosition)} {} const mozilla::StyleSize& aValue,
mozilla::StylePositionProperty aPosition) {
if (!aValue.HasAnchorPositioningFunction()) {
return AnchorResolvedSize::Unchanged(aValue);
}
return ResolveAnchor(aValue, aPosition);
}
AnchorResolvedSize(AnchorResolvedSize&& aOther) = default;
AnchorResolvedSize& operator=(AnchorResolvedSize&& aOther) = default;
static AnchorResolvedSize Overridden(const mozilla::StyleSize& aSize) { static AnchorResolvedSize Overridden(const mozilla::StyleSize& aSize) {
return AnchorResolvedSize{aSize}; return AnchorResolvedSize::Unchanged(aSize);
} }
static AnchorResolvedSize Zero() { static AnchorResolvedSize Zero() {
return AnchorResolvedSize{mozilla::StyleSize::LengthPercentage( return AnchorResolvedSize::Evaluated(mozilla::StyleSize::LengthPercentage(
mozilla::StyleLengthPercentage::Zero())}; mozilla::StyleLengthPercentage::Zero()));
} }
static AnchorResolvedSize MinContent() { static AnchorResolvedSize MinContent() {
return AnchorResolvedSize{mozilla::StyleSize::MinContent()}; return AnchorResolvedSize::Evaluated(mozilla::StyleSize::MinContent());
} }
static AnchorResolvedSize Auto() { static AnchorResolvedSize Auto() {
return AnchorResolvedSize{mozilla::StyleSize::Auto()}; return AnchorResolvedSize::Evaluated(mozilla::StyleSize::Auto());
} }
static AnchorResolvedSize LengthPercentage( static AnchorResolvedSize LengthPercentage(
const mozilla::StyleLengthPercentage& aLP) { const mozilla::StyleLengthPercentage& aLP) {
return AnchorResolvedSize{mozilla::StyleSize::LengthPercentage(aLP)}; return AnchorResolvedSize::Evaluated(
mozilla::StyleSize::LengthPercentage(aLP));
} }
private: private:
explicit AnchorResolvedSize(mozilla::StyleSize&& aSize)
: AnchorResolved<mozilla::StyleSize>{
AnchorResolved::Evaluated(std::move(aSize))} {}
explicit AnchorResolvedSize(const mozilla::StyleSize& aSize)
: AnchorResolved<mozilla::StyleSize>{AnchorResolved::Unchanged(aSize)} {}
static AnchorResolved<mozilla::StyleSize> FromUnresolved(
const mozilla::StyleSize& aValue,
mozilla::StylePositionProperty aPosition) {
if (!aValue.HasAnchorPositioningFunction()) {
return AnchorResolved::Unchanged(aValue);
}
return ResolveAnchor(aValue, aPosition);
}
static AnchorResolved<mozilla::StyleSize> ResolveAnchor( static AnchorResolved<mozilla::StyleSize> ResolveAnchor(
const mozilla::StyleSize& aValue, const mozilla::StyleSize& aValue,
mozilla::StylePositionProperty aPosition); mozilla::StylePositionProperty aPosition);
static AnchorResolved<mozilla::StyleSize> Invalid() {
return AnchorResolved::Evaluated(mozilla::StyleSize::Auto());
}
static AnchorResolved<mozilla::StyleSize> Evaluated(
mozilla::StyleLengthPercentage&& aLP) {
return AnchorResolved::Evaluated(mozilla::StyleSize::LengthPercentage(aLP));
}
static AnchorResolved<mozilla::StyleSize> Evaluated(
const mozilla::StyleLengthPercentage& aLP) {
return AnchorResolved::Evaluated(mozilla::StyleSize::LengthPercentage(aLP));
}
}; };
class AnchorResolvedMaxSize final using AnchorResolvedMaxSize = AnchorResolved<mozilla::StyleMaxSize>;
: public AnchorResolved<mozilla::StyleMaxSize> {
public:
AnchorResolvedMaxSize(const mozilla::StyleMaxSize& aValue,
mozilla::StylePositionProperty aPosition)
: AnchorResolved<mozilla::StyleMaxSize>{
FromUnresolved(aValue, aPosition)} {}
static AnchorResolvedMaxSize MaxContent() { struct AnchorResolvedMaxSizeHelper {
return AnchorResolvedMaxSize{mozilla::StyleMaxSize::MaxContent()}; static AnchorResolvedMaxSize FromUnresolved(
}
static AnchorResolvedMaxSize None() {
return AnchorResolvedMaxSize{mozilla::StyleMaxSize::None()};
}
private:
explicit AnchorResolvedMaxSize(mozilla::StyleMaxSize&& aSize)
: AnchorResolved<mozilla::StyleMaxSize>{
AnchorResolved::Evaluated(std::move(aSize))} {}
static AnchorResolved<mozilla::StyleMaxSize> FromUnresolved(
const mozilla::StyleMaxSize& aValue, const mozilla::StyleMaxSize& aValue,
mozilla::StylePositionProperty aPosition) { mozilla::StylePositionProperty aPosition) {
if (!aValue.HasAnchorPositioningFunction()) { if (!aValue.HasAnchorPositioningFunction()) {
return AnchorResolved::Unchanged(aValue); return AnchorResolvedMaxSize::Unchanged(aValue);
} }
return ResolveAnchor(aValue, aPosition); return ResolveAnchor(aValue, aPosition);
} }
static AnchorResolved<mozilla::StyleMaxSize> ResolveAnchor( static AnchorResolvedMaxSize MaxContent() {
return AnchorResolvedMaxSize::Evaluated(
mozilla::StyleMaxSize::MaxContent());
}
static AnchorResolvedMaxSize None() {
return AnchorResolvedMaxSize::Evaluated(mozilla::StyleMaxSize::None());
}
private:
static AnchorResolvedMaxSize ResolveAnchor(
const mozilla::StyleMaxSize& aValue, const mozilla::StyleMaxSize& aValue,
mozilla::StylePositionProperty aPosition); mozilla::StylePositionProperty aPosition);
static AnchorResolved<mozilla::StyleMaxSize> Invalid() {
return AnchorResolved::Evaluated(mozilla::StyleMaxSize::None());
}
static AnchorResolved<mozilla::StyleMaxSize> Evaluated(
mozilla::StyleLengthPercentage&& aLP) {
return AnchorResolved::Evaluated(
mozilla::StyleMaxSize::LengthPercentage(aLP));
}
static AnchorResolved<mozilla::StyleMaxSize> Evaluated(
const mozilla::StyleLengthPercentage& aLP) {
return AnchorResolved::Evaluated(
mozilla::StyleMaxSize::LengthPercentage(aLP));
}
}; };
struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStylePosition { struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStylePosition {
@@ -1131,36 +1049,37 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStylePosition {
// interleaving computation is implemented. // interleaving computation is implemented.
AnchorResolvedInset GetAnchorResolvedInset( AnchorResolvedInset GetAnchorResolvedInset(
mozilla::Side aSide, mozilla::StylePositionProperty aPosition) const { mozilla::Side aSide, mozilla::StylePositionProperty aPosition) const {
return {mOffset.Get(aSide), GetStylePhysicalAxis(aSide), aPosition}; return AnchorResolvedInsetHelper::FromUnresolved(
mOffset.Get(aSide), GetStylePhysicalAxis(aSide), aPosition);
} }
inline AnchorResolvedInset GetAnchorResolvedInset( inline AnchorResolvedInset GetAnchorResolvedInset(
mozilla::LogicalSide aSide, WritingMode aWM, mozilla::LogicalSide aSide, WritingMode aWM,
mozilla::StylePositionProperty aPosition) const; mozilla::StylePositionProperty aPosition) const;
AnchorResolvedSize GetWidth(mozilla::StylePositionProperty aProp) const { AnchorResolvedSize GetWidth(mozilla::StylePositionProperty aProp) const {
return {mWidth, aProp}; return AnchorResolvedSizeHelper::FromUnresolved(mWidth, aProp);
} }
AnchorResolvedSize GetHeight(mozilla::StylePositionProperty aProp) const { AnchorResolvedSize GetHeight(mozilla::StylePositionProperty aProp) const {
return {mHeight, aProp}; return AnchorResolvedSizeHelper::FromUnresolved(mHeight, aProp);
} }
AnchorResolvedSize GetMinWidth(mozilla::StylePositionProperty aProp) const { AnchorResolvedSize GetMinWidth(mozilla::StylePositionProperty aProp) const {
return {mMinWidth, aProp}; return AnchorResolvedSizeHelper::FromUnresolved(mMinWidth, aProp);
} }
AnchorResolvedSize GetMinHeight(mozilla::StylePositionProperty aProp) const { AnchorResolvedSize GetMinHeight(mozilla::StylePositionProperty aProp) const {
return {mMinHeight, aProp}; return AnchorResolvedSizeHelper::FromUnresolved(mMinHeight, aProp);
} }
AnchorResolvedMaxSize GetMaxWidth( AnchorResolvedMaxSize GetMaxWidth(
mozilla::StylePositionProperty aProp) const { mozilla::StylePositionProperty aProp) const {
return {mMaxWidth, aProp}; return AnchorResolvedMaxSizeHelper::FromUnresolved(mMaxWidth, aProp);
} }
AnchorResolvedMaxSize GetMaxHeight( AnchorResolvedMaxSize GetMaxHeight(
mozilla::StylePositionProperty aProp) const { mozilla::StylePositionProperty aProp) const {
return {mMaxHeight, aProp}; return AnchorResolvedMaxSizeHelper::FromUnresolved(mMaxHeight, aProp);
} }
private: private:

View File

@@ -183,11 +183,11 @@ static CellISizeInfo GetISizeInfo(gfxContext* aRenderingContext,
auto maxISize = stylePos->MaxISize(aWM, positionProperty); auto maxISize = stylePos->MaxISize(aWM, positionProperty);
if (nsIFrame::ToExtremumLength(*maxISize)) { if (nsIFrame::ToExtremumLength(*maxISize)) {
if (!aIsCell || maxISize->BehavesLikeStretchOnInlineAxis()) { if (!aIsCell || maxISize->BehavesLikeStretchOnInlineAxis()) {
maxISize = AnchorResolvedMaxSize::None(); maxISize = AnchorResolvedMaxSizeHelper::None();
} else if (maxISize->IsFitContent() || maxISize->IsFitContentFunction()) { } else if (maxISize->IsFitContent() || maxISize->IsFitContentFunction()) {
// TODO: Bug 1708310: Make sure fit-content() work properly in table. // TODO: Bug 1708310: Make sure fit-content() work properly in table.
// for 'max-inline-size', '-moz-fit-content' is like 'max-content' // for 'max-inline-size', '-moz-fit-content' is like 'max-content'
maxISize = AnchorResolvedMaxSize::MaxContent(); maxISize = AnchorResolvedMaxSizeHelper::MaxContent();
} }
} }
// XXX To really implement 'max-inline-size' well, we'd need to store // XXX To really implement 'max-inline-size' well, we'd need to store
@@ -212,11 +212,11 @@ static CellISizeInfo GetISizeInfo(gfxContext* aRenderingContext,
auto minISize = stylePos->MinISize(aWM, positionProperty); auto minISize = stylePos->MinISize(aWM, positionProperty);
if (nsIFrame::ToExtremumLength(*maxISize)) { if (nsIFrame::ToExtremumLength(*maxISize)) {
if (!aIsCell || minISize->BehavesLikeStretchOnInlineAxis()) { if (!aIsCell || minISize->BehavesLikeStretchOnInlineAxis()) {
minISize = AnchorResolvedSize::Zero(); minISize = AnchorResolvedSizeHelper::Zero();
} else if (minISize->IsFitContent() || minISize->IsFitContentFunction()) { } else if (minISize->IsFitContent() || minISize->IsFitContentFunction()) {
// TODO: Bug 1708310: Make sure fit-content() work properly in table. // TODO: Bug 1708310: Make sure fit-content() work properly in table.
// for 'min-inline-size', '-moz-fit-content' is like 'min-content' // for 'min-inline-size', '-moz-fit-content' is like 'min-content'
minISize = AnchorResolvedSize::MinContent(); minISize = AnchorResolvedSizeHelper::MinContent();
} }
} }