diff --git a/content/html/style/src/nsCSSStyleRule.cpp b/content/html/style/src/nsCSSStyleRule.cpp
index 4ac1a6acad18..47eb8e44d88c 100644
--- a/content/html/style/src/nsCSSStyleRule.cpp
+++ b/content/html/style/src/nsCSSStyleRule.cpp
@@ -409,6 +409,7 @@ PRInt32 nsCSSSelector::CalcWeight(void) const
static nscoord CalcLength(const nsCSSValue& aValue, const nsFont& aFont,
nsIPresContext* aPresContext);
static PRBool SetCoord(const nsCSSValue& aValue, nsStyleCoord& aCoord,
+ const nsStyleCoord& aParentCoord,
PRInt32 aMask, const nsFont& aFont,
nsIPresContext* aPresContext);
@@ -1071,9 +1072,10 @@ nscoord CalcLength(const nsCSSValue& aValue,
#define SETCOORD_LPEH (SETCOORD_LP | SETCOORD_ENUMERATED | SETCOORD_INHERIT)
#define SETCOORD_LE (SETCOORD_LENGTH | SETCOORD_ENUMERATED)
#define SETCOORD_LEH (SETCOORD_LE | SETCOORD_INHERIT)
-#define SETCOORD_IAH (SETCOORD_INTEGER | SETCOORD_AH)
+#define SETCOORD_IA (SETCOORD_INTEGER | SETCOORD_AUTO)
static PRBool SetCoord(const nsCSSValue& aValue, nsStyleCoord& aCoord,
+ const nsStyleCoord& aParentCoord,
PRInt32 aMask, const nsFont& aFont,
nsIPresContext* aPresContext)
{
@@ -1107,7 +1109,18 @@ static PRBool SetCoord(const nsCSSValue& aValue, nsStyleCoord& aCoord,
}
else if (((aMask & SETCOORD_INHERIT) != 0) &&
(aValue.GetUnit() == eCSSUnit_Inherit)) {
- aCoord.SetInheritValue();
+ if ((eStyleUnit_Null == aParentCoord.GetUnit()) || // parent has explicit computed value
+ (eStyleUnit_Factor == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Coord == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Integer == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Enumerated == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Normal == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Chars == aParentCoord.GetUnit())) {
+ aCoord = aParentCoord; // just inherit value from parent
+ }
+ else {
+ aCoord.SetInheritValue(); // needs to be computed by client
+ }
}
else if (((aMask & SETCOORD_NORMAL) != 0) &&
(aValue.GetUnit() == eCSSUnit_Normal)) {
@@ -1376,11 +1389,12 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// letter-spacing: normal, length, inherit
- SetCoord(ourText->mLetterSpacing, text->mLetterSpacing, SETCOORD_LH | SETCOORD_NORMAL,
- font->mFont, aPresContext);
+ SetCoord(ourText->mLetterSpacing, text->mLetterSpacing, parentText->mLetterSpacing,
+ SETCOORD_LH | SETCOORD_NORMAL, font->mFont, aPresContext);
// line-height: normal, number, length, percent, inherit
- SetCoord(ourText->mLineHeight, text->mLineHeight, SETCOORD_LPFHN, font->mFont, aPresContext);
+ SetCoord(ourText->mLineHeight, text->mLineHeight, parentText->mLineHeight,
+ SETCOORD_LPFHN, font->mFont, aPresContext);
// text-align: enum, string, inherit
if (eCSSUnit_Enumerated == ourText->mTextAlign.GetUnit()) {
@@ -1394,7 +1408,8 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// text-indent: length, percent, inherit
- SetCoord(ourText->mTextIndent, text->mTextIndent, SETCOORD_LPH, font->mFont, aPresContext);
+ SetCoord(ourText->mTextIndent, text->mTextIndent, parentText->mTextIndent,
+ SETCOORD_LPH, font->mFont, aPresContext);
// text-decoration: none, enum (bit field), inherit
if (eCSSUnit_Enumerated == ourText->mDecoration.GetUnit()) {
@@ -1426,12 +1441,8 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// vertical-align: enum, length, percent, inherit
- if (! SetCoord(ourText->mVerticalAlign, text->mVerticalAlign, SETCOORD_LP | SETCOORD_ENUMERATED,
- font->mFont, aPresContext)) {
- // XXX this really needs to pass the inherit value along...
- if (eCSSUnit_Inherit == ourText->mVerticalAlign.GetUnit()) {
- text->mVerticalAlign = parentText->mVerticalAlign;
- }
+ if (! SetCoord(ourText->mVerticalAlign, text->mVerticalAlign, parentText->mVerticalAlign,
+ SETCOORD_LPH | SETCOORD_ENUMERATED, font->mFont, aPresContext)) {
}
// white-space: enum, normal, inherit
@@ -1446,8 +1457,8 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// word-spacing: normal, length, inherit
- SetCoord(ourText->mWordSpacing, text->mWordSpacing, SETCOORD_LH | SETCOORD_NORMAL,
- font->mFont, aPresContext);
+ SetCoord(ourText->mWordSpacing, text->mWordSpacing, parentText->mWordSpacing,
+ SETCOORD_LH | SETCOORD_NORMAL, font->mFont, aPresContext);
}
}
@@ -1734,16 +1745,21 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
// margin: length, percent, auto, inherit
if (nsnull != ourMargin->mMargin) {
nsStyleCoord coord;
- if (SetCoord(ourMargin->mMargin->mLeft, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ nsStyleCoord parentCoord;
+ parentSpacing->mMargin.GetLeft(parentCoord);
+ if (SetCoord(ourMargin->mMargin->mLeft, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
spacing->mMargin.SetLeft(coord);
}
- if (SetCoord(ourMargin->mMargin->mTop, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentSpacing->mMargin.GetTop(parentCoord);
+ if (SetCoord(ourMargin->mMargin->mTop, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
spacing->mMargin.SetTop(coord);
}
- if (SetCoord(ourMargin->mMargin->mRight, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentSpacing->mMargin.GetRight(parentCoord);
+ if (SetCoord(ourMargin->mMargin->mRight, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
spacing->mMargin.SetRight(coord);
}
- if (SetCoord(ourMargin->mMargin->mBottom, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentSpacing->mMargin.GetBottom(parentCoord);
+ if (SetCoord(ourMargin->mMargin->mBottom, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
spacing->mMargin.SetBottom(coord);
}
}
@@ -1751,16 +1767,21 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
// padding: length, percent, inherit
if (nsnull != ourMargin->mPadding) {
nsStyleCoord coord;
- if (SetCoord(ourMargin->mPadding->mLeft, coord, SETCOORD_LPH, font->mFont, aPresContext)) {
+ nsStyleCoord parentCoord;
+ parentSpacing->mPadding.GetLeft(parentCoord);
+ if (SetCoord(ourMargin->mPadding->mLeft, coord, parentCoord, SETCOORD_LPH, font->mFont, aPresContext)) {
spacing->mPadding.SetLeft(coord);
}
- if (SetCoord(ourMargin->mPadding->mTop, coord, SETCOORD_LPH, font->mFont, aPresContext)) {
+ parentSpacing->mPadding.GetTop(parentCoord);
+ if (SetCoord(ourMargin->mPadding->mTop, coord, parentCoord, SETCOORD_LPH, font->mFont, aPresContext)) {
spacing->mPadding.SetTop(coord);
}
- if (SetCoord(ourMargin->mPadding->mRight, coord, SETCOORD_LPH, font->mFont, aPresContext)) {
+ parentSpacing->mPadding.GetRight(parentCoord);
+ if (SetCoord(ourMargin->mPadding->mRight, coord, parentCoord, SETCOORD_LPH, font->mFont, aPresContext)) {
spacing->mPadding.SetRight(coord);
}
- if (SetCoord(ourMargin->mPadding->mBottom, coord, SETCOORD_LPH, font->mFont, aPresContext)) {
+ parentSpacing->mPadding.GetBottom(parentCoord);
+ if (SetCoord(ourMargin->mPadding->mBottom, coord, parentCoord, SETCOORD_LPH, font->mFont, aPresContext)) {
spacing->mPadding.SetBottom(coord);
}
}
@@ -1768,28 +1789,29 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
// border-size: length, enum, inherit
if (nsnull != ourMargin->mBorderWidth) {
nsStyleCoord coord;
- if (SetCoord(ourMargin->mBorderWidth->mLeft, coord, SETCOORD_LE, font->mFont, aPresContext)) {
+ nsStyleCoord parentCoord;
+ if (SetCoord(ourMargin->mBorderWidth->mLeft, coord, parentCoord, SETCOORD_LE, font->mFont, aPresContext)) {
spacing->mBorder.SetLeft(coord);
}
else if (eCSSUnit_Inherit == ourMargin->mBorderWidth->mLeft.GetUnit()) {
spacing->mBorder.SetLeft(parentSpacing->mBorder.GetLeft(coord));
}
- if (SetCoord(ourMargin->mBorderWidth->mTop, coord, SETCOORD_LE, font->mFont, aPresContext)) {
+ if (SetCoord(ourMargin->mBorderWidth->mTop, coord, parentCoord, SETCOORD_LE, font->mFont, aPresContext)) {
spacing->mBorder.SetTop(coord);
}
else if (eCSSUnit_Inherit == ourMargin->mBorderWidth->mTop.GetUnit()) {
spacing->mBorder.SetTop(parentSpacing->mBorder.GetTop(coord));
}
- if (SetCoord(ourMargin->mBorderWidth->mRight, coord, SETCOORD_LE, font->mFont, aPresContext)) {
+ if (SetCoord(ourMargin->mBorderWidth->mRight, coord, parentCoord, SETCOORD_LE, font->mFont, aPresContext)) {
spacing->mBorder.SetRight(coord);
}
else if (eCSSUnit_Inherit == ourMargin->mBorderWidth->mRight.GetUnit()) {
spacing->mBorder.SetRight(parentSpacing->mBorder.GetRight(coord));
}
- if (SetCoord(ourMargin->mBorderWidth->mBottom, coord, SETCOORD_LE, font->mFont, aPresContext)) {
+ if (SetCoord(ourMargin->mBorderWidth->mBottom, coord, parentCoord, SETCOORD_LE, font->mFont, aPresContext)) {
spacing->mBorder.SetBottom(coord);
}
else if (eCSSUnit_Inherit == ourMargin->mBorderWidth->mBottom.GetUnit()) {
@@ -1909,16 +1931,13 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// -moz-border-radius: length, inherit
- if (! SetCoord(ourMargin->mBorderRadius, spacing->mBorderRadius,
+ if (! SetCoord(ourMargin->mBorderRadius, spacing->mBorderRadius, parentSpacing->mBorderRadius,
SETCOORD_LPH, font->mFont, aPresContext)) {
}
// outline-width: length, enum, inherit
- if (! SetCoord(ourMargin->mOutlineWidth, spacing->mOutlineWidth,
- SETCOORD_LE, font->mFont, aPresContext)) {
- if (eCSSUnit_Inherit == ourMargin->mOutlineWidth.GetUnit()) {
- spacing->mOutlineWidth = parentSpacing->mOutlineWidth;
- }
+ if (! SetCoord(ourMargin->mOutlineWidth, spacing->mOutlineWidth, parentSpacing->mOutlineWidth,
+ SETCOORD_LEH, font->mFont, aPresContext)) {
}
// outline-color: color, string, enum, inherit
@@ -1981,31 +2000,42 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
// box offsets: length, percent, auto, inherit
if (nsnull != ourPosition->mOffset) {
nsStyleCoord coord;
- if (SetCoord(ourPosition->mOffset->mTop, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ nsStyleCoord parentCoord;
+ parentPosition->mOffset.GetTop(parentCoord);
+ if (SetCoord(ourPosition->mOffset->mTop, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
position->mOffset.SetTop(coord);
}
- if (SetCoord(ourPosition->mOffset->mRight, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentPosition->mOffset.GetRight(parentCoord);
+ if (SetCoord(ourPosition->mOffset->mRight, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
position->mOffset.SetRight(coord);
}
- if (SetCoord(ourPosition->mOffset->mBottom, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentPosition->mOffset.GetBottom(parentCoord);
+ if (SetCoord(ourPosition->mOffset->mBottom, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
position->mOffset.SetBottom(coord);
}
- if (SetCoord(ourPosition->mOffset->mLeft, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentPosition->mOffset.GetLeft(parentCoord);
+ if (SetCoord(ourPosition->mOffset->mLeft, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
position->mOffset.SetLeft(coord);
}
}
- SetCoord(ourPosition->mWidth, position->mWidth, SETCOORD_LPAH, font->mFont, aPresContext);
- SetCoord(ourPosition->mMinWidth, position->mMinWidth, SETCOORD_LPH, font->mFont, aPresContext);
- if (! SetCoord(ourPosition->mMaxWidth, position->mMaxWidth, SETCOORD_LPH, font->mFont, aPresContext)) {
+ SetCoord(ourPosition->mWidth, position->mWidth, parentPosition->mWidth,
+ SETCOORD_LPAH, font->mFont, aPresContext);
+ SetCoord(ourPosition->mMinWidth, position->mMinWidth, parentPosition->mMinWidth,
+ SETCOORD_LPH, font->mFont, aPresContext);
+ if (! SetCoord(ourPosition->mMaxWidth, position->mMaxWidth, parentPosition->mMaxWidth,
+ SETCOORD_LPH, font->mFont, aPresContext)) {
if (eCSSUnit_None == ourPosition->mMaxWidth.GetUnit()) {
position->mMaxWidth.Reset();
}
}
- SetCoord(ourPosition->mHeight, position->mHeight, SETCOORD_LPAH, font->mFont, aPresContext);
- SetCoord(ourPosition->mMinHeight, position->mMinHeight, SETCOORD_LPH, font->mFont, aPresContext);
- if (! SetCoord(ourPosition->mMaxHeight, position->mMaxHeight, SETCOORD_LPH, font->mFont, aPresContext)) {
+ SetCoord(ourPosition->mHeight, position->mHeight, parentPosition->mHeight,
+ SETCOORD_LPAH, font->mFont, aPresContext);
+ SetCoord(ourPosition->mMinHeight, position->mMinHeight, parentPosition->mMinHeight,
+ SETCOORD_LPH, font->mFont, aPresContext);
+ if (! SetCoord(ourPosition->mMaxHeight, position->mMaxHeight, parentPosition->mMaxHeight,
+ SETCOORD_LPH, font->mFont, aPresContext)) {
if (eCSSUnit_None == ourPosition->mMaxHeight.GetUnit()) {
position->mMaxHeight.Reset();
}
@@ -2020,7 +2050,13 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// z-index
- SetCoord(ourPosition->mZIndex, position->mZIndex, SETCOORD_IAH, font->mFont, nsnull);
+ if (! SetCoord(ourPosition->mZIndex, position->mZIndex, parentPosition->mZIndex,
+ SETCOORD_IA, font->mFont, nsnull)) {
+ if (eCSSUnit_Inherit == ourPosition->mZIndex.GetUnit()) {
+ // handle inherit, because it's ok to inherit 'auto' here
+ position->mZIndex = parentPosition->mZIndex;
+ }
+ }
}
}
@@ -2086,14 +2122,14 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// border-spacing-x: length, inherit
- if (SetCoord(ourTable->mBorderSpacingX, coord, SETCOORD_LENGTH, font->mFont, aPresContext)) {
+ if (SetCoord(ourTable->mBorderSpacingX, coord, coord, SETCOORD_LENGTH, font->mFont, aPresContext)) {
table->mBorderSpacingX = coord.GetCoordValue();
}
else if (eCSSUnit_Inherit == ourTable->mBorderSpacingX.GetUnit()) {
table->mBorderSpacingX = parentTable->mBorderSpacingX;
}
// border-spacing-y: length, inherit
- if (SetCoord(ourTable->mBorderSpacingY, coord, SETCOORD_LENGTH, font->mFont, aPresContext)) {
+ if (SetCoord(ourTable->mBorderSpacingY, coord, coord, SETCOORD_LENGTH, font->mFont, aPresContext)) {
table->mBorderSpacingY = coord.GetCoordValue();
}
else if (eCSSUnit_Inherit == ourTable->mBorderSpacingY.GetUnit()) {
@@ -2287,11 +2323,8 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// marker-offset: length, auto, inherit
- if (! SetCoord(ourContent->mMarkerOffset, content->mMarkerOffset,
- SETCOORD_LENGTH | SETCOORD_AUTO, font->mFont, aPresContext)) {
- if (eCSSUnit_Inherit == ourContent->mMarkerOffset.GetUnit()) {
- content->mMarkerOffset = parentContent->mMarkerOffset;
- }
+ if (! SetCoord(ourContent->mMarkerOffset, content->mMarkerOffset, parentContent->mMarkerOffset,
+ SETCOORD_LH | SETCOORD_AUTO, font->mFont, aPresContext)) {
}
// quotes: [string string]+, none, inherit
diff --git a/layout/html/style/src/nsCSSStyleRule.cpp b/layout/html/style/src/nsCSSStyleRule.cpp
index 4ac1a6acad18..47eb8e44d88c 100644
--- a/layout/html/style/src/nsCSSStyleRule.cpp
+++ b/layout/html/style/src/nsCSSStyleRule.cpp
@@ -409,6 +409,7 @@ PRInt32 nsCSSSelector::CalcWeight(void) const
static nscoord CalcLength(const nsCSSValue& aValue, const nsFont& aFont,
nsIPresContext* aPresContext);
static PRBool SetCoord(const nsCSSValue& aValue, nsStyleCoord& aCoord,
+ const nsStyleCoord& aParentCoord,
PRInt32 aMask, const nsFont& aFont,
nsIPresContext* aPresContext);
@@ -1071,9 +1072,10 @@ nscoord CalcLength(const nsCSSValue& aValue,
#define SETCOORD_LPEH (SETCOORD_LP | SETCOORD_ENUMERATED | SETCOORD_INHERIT)
#define SETCOORD_LE (SETCOORD_LENGTH | SETCOORD_ENUMERATED)
#define SETCOORD_LEH (SETCOORD_LE | SETCOORD_INHERIT)
-#define SETCOORD_IAH (SETCOORD_INTEGER | SETCOORD_AH)
+#define SETCOORD_IA (SETCOORD_INTEGER | SETCOORD_AUTO)
static PRBool SetCoord(const nsCSSValue& aValue, nsStyleCoord& aCoord,
+ const nsStyleCoord& aParentCoord,
PRInt32 aMask, const nsFont& aFont,
nsIPresContext* aPresContext)
{
@@ -1107,7 +1109,18 @@ static PRBool SetCoord(const nsCSSValue& aValue, nsStyleCoord& aCoord,
}
else if (((aMask & SETCOORD_INHERIT) != 0) &&
(aValue.GetUnit() == eCSSUnit_Inherit)) {
- aCoord.SetInheritValue();
+ if ((eStyleUnit_Null == aParentCoord.GetUnit()) || // parent has explicit computed value
+ (eStyleUnit_Factor == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Coord == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Integer == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Enumerated == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Normal == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Chars == aParentCoord.GetUnit())) {
+ aCoord = aParentCoord; // just inherit value from parent
+ }
+ else {
+ aCoord.SetInheritValue(); // needs to be computed by client
+ }
}
else if (((aMask & SETCOORD_NORMAL) != 0) &&
(aValue.GetUnit() == eCSSUnit_Normal)) {
@@ -1376,11 +1389,12 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// letter-spacing: normal, length, inherit
- SetCoord(ourText->mLetterSpacing, text->mLetterSpacing, SETCOORD_LH | SETCOORD_NORMAL,
- font->mFont, aPresContext);
+ SetCoord(ourText->mLetterSpacing, text->mLetterSpacing, parentText->mLetterSpacing,
+ SETCOORD_LH | SETCOORD_NORMAL, font->mFont, aPresContext);
// line-height: normal, number, length, percent, inherit
- SetCoord(ourText->mLineHeight, text->mLineHeight, SETCOORD_LPFHN, font->mFont, aPresContext);
+ SetCoord(ourText->mLineHeight, text->mLineHeight, parentText->mLineHeight,
+ SETCOORD_LPFHN, font->mFont, aPresContext);
// text-align: enum, string, inherit
if (eCSSUnit_Enumerated == ourText->mTextAlign.GetUnit()) {
@@ -1394,7 +1408,8 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// text-indent: length, percent, inherit
- SetCoord(ourText->mTextIndent, text->mTextIndent, SETCOORD_LPH, font->mFont, aPresContext);
+ SetCoord(ourText->mTextIndent, text->mTextIndent, parentText->mTextIndent,
+ SETCOORD_LPH, font->mFont, aPresContext);
// text-decoration: none, enum (bit field), inherit
if (eCSSUnit_Enumerated == ourText->mDecoration.GetUnit()) {
@@ -1426,12 +1441,8 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// vertical-align: enum, length, percent, inherit
- if (! SetCoord(ourText->mVerticalAlign, text->mVerticalAlign, SETCOORD_LP | SETCOORD_ENUMERATED,
- font->mFont, aPresContext)) {
- // XXX this really needs to pass the inherit value along...
- if (eCSSUnit_Inherit == ourText->mVerticalAlign.GetUnit()) {
- text->mVerticalAlign = parentText->mVerticalAlign;
- }
+ if (! SetCoord(ourText->mVerticalAlign, text->mVerticalAlign, parentText->mVerticalAlign,
+ SETCOORD_LPH | SETCOORD_ENUMERATED, font->mFont, aPresContext)) {
}
// white-space: enum, normal, inherit
@@ -1446,8 +1457,8 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// word-spacing: normal, length, inherit
- SetCoord(ourText->mWordSpacing, text->mWordSpacing, SETCOORD_LH | SETCOORD_NORMAL,
- font->mFont, aPresContext);
+ SetCoord(ourText->mWordSpacing, text->mWordSpacing, parentText->mWordSpacing,
+ SETCOORD_LH | SETCOORD_NORMAL, font->mFont, aPresContext);
}
}
@@ -1734,16 +1745,21 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
// margin: length, percent, auto, inherit
if (nsnull != ourMargin->mMargin) {
nsStyleCoord coord;
- if (SetCoord(ourMargin->mMargin->mLeft, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ nsStyleCoord parentCoord;
+ parentSpacing->mMargin.GetLeft(parentCoord);
+ if (SetCoord(ourMargin->mMargin->mLeft, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
spacing->mMargin.SetLeft(coord);
}
- if (SetCoord(ourMargin->mMargin->mTop, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentSpacing->mMargin.GetTop(parentCoord);
+ if (SetCoord(ourMargin->mMargin->mTop, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
spacing->mMargin.SetTop(coord);
}
- if (SetCoord(ourMargin->mMargin->mRight, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentSpacing->mMargin.GetRight(parentCoord);
+ if (SetCoord(ourMargin->mMargin->mRight, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
spacing->mMargin.SetRight(coord);
}
- if (SetCoord(ourMargin->mMargin->mBottom, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentSpacing->mMargin.GetBottom(parentCoord);
+ if (SetCoord(ourMargin->mMargin->mBottom, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
spacing->mMargin.SetBottom(coord);
}
}
@@ -1751,16 +1767,21 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
// padding: length, percent, inherit
if (nsnull != ourMargin->mPadding) {
nsStyleCoord coord;
- if (SetCoord(ourMargin->mPadding->mLeft, coord, SETCOORD_LPH, font->mFont, aPresContext)) {
+ nsStyleCoord parentCoord;
+ parentSpacing->mPadding.GetLeft(parentCoord);
+ if (SetCoord(ourMargin->mPadding->mLeft, coord, parentCoord, SETCOORD_LPH, font->mFont, aPresContext)) {
spacing->mPadding.SetLeft(coord);
}
- if (SetCoord(ourMargin->mPadding->mTop, coord, SETCOORD_LPH, font->mFont, aPresContext)) {
+ parentSpacing->mPadding.GetTop(parentCoord);
+ if (SetCoord(ourMargin->mPadding->mTop, coord, parentCoord, SETCOORD_LPH, font->mFont, aPresContext)) {
spacing->mPadding.SetTop(coord);
}
- if (SetCoord(ourMargin->mPadding->mRight, coord, SETCOORD_LPH, font->mFont, aPresContext)) {
+ parentSpacing->mPadding.GetRight(parentCoord);
+ if (SetCoord(ourMargin->mPadding->mRight, coord, parentCoord, SETCOORD_LPH, font->mFont, aPresContext)) {
spacing->mPadding.SetRight(coord);
}
- if (SetCoord(ourMargin->mPadding->mBottom, coord, SETCOORD_LPH, font->mFont, aPresContext)) {
+ parentSpacing->mPadding.GetBottom(parentCoord);
+ if (SetCoord(ourMargin->mPadding->mBottom, coord, parentCoord, SETCOORD_LPH, font->mFont, aPresContext)) {
spacing->mPadding.SetBottom(coord);
}
}
@@ -1768,28 +1789,29 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
// border-size: length, enum, inherit
if (nsnull != ourMargin->mBorderWidth) {
nsStyleCoord coord;
- if (SetCoord(ourMargin->mBorderWidth->mLeft, coord, SETCOORD_LE, font->mFont, aPresContext)) {
+ nsStyleCoord parentCoord;
+ if (SetCoord(ourMargin->mBorderWidth->mLeft, coord, parentCoord, SETCOORD_LE, font->mFont, aPresContext)) {
spacing->mBorder.SetLeft(coord);
}
else if (eCSSUnit_Inherit == ourMargin->mBorderWidth->mLeft.GetUnit()) {
spacing->mBorder.SetLeft(parentSpacing->mBorder.GetLeft(coord));
}
- if (SetCoord(ourMargin->mBorderWidth->mTop, coord, SETCOORD_LE, font->mFont, aPresContext)) {
+ if (SetCoord(ourMargin->mBorderWidth->mTop, coord, parentCoord, SETCOORD_LE, font->mFont, aPresContext)) {
spacing->mBorder.SetTop(coord);
}
else if (eCSSUnit_Inherit == ourMargin->mBorderWidth->mTop.GetUnit()) {
spacing->mBorder.SetTop(parentSpacing->mBorder.GetTop(coord));
}
- if (SetCoord(ourMargin->mBorderWidth->mRight, coord, SETCOORD_LE, font->mFont, aPresContext)) {
+ if (SetCoord(ourMargin->mBorderWidth->mRight, coord, parentCoord, SETCOORD_LE, font->mFont, aPresContext)) {
spacing->mBorder.SetRight(coord);
}
else if (eCSSUnit_Inherit == ourMargin->mBorderWidth->mRight.GetUnit()) {
spacing->mBorder.SetRight(parentSpacing->mBorder.GetRight(coord));
}
- if (SetCoord(ourMargin->mBorderWidth->mBottom, coord, SETCOORD_LE, font->mFont, aPresContext)) {
+ if (SetCoord(ourMargin->mBorderWidth->mBottom, coord, parentCoord, SETCOORD_LE, font->mFont, aPresContext)) {
spacing->mBorder.SetBottom(coord);
}
else if (eCSSUnit_Inherit == ourMargin->mBorderWidth->mBottom.GetUnit()) {
@@ -1909,16 +1931,13 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// -moz-border-radius: length, inherit
- if (! SetCoord(ourMargin->mBorderRadius, spacing->mBorderRadius,
+ if (! SetCoord(ourMargin->mBorderRadius, spacing->mBorderRadius, parentSpacing->mBorderRadius,
SETCOORD_LPH, font->mFont, aPresContext)) {
}
// outline-width: length, enum, inherit
- if (! SetCoord(ourMargin->mOutlineWidth, spacing->mOutlineWidth,
- SETCOORD_LE, font->mFont, aPresContext)) {
- if (eCSSUnit_Inherit == ourMargin->mOutlineWidth.GetUnit()) {
- spacing->mOutlineWidth = parentSpacing->mOutlineWidth;
- }
+ if (! SetCoord(ourMargin->mOutlineWidth, spacing->mOutlineWidth, parentSpacing->mOutlineWidth,
+ SETCOORD_LEH, font->mFont, aPresContext)) {
}
// outline-color: color, string, enum, inherit
@@ -1981,31 +2000,42 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
// box offsets: length, percent, auto, inherit
if (nsnull != ourPosition->mOffset) {
nsStyleCoord coord;
- if (SetCoord(ourPosition->mOffset->mTop, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ nsStyleCoord parentCoord;
+ parentPosition->mOffset.GetTop(parentCoord);
+ if (SetCoord(ourPosition->mOffset->mTop, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
position->mOffset.SetTop(coord);
}
- if (SetCoord(ourPosition->mOffset->mRight, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentPosition->mOffset.GetRight(parentCoord);
+ if (SetCoord(ourPosition->mOffset->mRight, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
position->mOffset.SetRight(coord);
}
- if (SetCoord(ourPosition->mOffset->mBottom, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentPosition->mOffset.GetBottom(parentCoord);
+ if (SetCoord(ourPosition->mOffset->mBottom, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
position->mOffset.SetBottom(coord);
}
- if (SetCoord(ourPosition->mOffset->mLeft, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentPosition->mOffset.GetLeft(parentCoord);
+ if (SetCoord(ourPosition->mOffset->mLeft, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
position->mOffset.SetLeft(coord);
}
}
- SetCoord(ourPosition->mWidth, position->mWidth, SETCOORD_LPAH, font->mFont, aPresContext);
- SetCoord(ourPosition->mMinWidth, position->mMinWidth, SETCOORD_LPH, font->mFont, aPresContext);
- if (! SetCoord(ourPosition->mMaxWidth, position->mMaxWidth, SETCOORD_LPH, font->mFont, aPresContext)) {
+ SetCoord(ourPosition->mWidth, position->mWidth, parentPosition->mWidth,
+ SETCOORD_LPAH, font->mFont, aPresContext);
+ SetCoord(ourPosition->mMinWidth, position->mMinWidth, parentPosition->mMinWidth,
+ SETCOORD_LPH, font->mFont, aPresContext);
+ if (! SetCoord(ourPosition->mMaxWidth, position->mMaxWidth, parentPosition->mMaxWidth,
+ SETCOORD_LPH, font->mFont, aPresContext)) {
if (eCSSUnit_None == ourPosition->mMaxWidth.GetUnit()) {
position->mMaxWidth.Reset();
}
}
- SetCoord(ourPosition->mHeight, position->mHeight, SETCOORD_LPAH, font->mFont, aPresContext);
- SetCoord(ourPosition->mMinHeight, position->mMinHeight, SETCOORD_LPH, font->mFont, aPresContext);
- if (! SetCoord(ourPosition->mMaxHeight, position->mMaxHeight, SETCOORD_LPH, font->mFont, aPresContext)) {
+ SetCoord(ourPosition->mHeight, position->mHeight, parentPosition->mHeight,
+ SETCOORD_LPAH, font->mFont, aPresContext);
+ SetCoord(ourPosition->mMinHeight, position->mMinHeight, parentPosition->mMinHeight,
+ SETCOORD_LPH, font->mFont, aPresContext);
+ if (! SetCoord(ourPosition->mMaxHeight, position->mMaxHeight, parentPosition->mMaxHeight,
+ SETCOORD_LPH, font->mFont, aPresContext)) {
if (eCSSUnit_None == ourPosition->mMaxHeight.GetUnit()) {
position->mMaxHeight.Reset();
}
@@ -2020,7 +2050,13 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// z-index
- SetCoord(ourPosition->mZIndex, position->mZIndex, SETCOORD_IAH, font->mFont, nsnull);
+ if (! SetCoord(ourPosition->mZIndex, position->mZIndex, parentPosition->mZIndex,
+ SETCOORD_IA, font->mFont, nsnull)) {
+ if (eCSSUnit_Inherit == ourPosition->mZIndex.GetUnit()) {
+ // handle inherit, because it's ok to inherit 'auto' here
+ position->mZIndex = parentPosition->mZIndex;
+ }
+ }
}
}
@@ -2086,14 +2122,14 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// border-spacing-x: length, inherit
- if (SetCoord(ourTable->mBorderSpacingX, coord, SETCOORD_LENGTH, font->mFont, aPresContext)) {
+ if (SetCoord(ourTable->mBorderSpacingX, coord, coord, SETCOORD_LENGTH, font->mFont, aPresContext)) {
table->mBorderSpacingX = coord.GetCoordValue();
}
else if (eCSSUnit_Inherit == ourTable->mBorderSpacingX.GetUnit()) {
table->mBorderSpacingX = parentTable->mBorderSpacingX;
}
// border-spacing-y: length, inherit
- if (SetCoord(ourTable->mBorderSpacingY, coord, SETCOORD_LENGTH, font->mFont, aPresContext)) {
+ if (SetCoord(ourTable->mBorderSpacingY, coord, coord, SETCOORD_LENGTH, font->mFont, aPresContext)) {
table->mBorderSpacingY = coord.GetCoordValue();
}
else if (eCSSUnit_Inherit == ourTable->mBorderSpacingY.GetUnit()) {
@@ -2287,11 +2323,8 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// marker-offset: length, auto, inherit
- if (! SetCoord(ourContent->mMarkerOffset, content->mMarkerOffset,
- SETCOORD_LENGTH | SETCOORD_AUTO, font->mFont, aPresContext)) {
- if (eCSSUnit_Inherit == ourContent->mMarkerOffset.GetUnit()) {
- content->mMarkerOffset = parentContent->mMarkerOffset;
- }
+ if (! SetCoord(ourContent->mMarkerOffset, content->mMarkerOffset, parentContent->mMarkerOffset,
+ SETCOORD_LH | SETCOORD_AUTO, font->mFont, aPresContext)) {
}
// quotes: [string string]+, none, inherit
diff --git a/layout/style/nsCSSStyleRule.cpp b/layout/style/nsCSSStyleRule.cpp
index 4ac1a6acad18..47eb8e44d88c 100644
--- a/layout/style/nsCSSStyleRule.cpp
+++ b/layout/style/nsCSSStyleRule.cpp
@@ -409,6 +409,7 @@ PRInt32 nsCSSSelector::CalcWeight(void) const
static nscoord CalcLength(const nsCSSValue& aValue, const nsFont& aFont,
nsIPresContext* aPresContext);
static PRBool SetCoord(const nsCSSValue& aValue, nsStyleCoord& aCoord,
+ const nsStyleCoord& aParentCoord,
PRInt32 aMask, const nsFont& aFont,
nsIPresContext* aPresContext);
@@ -1071,9 +1072,10 @@ nscoord CalcLength(const nsCSSValue& aValue,
#define SETCOORD_LPEH (SETCOORD_LP | SETCOORD_ENUMERATED | SETCOORD_INHERIT)
#define SETCOORD_LE (SETCOORD_LENGTH | SETCOORD_ENUMERATED)
#define SETCOORD_LEH (SETCOORD_LE | SETCOORD_INHERIT)
-#define SETCOORD_IAH (SETCOORD_INTEGER | SETCOORD_AH)
+#define SETCOORD_IA (SETCOORD_INTEGER | SETCOORD_AUTO)
static PRBool SetCoord(const nsCSSValue& aValue, nsStyleCoord& aCoord,
+ const nsStyleCoord& aParentCoord,
PRInt32 aMask, const nsFont& aFont,
nsIPresContext* aPresContext)
{
@@ -1107,7 +1109,18 @@ static PRBool SetCoord(const nsCSSValue& aValue, nsStyleCoord& aCoord,
}
else if (((aMask & SETCOORD_INHERIT) != 0) &&
(aValue.GetUnit() == eCSSUnit_Inherit)) {
- aCoord.SetInheritValue();
+ if ((eStyleUnit_Null == aParentCoord.GetUnit()) || // parent has explicit computed value
+ (eStyleUnit_Factor == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Coord == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Integer == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Enumerated == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Normal == aParentCoord.GetUnit()) ||
+ (eStyleUnit_Chars == aParentCoord.GetUnit())) {
+ aCoord = aParentCoord; // just inherit value from parent
+ }
+ else {
+ aCoord.SetInheritValue(); // needs to be computed by client
+ }
}
else if (((aMask & SETCOORD_NORMAL) != 0) &&
(aValue.GetUnit() == eCSSUnit_Normal)) {
@@ -1376,11 +1389,12 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// letter-spacing: normal, length, inherit
- SetCoord(ourText->mLetterSpacing, text->mLetterSpacing, SETCOORD_LH | SETCOORD_NORMAL,
- font->mFont, aPresContext);
+ SetCoord(ourText->mLetterSpacing, text->mLetterSpacing, parentText->mLetterSpacing,
+ SETCOORD_LH | SETCOORD_NORMAL, font->mFont, aPresContext);
// line-height: normal, number, length, percent, inherit
- SetCoord(ourText->mLineHeight, text->mLineHeight, SETCOORD_LPFHN, font->mFont, aPresContext);
+ SetCoord(ourText->mLineHeight, text->mLineHeight, parentText->mLineHeight,
+ SETCOORD_LPFHN, font->mFont, aPresContext);
// text-align: enum, string, inherit
if (eCSSUnit_Enumerated == ourText->mTextAlign.GetUnit()) {
@@ -1394,7 +1408,8 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// text-indent: length, percent, inherit
- SetCoord(ourText->mTextIndent, text->mTextIndent, SETCOORD_LPH, font->mFont, aPresContext);
+ SetCoord(ourText->mTextIndent, text->mTextIndent, parentText->mTextIndent,
+ SETCOORD_LPH, font->mFont, aPresContext);
// text-decoration: none, enum (bit field), inherit
if (eCSSUnit_Enumerated == ourText->mDecoration.GetUnit()) {
@@ -1426,12 +1441,8 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// vertical-align: enum, length, percent, inherit
- if (! SetCoord(ourText->mVerticalAlign, text->mVerticalAlign, SETCOORD_LP | SETCOORD_ENUMERATED,
- font->mFont, aPresContext)) {
- // XXX this really needs to pass the inherit value along...
- if (eCSSUnit_Inherit == ourText->mVerticalAlign.GetUnit()) {
- text->mVerticalAlign = parentText->mVerticalAlign;
- }
+ if (! SetCoord(ourText->mVerticalAlign, text->mVerticalAlign, parentText->mVerticalAlign,
+ SETCOORD_LPH | SETCOORD_ENUMERATED, font->mFont, aPresContext)) {
}
// white-space: enum, normal, inherit
@@ -1446,8 +1457,8 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// word-spacing: normal, length, inherit
- SetCoord(ourText->mWordSpacing, text->mWordSpacing, SETCOORD_LH | SETCOORD_NORMAL,
- font->mFont, aPresContext);
+ SetCoord(ourText->mWordSpacing, text->mWordSpacing, parentText->mWordSpacing,
+ SETCOORD_LH | SETCOORD_NORMAL, font->mFont, aPresContext);
}
}
@@ -1734,16 +1745,21 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
// margin: length, percent, auto, inherit
if (nsnull != ourMargin->mMargin) {
nsStyleCoord coord;
- if (SetCoord(ourMargin->mMargin->mLeft, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ nsStyleCoord parentCoord;
+ parentSpacing->mMargin.GetLeft(parentCoord);
+ if (SetCoord(ourMargin->mMargin->mLeft, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
spacing->mMargin.SetLeft(coord);
}
- if (SetCoord(ourMargin->mMargin->mTop, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentSpacing->mMargin.GetTop(parentCoord);
+ if (SetCoord(ourMargin->mMargin->mTop, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
spacing->mMargin.SetTop(coord);
}
- if (SetCoord(ourMargin->mMargin->mRight, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentSpacing->mMargin.GetRight(parentCoord);
+ if (SetCoord(ourMargin->mMargin->mRight, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
spacing->mMargin.SetRight(coord);
}
- if (SetCoord(ourMargin->mMargin->mBottom, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentSpacing->mMargin.GetBottom(parentCoord);
+ if (SetCoord(ourMargin->mMargin->mBottom, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
spacing->mMargin.SetBottom(coord);
}
}
@@ -1751,16 +1767,21 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
// padding: length, percent, inherit
if (nsnull != ourMargin->mPadding) {
nsStyleCoord coord;
- if (SetCoord(ourMargin->mPadding->mLeft, coord, SETCOORD_LPH, font->mFont, aPresContext)) {
+ nsStyleCoord parentCoord;
+ parentSpacing->mPadding.GetLeft(parentCoord);
+ if (SetCoord(ourMargin->mPadding->mLeft, coord, parentCoord, SETCOORD_LPH, font->mFont, aPresContext)) {
spacing->mPadding.SetLeft(coord);
}
- if (SetCoord(ourMargin->mPadding->mTop, coord, SETCOORD_LPH, font->mFont, aPresContext)) {
+ parentSpacing->mPadding.GetTop(parentCoord);
+ if (SetCoord(ourMargin->mPadding->mTop, coord, parentCoord, SETCOORD_LPH, font->mFont, aPresContext)) {
spacing->mPadding.SetTop(coord);
}
- if (SetCoord(ourMargin->mPadding->mRight, coord, SETCOORD_LPH, font->mFont, aPresContext)) {
+ parentSpacing->mPadding.GetRight(parentCoord);
+ if (SetCoord(ourMargin->mPadding->mRight, coord, parentCoord, SETCOORD_LPH, font->mFont, aPresContext)) {
spacing->mPadding.SetRight(coord);
}
- if (SetCoord(ourMargin->mPadding->mBottom, coord, SETCOORD_LPH, font->mFont, aPresContext)) {
+ parentSpacing->mPadding.GetBottom(parentCoord);
+ if (SetCoord(ourMargin->mPadding->mBottom, coord, parentCoord, SETCOORD_LPH, font->mFont, aPresContext)) {
spacing->mPadding.SetBottom(coord);
}
}
@@ -1768,28 +1789,29 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
// border-size: length, enum, inherit
if (nsnull != ourMargin->mBorderWidth) {
nsStyleCoord coord;
- if (SetCoord(ourMargin->mBorderWidth->mLeft, coord, SETCOORD_LE, font->mFont, aPresContext)) {
+ nsStyleCoord parentCoord;
+ if (SetCoord(ourMargin->mBorderWidth->mLeft, coord, parentCoord, SETCOORD_LE, font->mFont, aPresContext)) {
spacing->mBorder.SetLeft(coord);
}
else if (eCSSUnit_Inherit == ourMargin->mBorderWidth->mLeft.GetUnit()) {
spacing->mBorder.SetLeft(parentSpacing->mBorder.GetLeft(coord));
}
- if (SetCoord(ourMargin->mBorderWidth->mTop, coord, SETCOORD_LE, font->mFont, aPresContext)) {
+ if (SetCoord(ourMargin->mBorderWidth->mTop, coord, parentCoord, SETCOORD_LE, font->mFont, aPresContext)) {
spacing->mBorder.SetTop(coord);
}
else if (eCSSUnit_Inherit == ourMargin->mBorderWidth->mTop.GetUnit()) {
spacing->mBorder.SetTop(parentSpacing->mBorder.GetTop(coord));
}
- if (SetCoord(ourMargin->mBorderWidth->mRight, coord, SETCOORD_LE, font->mFont, aPresContext)) {
+ if (SetCoord(ourMargin->mBorderWidth->mRight, coord, parentCoord, SETCOORD_LE, font->mFont, aPresContext)) {
spacing->mBorder.SetRight(coord);
}
else if (eCSSUnit_Inherit == ourMargin->mBorderWidth->mRight.GetUnit()) {
spacing->mBorder.SetRight(parentSpacing->mBorder.GetRight(coord));
}
- if (SetCoord(ourMargin->mBorderWidth->mBottom, coord, SETCOORD_LE, font->mFont, aPresContext)) {
+ if (SetCoord(ourMargin->mBorderWidth->mBottom, coord, parentCoord, SETCOORD_LE, font->mFont, aPresContext)) {
spacing->mBorder.SetBottom(coord);
}
else if (eCSSUnit_Inherit == ourMargin->mBorderWidth->mBottom.GetUnit()) {
@@ -1909,16 +1931,13 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// -moz-border-radius: length, inherit
- if (! SetCoord(ourMargin->mBorderRadius, spacing->mBorderRadius,
+ if (! SetCoord(ourMargin->mBorderRadius, spacing->mBorderRadius, parentSpacing->mBorderRadius,
SETCOORD_LPH, font->mFont, aPresContext)) {
}
// outline-width: length, enum, inherit
- if (! SetCoord(ourMargin->mOutlineWidth, spacing->mOutlineWidth,
- SETCOORD_LE, font->mFont, aPresContext)) {
- if (eCSSUnit_Inherit == ourMargin->mOutlineWidth.GetUnit()) {
- spacing->mOutlineWidth = parentSpacing->mOutlineWidth;
- }
+ if (! SetCoord(ourMargin->mOutlineWidth, spacing->mOutlineWidth, parentSpacing->mOutlineWidth,
+ SETCOORD_LEH, font->mFont, aPresContext)) {
}
// outline-color: color, string, enum, inherit
@@ -1981,31 +2000,42 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
// box offsets: length, percent, auto, inherit
if (nsnull != ourPosition->mOffset) {
nsStyleCoord coord;
- if (SetCoord(ourPosition->mOffset->mTop, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ nsStyleCoord parentCoord;
+ parentPosition->mOffset.GetTop(parentCoord);
+ if (SetCoord(ourPosition->mOffset->mTop, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
position->mOffset.SetTop(coord);
}
- if (SetCoord(ourPosition->mOffset->mRight, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentPosition->mOffset.GetRight(parentCoord);
+ if (SetCoord(ourPosition->mOffset->mRight, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
position->mOffset.SetRight(coord);
}
- if (SetCoord(ourPosition->mOffset->mBottom, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentPosition->mOffset.GetBottom(parentCoord);
+ if (SetCoord(ourPosition->mOffset->mBottom, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
position->mOffset.SetBottom(coord);
}
- if (SetCoord(ourPosition->mOffset->mLeft, coord, SETCOORD_LPAH, font->mFont, aPresContext)) {
+ parentPosition->mOffset.GetLeft(parentCoord);
+ if (SetCoord(ourPosition->mOffset->mLeft, coord, parentCoord, SETCOORD_LPAH, font->mFont, aPresContext)) {
position->mOffset.SetLeft(coord);
}
}
- SetCoord(ourPosition->mWidth, position->mWidth, SETCOORD_LPAH, font->mFont, aPresContext);
- SetCoord(ourPosition->mMinWidth, position->mMinWidth, SETCOORD_LPH, font->mFont, aPresContext);
- if (! SetCoord(ourPosition->mMaxWidth, position->mMaxWidth, SETCOORD_LPH, font->mFont, aPresContext)) {
+ SetCoord(ourPosition->mWidth, position->mWidth, parentPosition->mWidth,
+ SETCOORD_LPAH, font->mFont, aPresContext);
+ SetCoord(ourPosition->mMinWidth, position->mMinWidth, parentPosition->mMinWidth,
+ SETCOORD_LPH, font->mFont, aPresContext);
+ if (! SetCoord(ourPosition->mMaxWidth, position->mMaxWidth, parentPosition->mMaxWidth,
+ SETCOORD_LPH, font->mFont, aPresContext)) {
if (eCSSUnit_None == ourPosition->mMaxWidth.GetUnit()) {
position->mMaxWidth.Reset();
}
}
- SetCoord(ourPosition->mHeight, position->mHeight, SETCOORD_LPAH, font->mFont, aPresContext);
- SetCoord(ourPosition->mMinHeight, position->mMinHeight, SETCOORD_LPH, font->mFont, aPresContext);
- if (! SetCoord(ourPosition->mMaxHeight, position->mMaxHeight, SETCOORD_LPH, font->mFont, aPresContext)) {
+ SetCoord(ourPosition->mHeight, position->mHeight, parentPosition->mHeight,
+ SETCOORD_LPAH, font->mFont, aPresContext);
+ SetCoord(ourPosition->mMinHeight, position->mMinHeight, parentPosition->mMinHeight,
+ SETCOORD_LPH, font->mFont, aPresContext);
+ if (! SetCoord(ourPosition->mMaxHeight, position->mMaxHeight, parentPosition->mMaxHeight,
+ SETCOORD_LPH, font->mFont, aPresContext)) {
if (eCSSUnit_None == ourPosition->mMaxHeight.GetUnit()) {
position->mMaxHeight.Reset();
}
@@ -2020,7 +2050,13 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// z-index
- SetCoord(ourPosition->mZIndex, position->mZIndex, SETCOORD_IAH, font->mFont, nsnull);
+ if (! SetCoord(ourPosition->mZIndex, position->mZIndex, parentPosition->mZIndex,
+ SETCOORD_IA, font->mFont, nsnull)) {
+ if (eCSSUnit_Inherit == ourPosition->mZIndex.GetUnit()) {
+ // handle inherit, because it's ok to inherit 'auto' here
+ position->mZIndex = parentPosition->mZIndex;
+ }
+ }
}
}
@@ -2086,14 +2122,14 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// border-spacing-x: length, inherit
- if (SetCoord(ourTable->mBorderSpacingX, coord, SETCOORD_LENGTH, font->mFont, aPresContext)) {
+ if (SetCoord(ourTable->mBorderSpacingX, coord, coord, SETCOORD_LENGTH, font->mFont, aPresContext)) {
table->mBorderSpacingX = coord.GetCoordValue();
}
else if (eCSSUnit_Inherit == ourTable->mBorderSpacingX.GetUnit()) {
table->mBorderSpacingX = parentTable->mBorderSpacingX;
}
// border-spacing-y: length, inherit
- if (SetCoord(ourTable->mBorderSpacingY, coord, SETCOORD_LENGTH, font->mFont, aPresContext)) {
+ if (SetCoord(ourTable->mBorderSpacingY, coord, coord, SETCOORD_LENGTH, font->mFont, aPresContext)) {
table->mBorderSpacingY = coord.GetCoordValue();
}
else if (eCSSUnit_Inherit == ourTable->mBorderSpacingY.GetUnit()) {
@@ -2287,11 +2323,8 @@ void MapDeclarationInto(nsICSSDeclaration* aDeclaration,
}
// marker-offset: length, auto, inherit
- if (! SetCoord(ourContent->mMarkerOffset, content->mMarkerOffset,
- SETCOORD_LENGTH | SETCOORD_AUTO, font->mFont, aPresContext)) {
- if (eCSSUnit_Inherit == ourContent->mMarkerOffset.GetUnit()) {
- content->mMarkerOffset = parentContent->mMarkerOffset;
- }
+ if (! SetCoord(ourContent->mMarkerOffset, content->mMarkerOffset, parentContent->mMarkerOffset,
+ SETCOORD_LH | SETCOORD_AUTO, font->mFont, aPresContext)) {
}
// quotes: [string string]+, none, inherit