Bug 763689 patch 2: Support min-width:auto in computed style, and add special cases as necessary wherever it's read. r=dbaron

This commit is contained in:
Daniel Holbert 2012-09-04 16:26:10 -07:00
parent e735cf0a40
commit cb09d97d7e
9 changed files with 77 additions and 23 deletions

View File

@ -45,7 +45,7 @@ asserts(6-12) load 265986-1.html # Bug 512405
load 265999-1.html
load 266222-1.html
asserts(3-7) load 266360-1.html # bug 575011 / bug 576358
asserts(4) load 266445-1.html # Bug 575011
asserts(3) load 266445-1.html # Bug 575011
load 268157-1.html
load 269566-1.html
load 272647-1.html

View File

@ -2496,7 +2496,19 @@ nsLayoutUtils::IntrinsicForContainer(nsRenderingContext *aRenderingContext,
nscoord maxw;
bool haveFixedMaxWidth = GetAbsoluteCoord(styleMaxWidth, maxw);
nscoord minw;
bool haveFixedMinWidth = GetAbsoluteCoord(styleMinWidth, minw);
// Treat "min-width: auto" as 0.
bool haveFixedMinWidth;
if (eStyleUnit_Auto == styleMinWidth.GetUnit()) {
// NOTE: Technically, "auto" is supposed to behave like "min-content" on
// flex items. However, we don't need to worry about that here, because
// flex items' min-sizes are intentionally ignored until the flex
// container explicitly considers them during space distribution.
minw = 0;
haveFixedMinWidth = true;
} else {
haveFixedMinWidth = GetAbsoluteCoord(styleMinWidth, minw);
}
// If we have a specified width (or a specified 'min-width' greater
// than the specified 'max-width', which works out to the same thing),
@ -2836,9 +2848,18 @@ nsLayoutUtils::ComputeSizeWithIntrinsicDimensions(
maxWidth = nscoord_MAX;
}
minWidth = nsLayoutUtils::ComputeWidthValue(aRenderingContext,
aFrame, aCBSize.width, boxSizingAdjust.width,
boxSizingToMarginEdgeWidth, stylePos->mMinWidth);
if (stylePos->mMinWidth.GetUnit() != eStyleUnit_Auto) {
minWidth = nsLayoutUtils::ComputeWidthValue(aRenderingContext,
aFrame, aCBSize.width, boxSizingAdjust.width,
boxSizingToMarginEdgeWidth, stylePos->mMinWidth);
} else {
// Treat "min-width: auto" as 0.
// NOTE: Technically, "auto" is supposed to behave like "min-content" on
// flex items. However, we don't need to worry about that here, because
// flex items' min-sizes are intentionally ignored until the flex
// container explicitly considers them during space distribution.
minWidth = 0;
}
if (!isAutoHeight) {
height = nsLayoutUtils::ComputeHeightValue(aCBSize.height,

View File

@ -3890,10 +3890,20 @@ nsFrame::ComputeSize(nsRenderingContext *aRenderingContext,
result.width = NS_MIN(maxWidth, result.width);
}
nscoord minWidth =
nsLayoutUtils::ComputeWidthValue(aRenderingContext, this,
aCBSize.width, boxSizingAdjust.width, boxSizingToMarginEdgeWidth,
stylePos->mMinWidth);
nscoord minWidth;
if (stylePos->mMinWidth.GetUnit() != eStyleUnit_Auto) {
minWidth =
nsLayoutUtils::ComputeWidthValue(aRenderingContext, this,
aCBSize.width, boxSizingAdjust.width, boxSizingToMarginEdgeWidth,
stylePos->mMinWidth);
} else {
// Treat "min-width: auto" as 0.
// NOTE: Technically, "auto" is supposed to behave like "min-content" on
// flex items. However, we don't need to worry about that here, because
// flex items' min-sizes are intentionally ignored until the flex
// container explicitly considers them during space distribution.
minWidth = 0;
}
result.width = NS_MAX(minWidth, result.width);
// Compute height

View File

@ -2458,9 +2458,15 @@ nsHTMLReflowState::ComputeMinMaxValues(nscoord aContainingBlockWidth,
nscoord aContainingBlockHeight,
const nsHTMLReflowState* aContainingBlockRS)
{
mComputedMinWidth = ComputeWidthValue(aContainingBlockWidth,
mStylePosition->mBoxSizing,
mStylePosition->mMinWidth);
// Handle "min-width: auto"
if (eStyleUnit_Auto == mStylePosition->mMinWidth.GetUnit()) {
// XXXdholbert For flex items, this needs to behave like -moz-min-content.
mComputedMinWidth = 0;
} else {
mComputedMinWidth = ComputeWidthValue(aContainingBlockWidth,
mStylePosition->mBoxSizing,
mStylePosition->mMinWidth);
}
if (eStyleUnit_None == mStylePosition->mMaxWidth.GetUnit()) {
// Specified value of 'none'

View File

@ -20,7 +20,7 @@
== 10036-1.html 10036-1-ref.html
skip-if(!cocoaWidget) HTTP(..) == 10209-1.html 10209-ref.html # Bug 667079
HTTP(..) == 10209-2.html 10209-ref.html
asserts(4) skip-if(!cocoaWidget) HTTP(..) == 10209-3.html 10209-3-ref.html # Assertions: bug 666606, skip because of bug 667079
asserts(2) skip-if(!cocoaWidget) HTTP(..) == 10209-3.html 10209-3-ref.html # Assertions: bug 666606, skip because of bug 667079
== 18217-basic-1.html 18217-basic-1-ref.html
== 18217-basic-2a.html 18217-basic-2-ref.html
== 18217-basic-2b.html 18217-basic-2-ref.html

View File

@ -3361,7 +3361,17 @@ nsIDOMCSSValue*
nsComputedDOMStyle::DoGetMinWidth()
{
nsROCSSPrimitiveValue *val = GetROCSSPrimitiveValue();
SetValueToCoord(val, GetStylePosition()->mMinWidth, true,
nsStyleCoord minWidth = GetStylePosition()->mMinWidth;
if (eStyleUnit_Auto == minWidth.GetUnit()) {
// In non-flexbox contexts, "min-width: auto" means "min-width: 0".
// XXXdholbert For flex items, we should set |minWidth| to the
// -moz-min-content keyword, instead of 0.
minWidth.SetCoordValue(0);
}
SetValueToCoord(val, minWidth, true,
&nsComputedDOMStyle::GetCBContentWidth,
nsCSSProps::kWidthKTable);
return val;

View File

@ -6433,11 +6433,7 @@ nsRuleNode::ComputePositionData(void* aStartStruct,
SETCOORD_LPOH | SETCOORD_INITIAL_NONE | SETCOORD_STORE_CALC,
aContext, mPresContext, canStoreInRuleTree);
// Handle 'auto' values for min-width / min-height
if (pos->mMinWidth.GetUnit() == eStyleUnit_Auto) {
pos->mMinWidth.SetCoordValue(0);
}
// Make 'auto' values for min-height compute to 0
if (pos->mMinHeight.GetUnit() == eStyleUnit_Auto) {
pos->mMinHeight.SetCoordValue(0);
}

View File

@ -1130,7 +1130,7 @@ nsStylePosition::nsStylePosition(void)
mOffset.SetRight(autoCoord);
mOffset.SetBottom(autoCoord);
mWidth.SetAutoValue();
mMinWidth.SetCoordValue(0);
mMinWidth.SetAutoValue();
mMaxWidth.SetNoneValue();
mHeight.SetAutoValue();
mMinHeight.SetCoordValue(0);
@ -1252,8 +1252,7 @@ nsChangeHint nsStylePosition::MaxDifference()
/* static */ bool
nsStylePosition::WidthCoordDependsOnContainer(const nsStyleCoord &aCoord)
{
return aCoord.GetUnit() == eStyleUnit_Auto ||
aCoord.HasPercent() ||
return aCoord.HasPercent() ||
(aCoord.GetUnit() == eStyleUnit_Enumerated &&
(aCoord.GetIntValue() == NS_STYLE_WIDTH_FIT_CONTENT ||
aCoord.GetIntValue() == NS_STYLE_WIDTH_AVAILABLE));

View File

@ -1117,7 +1117,19 @@ struct nsStylePosition {
nsStyleCoord mZIndex; // [reset] integer, auto
bool WidthDependsOnContainer() const
{ return WidthCoordDependsOnContainer(mWidth); }
{
return mWidth.GetUnit() == eStyleUnit_Auto ||
WidthCoordDependsOnContainer(mWidth);
}
// NOTE: For a flex item, "min-width:auto" is supposed to behave like
// "min-content", which does depend on the container, so you might think we'd
// need a special case for "flex item && min-width:auto" here. However,
// we don't actually need that special-case code, because flex items are
// explicitly supposed to *ignore* their min-width (i.e. behave like it's 0)
// until the flex container explicitly considers it. So -- since the flex
// container doesn't rely on this method, we don't need to worry about
// special behavior for flex items' "min-width:auto" values here.
bool MinWidthDependsOnContainer() const
{ return WidthCoordDependsOnContainer(mMinWidth); }
bool MaxWidthDependsOnContainer() const