Add calc() support for two properties I missed: outline-width and column-gap. (Bug 363249) r=bzbarsky a2.0=blocking2.0:beta6

This commit is contained in:
L. David Baron 2010-09-09 08:21:46 -07:00
parent 7a0e99bcfb
commit d282153a9d
4 changed files with 39 additions and 10 deletions

View File

@ -5640,7 +5640,8 @@ CSSParserImpl::ParseSingleValueProperty(nsCSSValue& aValue,
case eCSSProperty__moz_column_width:
return ParseNonNegativeVariant(aValue, VARIANT_AHL | VARIANT_CALC, nsnull);
case eCSSProperty__moz_column_gap:
return ParseNonNegativeVariant(aValue, VARIANT_HL | VARIANT_NORMAL, nsnull);
return ParseNonNegativeVariant(aValue, VARIANT_HL | VARIANT_NORMAL |
VARIANT_CALC, nsnull);
case eCSSProperty_bottom:
case eCSSProperty_top:
case eCSSProperty_left:
@ -5860,7 +5861,7 @@ CSSParserImpl::ParseSingleValueProperty(nsCSSValue& aValue,
return ParseVariant(aValue, VARIANT_HK,
nsCSSProps::kOutlineStyleKTable);
case eCSSProperty_outline_width:
return ParseNonNegativeVariant(aValue, VARIANT_HKL,
return ParseNonNegativeVariant(aValue, VARIANT_HKL | VARIANT_CALC,
nsCSSProps::kBorderWidthKTable);
case eCSSProperty_outline_offset:
return ParseVariant(aValue, VARIANT_HL | VARIANT_CALC, nsnull);

View File

@ -5345,7 +5345,8 @@ nsRuleNode::ComputeOutlineData(void* aStartStruct,
}
else {
SetCoord(marginData.mOutlineWidth, outline->mOutlineWidth,
parentOutline->mOutlineWidth, SETCOORD_LEH, aContext,
parentOutline->mOutlineWidth,
SETCOORD_LEH | SETCOORD_CALC_LENGTH_ONLY, aContext,
mPresContext, canStoreInRuleTree);
}
@ -6024,11 +6025,17 @@ nsRuleNode::ComputeColumnData(void* aStartStruct,
SETCOORD_CALC_LENGTH_ONLY | SETCOORD_CALC_CLAMP_NONNEGATIVE,
aContext, mPresContext, canStoreInRuleTree);
// column-gap: length, percentage, inherit, normal
// column-gap: length, inherit, normal
SetCoord(columnData.mColumnGap,
column->mColumnGap, parent->mColumnGap,
SETCOORD_LPH | SETCOORD_NORMAL | SETCOORD_INITIAL_NORMAL,
SETCOORD_LH | SETCOORD_NORMAL | SETCOORD_INITIAL_NORMAL |
SETCOORD_CALC_LENGTH_ONLY,
aContext, mPresContext, canStoreInRuleTree);
// clamp negative calc() to 0
if (column->mColumnGap.GetUnit() == eStyleUnit_Coord) {
column->mColumnGap.SetCoordValue(
NS_MAX(column->mColumnGap.GetCoordValue(), 0));
}
// column-count: auto, integer, inherit
if (eCSSUnit_Auto == columnData.mColumnCount.GetUnit() ||

View File

@ -630,8 +630,9 @@ nsStyleOutline::RecalcData(nsPresContext* aContext)
mCachedOutlineWidth = 0;
mHasCachedOutline = PR_TRUE;
} else if (IsFixedUnit(mOutlineWidth, PR_TRUE)) {
// Clamp negative calc() to 0.
mCachedOutlineWidth =
CalcCoord(mOutlineWidth, aContext->GetBorderWidthTable(), 3);
NS_MAX(CalcCoord(mOutlineWidth, aContext->GetBorderWidthTable(), 3), 0);
mCachedOutlineWidth =
NS_ROUND_BORDER_TO_PIXELS(mCachedOutlineWidth, mTwipsPerPixel);
mHasCachedOutline = PR_TRUE;

View File

@ -406,8 +406,18 @@ var gCSSProperties = {
domProp: "MozColumnGap",
inherited: false,
type: CSS_TYPE_LONGHAND,
initial_values: [ "normal", "1em" ],
other_values: [ "2px", "4em" ],
initial_values: [ "normal", "1em", "-moz-calc(-2em + 3em)" ],
other_values: [ "2px", "4em",
"-moz-calc(2px)",
"-moz-calc(-2px)",
"-moz-calc(0)",
"-moz-calc(0pt)",
"-moz-calc(5em)",
"-moz-calc(3*25px)",
"-moz-calc(25px*3)",
"-moz-calc(3*25px + 5em)",
"-moz-min(3em, 30em,200px, min(500px ,40em))",
],
invalid_values: [ "3%", "-1px" ]
},
"-moz-column-rule": {
@ -2076,8 +2086,18 @@ var gCSSProperties = {
inherited: false,
type: CSS_TYPE_LONGHAND,
prerequisites: { "outline-style": "solid" },
initial_values: [ "medium", "3px" ],
other_values: [ "thin", "thick", "1px", "2em" ],
initial_values: [ "medium", "3px", "-moz-calc(4px - 1px)" ],
other_values: [ "thin", "thick", "1px", "2em",
"-moz-calc(2px)",
"-moz-calc(-2px)",
"-moz-calc(0)",
"-moz-calc(0px)",
"-moz-calc(5em)",
"-moz-calc(3*25px)",
"-moz-calc(25px*3)",
"-moz-calc(3*25px + 5em)",
"-moz-min(3em, 30em,200px, min(500px ,40em))",
],
invalid_values: [ "5%" ]
},
"overflow": {