mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-30 20:37:31 +09:00
Issue #1370 - Part 3: Implement content keyword for flex-basis property
Partially based on https://bugzilla.mozilla.org/show_bug.cgi?id=1105111
This commit is contained in:
parent
b6b20a04ec
commit
9dc59c43f1
9 changed files with 63 additions and 8 deletions
|
|
@ -947,8 +947,29 @@ nsContainerFrame::ComputeAutoSize(nsRenderingContext* aRenderingContext,
|
||||||
aBorder.ISize(aWM) - aPadding.ISize(aWM);
|
aBorder.ISize(aWM) - aPadding.ISize(aWM);
|
||||||
// replaced elements always shrink-wrap
|
// replaced elements always shrink-wrap
|
||||||
if ((aFlags & ComputeSizeFlags::eShrinkWrap) || IsFrameOfType(eReplaced)) {
|
if ((aFlags & ComputeSizeFlags::eShrinkWrap) || IsFrameOfType(eReplaced)) {
|
||||||
// don't bother setting it if the result won't be used
|
const nsStylePosition* position = StylePosition();
|
||||||
if (StylePosition()->ISize(aWM).GetUnit() == eStyleUnit_Auto) {
|
|
||||||
|
bool isFlexBasisContent = false;
|
||||||
|
if (IsFlexItem()) {
|
||||||
|
uint32_t flexDirection =
|
||||||
|
GetParent()->StylePosition()->mFlexDirection;
|
||||||
|
bool isInlineFlexItem =
|
||||||
|
flexDirection == NS_STYLE_FLEX_DIRECTION_ROW ||
|
||||||
|
flexDirection == NS_STYLE_FLEX_DIRECTION_ROW_REVERSE;
|
||||||
|
isFlexBasisContent =
|
||||||
|
position->mFlexBasis.GetUnit() == eStyleUnit_Enumerated &&
|
||||||
|
position->mFlexBasis.GetIntValue() == NS_STYLE_FLEX_BASIS_CONTENT &&
|
||||||
|
isInlineFlexItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only bother computing our 'auto' ISize if the result will be used.
|
||||||
|
// It'll be used under two scenarios:
|
||||||
|
// - If our ISize property is itself 'auto'.
|
||||||
|
// - If we're using flex-basis in place of our ISize property (i.e. we're a
|
||||||
|
// flex item with our inline axis being the main axis), AND we have
|
||||||
|
// flex-basis:content.
|
||||||
|
bool isAuto = position->ISize(aWM).GetUnit() == eStyleUnit_Auto;
|
||||||
|
if (isAuto || isFlexBasisContent) {
|
||||||
result.ISize(aWM) = ShrinkWidthToFit(aRenderingContext, availBased, aFlags);
|
result.ISize(aWM) = ShrinkWidthToFit(aRenderingContext, availBased, aFlags);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -4647,11 +4647,23 @@ nsFrame::SetCoordToFlexBasis(bool aIsInlineFlexItem,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const nsStyleCoord* newCoord = aFlexBasis;
|
||||||
|
|
||||||
|
// Having 'content' as the value of the 'flex-basis' property is
|
||||||
|
// equivalent to setting both 'flex-basis' and the main size
|
||||||
|
// properties to 'auto', which is why a dummy 'auto' value will
|
||||||
|
// be used here for the main size property.
|
||||||
|
if (aFlexBasis->GetUnit() == eStyleUnit_Enumerated &&
|
||||||
|
aFlexBasis->GetIntValue() == NS_STYLE_FLEX_BASIS_CONTENT) {
|
||||||
|
static const nsStyleCoord autoStyleCoord(eStyleUnit_Auto);
|
||||||
|
newCoord = &autoStyleCoord;
|
||||||
|
}
|
||||||
|
|
||||||
// Override whichever styleCoord is in the flex container's main axis
|
// Override whichever styleCoord is in the flex container's main axis
|
||||||
if (aIsInlineFlexItem) {
|
if (aIsInlineFlexItem) {
|
||||||
*aInlineStyle = aFlexBasis;
|
*aInlineStyle = newCoord;
|
||||||
} else {
|
} else {
|
||||||
*aBlockStyle = aFlexBasis;
|
*aBlockStyle = newCoord;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -205,6 +205,7 @@ CSS_KEY(column, column)
|
||||||
CSS_KEY(column-reverse, column_reverse)
|
CSS_KEY(column-reverse, column_reverse)
|
||||||
CSS_KEY(condensed, condensed)
|
CSS_KEY(condensed, condensed)
|
||||||
CSS_KEY(contain, contain)
|
CSS_KEY(contain, contain)
|
||||||
|
CSS_KEY(content, content)
|
||||||
CSS_KEY(content-box, content_box)
|
CSS_KEY(content-box, content_box)
|
||||||
CSS_KEY(contents, contents)
|
CSS_KEY(contents, contents)
|
||||||
CSS_KEY(context-fill, context_fill)
|
CSS_KEY(context-fill, context_fill)
|
||||||
|
|
|
||||||
|
|
@ -8592,7 +8592,7 @@ CSSParserImpl::ParseFlex()
|
||||||
// "a unitless zero that is not already preceded by two flex factors must be
|
// "a unitless zero that is not already preceded by two flex factors must be
|
||||||
// interpreted as a flex factor.
|
// interpreted as a flex factor.
|
||||||
if (ParseNonNegativeVariant(tmpVal, flexBasisVariantMask | VARIANT_NUMBER,
|
if (ParseNonNegativeVariant(tmpVal, flexBasisVariantMask | VARIANT_NUMBER,
|
||||||
nsCSSProps::kWidthKTable) != CSSParseResult::Ok) {
|
nsCSSProps::kFlexBasisKTable) != CSSParseResult::Ok) {
|
||||||
// First component was not a valid flex-basis or flex-grow value. Fail.
|
// First component was not a valid flex-basis or flex-grow value. Fail.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -8641,7 +8641,7 @@ CSSParserImpl::ParseFlex()
|
||||||
if (!wasFirstComponentFlexBasis) {
|
if (!wasFirstComponentFlexBasis) {
|
||||||
CSSParseResult result =
|
CSSParseResult result =
|
||||||
ParseNonNegativeVariant(tmpVal, flexBasisVariantMask,
|
ParseNonNegativeVariant(tmpVal, flexBasisVariantMask,
|
||||||
nsCSSProps::kWidthKTable);
|
nsCSSProps::kFlexBasisKTable);
|
||||||
if (result == CSSParseResult::Error) {
|
if (result == CSSParseResult::Error) {
|
||||||
return false;
|
return false;
|
||||||
} else if (result == CSSParseResult::Ok) {
|
} else if (result == CSSParseResult::Ok) {
|
||||||
|
|
|
||||||
|
|
@ -1758,7 +1758,7 @@ CSS_PROP_POSITION(
|
||||||
// its own code to parse each subproperty. It does not depend on the
|
// its own code to parse each subproperty. It does not depend on the
|
||||||
// longhand parsing defined here.
|
// longhand parsing defined here.
|
||||||
VARIANT_AHKLP | VARIANT_CALC,
|
VARIANT_AHKLP | VARIANT_CALC,
|
||||||
kWidthKTable,
|
kFlexBasisKTable,
|
||||||
offsetof(nsStylePosition, mFlexBasis),
|
offsetof(nsStylePosition, mFlexBasis),
|
||||||
eStyleAnimType_Coord)
|
eStyleAnimType_Coord)
|
||||||
CSS_PROP_POSITION(
|
CSS_PROP_POSITION(
|
||||||
|
|
|
||||||
|
|
@ -2263,6 +2263,20 @@ const KTableEntry nsCSSProps::kWidthKTable[] = {
|
||||||
{ eCSSKeyword_UNKNOWN, -1 }
|
{ eCSSKeyword_UNKNOWN, -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// This must be the same as kWidthKTable, but just with 'content' added:
|
||||||
|
const KTableEntry nsCSSProps::kFlexBasisKTable[] = {
|
||||||
|
{ eCSSKeyword__moz_max_content, NS_STYLE_WIDTH_MAX_CONTENT },
|
||||||
|
{ eCSSKeyword__moz_min_content, NS_STYLE_WIDTH_MIN_CONTENT },
|
||||||
|
{ eCSSKeyword__moz_fit_content, NS_STYLE_WIDTH_FIT_CONTENT },
|
||||||
|
{ eCSSKeyword__moz_available, NS_STYLE_WIDTH_AVAILABLE },
|
||||||
|
{ eCSSKeyword_content, NS_STYLE_FLEX_BASIS_CONTENT },
|
||||||
|
{ eCSSKeyword_UNKNOWN, -1 }
|
||||||
|
};
|
||||||
|
static_assert(ArrayLength(nsCSSProps::kFlexBasisKTable) ==
|
||||||
|
ArrayLength(nsCSSProps::kWidthKTable) + 1,
|
||||||
|
"kFlexBasisKTable should have the same entries as "
|
||||||
|
"kWidthKTable, plus one more for 'content'");
|
||||||
|
|
||||||
const KTableEntry nsCSSProps::kWindowDraggingKTable[] = {
|
const KTableEntry nsCSSProps::kWindowDraggingKTable[] = {
|
||||||
{ eCSSKeyword_default, StyleWindowDragging::Default },
|
{ eCSSKeyword_default, StyleWindowDragging::Default },
|
||||||
{ eCSSKeyword_drag, StyleWindowDragging::Drag },
|
{ eCSSKeyword_drag, StyleWindowDragging::Drag },
|
||||||
|
|
|
||||||
|
|
@ -892,6 +892,7 @@ public:
|
||||||
static const KTableEntry kVolumeKTable[];
|
static const KTableEntry kVolumeKTable[];
|
||||||
static const KTableEntry kWhitespaceKTable[];
|
static const KTableEntry kWhitespaceKTable[];
|
||||||
static const KTableEntry kWidthKTable[]; // also min-width, max-width
|
static const KTableEntry kWidthKTable[]; // also min-width, max-width
|
||||||
|
static const KTableEntry kFlexBasisKTable[];
|
||||||
static const KTableEntry kWindowDraggingKTable[];
|
static const KTableEntry kWindowDraggingKTable[];
|
||||||
static const KTableEntry kWindowShadowKTable[];
|
static const KTableEntry kWindowShadowKTable[];
|
||||||
static const KTableEntry kWordBreakKTable[];
|
static const KTableEntry kWordBreakKTable[];
|
||||||
|
|
|
||||||
|
|
@ -4424,7 +4424,7 @@ nsComputedDOMStyle::DoGetFlexBasis()
|
||||||
// }
|
// }
|
||||||
|
|
||||||
SetValueToCoord(val, StylePosition()->mFlexBasis, true,
|
SetValueToCoord(val, StylePosition()->mFlexBasis, true,
|
||||||
nullptr, nsCSSProps::kWidthKTable);
|
nullptr, nsCSSProps::kFlexBasisKTable);
|
||||||
return val.forget();
|
return val.forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -778,6 +778,12 @@ enum class StyleDisplay : uint8_t {
|
||||||
#define NS_STYLE_WIDTH_MIN_CONTENT 1
|
#define NS_STYLE_WIDTH_MIN_CONTENT 1
|
||||||
#define NS_STYLE_WIDTH_FIT_CONTENT 2
|
#define NS_STYLE_WIDTH_FIT_CONTENT 2
|
||||||
#define NS_STYLE_WIDTH_AVAILABLE 3
|
#define NS_STYLE_WIDTH_AVAILABLE 3
|
||||||
|
// The 'content' keyword is only valid for 'flex-basis' (not for 'width').
|
||||||
|
// Since the 'flex-basis' property accepts exactly the same values as 'width',
|
||||||
|
// this 'flex-basis'-specific enumerated value is listed alongside the
|
||||||
|
// 'width' ones, to be sure we don't accidentally overload this numeric
|
||||||
|
// value with two different meanings if new 'width' keywords are added.
|
||||||
|
#define NS_STYLE_FLEX_BASIS_CONTENT 4
|
||||||
|
|
||||||
// See nsStyleDisplay.mPosition
|
// See nsStyleDisplay.mPosition
|
||||||
#define NS_STYLE_POSITION_STATIC 0
|
#define NS_STYLE_POSITION_STATIC 0
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue