From ab167ecc587eb9ee2b8b9f15627cbaa0ba94f5ec Mon Sep 17 00:00:00 2001 From: "pierre%netscape.com" Date: Wed, 22 Dec 1999 11:27:10 +0000 Subject: [PATCH] 16381 "Need to be able to specify -moz-border-radius for each corner". Made changes in the following files in order to store the radius as a nsCSSRect and support 4 new -moz-border-radius properties (topLeft, topRight, bottomRight, bottomLeft): nsCSSDeclaration.cpp nsCSSParser.cpp nsCSSPropList.h nsCSSStyleRule.cpp nsICSSDeclaration.h nsIStyleContext.h nsStyleContext.cpp nsCSSRendering.cpp git-svn-id: svn://10.0.0.236/trunk@56387 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/content/base/src/nsStyleContext.cpp | 2 +- .../html/style/src/nsCSSDeclaration.cpp | 95 +++++++++++++++++-- .../content/html/style/src/nsCSSParser.cpp | 21 +++- .../content/html/style/src/nsCSSPropList.h | 4 + .../content/html/style/src/nsCSSStruct.cpp | 95 +++++++++++++++++-- .../content/html/style/src/nsCSSStyleRule.cpp | 23 ++++- .../html/style/src/nsICSSDeclaration.h | 2 +- mozilla/content/shared/public/nsCSSPropList.h | 4 + mozilla/layout/base/public/nsIStyleContext.h | 3 +- mozilla/layout/base/src/nsStyleContext.cpp | 2 +- .../html/style/src/nsCSSDeclaration.cpp | 95 +++++++++++++++++-- mozilla/layout/html/style/src/nsCSSParser.cpp | 21 +++- mozilla/layout/html/style/src/nsCSSPropList.h | 4 + .../layout/html/style/src/nsCSSStyleRule.cpp | 23 ++++- .../layout/html/style/src/nsICSSDeclaration.h | 2 +- mozilla/layout/style/nsCSSDeclaration.cpp | 95 +++++++++++++++++-- mozilla/layout/style/nsCSSParser.cpp | 21 +++- mozilla/layout/style/nsCSSPropList.h | 4 + mozilla/layout/style/nsCSSStruct.cpp | 95 +++++++++++++++++-- mozilla/layout/style/nsCSSStyleRule.cpp | 23 ++++- mozilla/layout/style/nsStyleContext.cpp | 2 +- 21 files changed, 568 insertions(+), 68 deletions(-) diff --git a/mozilla/content/base/src/nsStyleContext.cpp b/mozilla/content/base/src/nsStyleContext.cpp index 70c416312db..7e147a9265e 100644 --- a/mozilla/content/base/src/nsStyleContext.cpp +++ b/mozilla/content/base/src/nsStyleContext.cpp @@ -566,7 +566,7 @@ void StyleSpacingImpl::ResetFrom(const nsStyleSpacing* aParent, nsIPresContext* mBorderColor[2] = NS_RGB(0, 0, 0); mBorderColor[3] = NS_RGB(0, 0, 0); - mBorderRadius.SetCoordValue(0); + mBorderRadius.Reset(); mOutlineWidth = medium; mOutlineStyle = NS_STYLE_BORDER_STYLE_NONE; diff --git a/mozilla/content/html/style/src/nsCSSDeclaration.cpp b/mozilla/content/html/style/src/nsCSSDeclaration.cpp index 71631711eed..362ace9cab0 100644 --- a/mozilla/content/html/style/src/nsCSSDeclaration.cpp +++ b/mozilla/content/html/style/src/nsCSSDeclaration.cpp @@ -374,14 +374,13 @@ void nsCSSDisplay::List(FILE* out, PRInt32 aIndent) const nsCSSMargin::nsCSSMargin(void) : mMargin(nsnull), mPadding(nsnull), - mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull) + mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), mBorderRadius(nsnull) { } nsCSSMargin::nsCSSMargin(const nsCSSMargin& aCopy) : mMargin(nsnull), mPadding(nsnull), - mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), - mBorderRadius(aCopy.mBorderRadius), + mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), mBorderRadius(nsnull), mOutlineWidth(aCopy.mOutlineWidth), mOutlineColor(aCopy.mOutlineColor), mOutlineStyle(aCopy.mOutlineStyle), @@ -392,6 +391,7 @@ nsCSSMargin::nsCSSMargin(const nsCSSMargin& aCopy) CSS_IF_COPY(mBorderWidth, nsCSSRect); CSS_IF_COPY(mBorderColor, nsCSSRect); CSS_IF_COPY(mBorderStyle, nsCSSRect); + CSS_IF_COPY(mBorderRadius, nsCSSRect); } nsCSSMargin::~nsCSSMargin(void) @@ -401,6 +401,7 @@ nsCSSMargin::~nsCSSMargin(void) CSS_IF_DELETE(mBorderWidth); CSS_IF_DELETE(mBorderColor); CSS_IF_DELETE(mBorderStyle); + CSS_IF_DELETE(mBorderRadius); } const nsID& nsCSSMargin::GetID(void) @@ -443,11 +444,19 @@ void nsCSSMargin::List(FILE* out, PRInt32 aIndent) const if (nsnull != mBorderStyle) { mBorderStyle->List(out, eCSSProperty_border_style, aIndent); } + if (nsnull != mBorderRadius) { + static const nsCSSProperty trbl[] = { + eCSSProperty__moz_border_radius_topLeft, + eCSSProperty__moz_border_radius_topRight, + eCSSProperty__moz_border_radius_bottomRight, + eCSSProperty__moz_border_radius_bottomLeft + }; + mBorderRadius->List(out, aIndent, trbl); + } for (PRInt32 index = aIndent; --index >= 0; ) fputs(" ", out); nsAutoString buffer; - mBorderRadius.AppendToString(buffer, eCSSProperty__moz_border_radius); mOutlineWidth.AppendToString(buffer, eCSSProperty_outline_width); mOutlineColor.AppendToString(buffer, eCSSProperty_outline_color); mOutlineStyle.AppendToString(buffer, eCSSProperty_outline_style); @@ -1362,14 +1371,29 @@ CSSDeclarationImpl::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValu } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + CSS_ENSURE(Margin) { + CSS_ENSURE_RECT(mMargin->mBorderRadius) { + switch (aProperty) { + case eCSSProperty__moz_border_radius_topLeft: mMargin->mBorderRadius->mTop = aValue; break; + case eCSSProperty__moz_border_radius_topRight: mMargin->mBorderRadius->mRight = aValue; break; + case eCSSProperty__moz_border_radius_bottomRight: mMargin->mBorderRadius->mBottom = aValue; break; + case eCSSProperty__moz_border_radius_bottomLeft: mMargin->mBorderRadius->mLeft = aValue; break; + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: case eCSSProperty_float_edge: CSS_ENSURE(Margin) { switch (aProperty) { - case eCSSProperty__moz_border_radius: mMargin->mBorderRadius = aValue; break; case eCSSProperty_outline_width: mMargin->mOutlineWidth = aValue; break; case eCSSProperty_outline_color: mMargin->mOutlineColor = aValue; break; case eCSSProperty_outline_style: mMargin->mOutlineStyle = aValue; break; @@ -1629,6 +1653,7 @@ CSSDeclarationImpl::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValu case eCSSProperty_border_color: case eCSSProperty_border_style: case eCSSProperty_border_width: + case eCSSProperty__moz_border_radius: NS_ERROR("can't append shorthand properties"); // default: // XXX explicitly removing default case so compiler will help find missed props case eCSSProperty_UNKNOWN: @@ -2015,7 +2040,27 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + if (nsnull != mMargin) { + if (nsnull != mMargin->mBorderRadius) { + CSS_ENSURE_IMPORTANT(Margin) { + CSS_ENSURE_RECT(mImportant->mMargin->mBorderRadius) { + switch (aProperty) { + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_topLeft, mMargin->mBorderRadius->mTop); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_topRight, mMargin->mBorderRadius->mRight); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_bottomRight, mMargin->mBorderRadius->mBottom); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_bottomLeft, mMargin->mBorderRadius->mLeft); + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + } + } + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: @@ -2023,7 +2068,6 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) if (nsnull != mMargin) { CSS_ENSURE_IMPORTANT(Margin) { switch (aProperty) { - CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius, mMargin->mBorderRadius); CSS_CASE_IMPORTANT(eCSSProperty_outline_width, mMargin->mOutlineWidth); CSS_CASE_IMPORTANT(eCSSProperty_outline_color, mMargin->mOutlineColor); CSS_CASE_IMPORTANT(eCSSProperty_outline_style, mMargin->mOutlineStyle); @@ -2422,6 +2466,12 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) SetValueImportant(eCSSProperty_border_bottom_width); SetValueImportant(eCSSProperty_border_left_width); break; + case eCSSProperty__moz_border_radius: + SetValueImportant(eCSSProperty__moz_border_radius_topLeft); + SetValueImportant(eCSSProperty__moz_border_radius_topRight); + SetValueImportant(eCSSProperty__moz_border_radius_bottomRight); + SetValueImportant(eCSSProperty__moz_border_radius_bottomLeft); + break; default: result = NS_ERROR_ILLEGAL_VALUE; break; @@ -2691,14 +2741,30 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue) } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + if ((nsnull != mMargin) && (nsnull != mMargin->mBorderRadius)) { + switch (aProperty) { + case eCSSProperty__moz_border_radius_topLeft: aValue = mMargin->mBorderRadius->mTop; break; + case eCSSProperty__moz_border_radius_topRight: aValue = mMargin->mBorderRadius->mRight; break; + case eCSSProperty__moz_border_radius_bottomRight: aValue = mMargin->mBorderRadius->mBottom; break; + case eCSSProperty__moz_border_radius_bottomLeft: aValue = mMargin->mBorderRadius->mLeft; break; + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + else { + aValue.Reset(); + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: case eCSSProperty_float_edge: if (nsnull != mMargin) { switch (aProperty) { - case eCSSProperty__moz_border_radius: aValue = mMargin->mBorderRadius; break; case eCSSProperty_outline_width: aValue = mMargin->mOutlineWidth; break; case eCSSProperty_outline_color: aValue = mMargin->mOutlineColor; break; case eCSSProperty_outline_style: aValue = mMargin->mOutlineStyle; break; @@ -2981,6 +3047,7 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue) case eCSSProperty_border_color: case eCSSProperty_border_style: case eCSSProperty_border_width: + case eCSSProperty__moz_border_radius: NS_ERROR("can't query for shorthand properties"); default: result = NS_ERROR_ILLEGAL_VALUE; @@ -3344,6 +3411,14 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsString& aValue) AppendValueToString(eCSSProperty_border_left_style, aValue); } break; + case eCSSProperty__moz_border_radius: + if (HAS_RECT(mMargin,mBorderRadius)) { + AppendValueToString(eCSSProperty__moz_border_radius_topLeft, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_topRight, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_bottomRight, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_bottomLeft, aValue); + } + break; case eCSSProperty_border_width: if (HAS_RECT(mMargin,mBorderWidth)) { AppendValueToString(eCSSProperty_border_top_width, aValue); aValue.Append(' '); diff --git a/mozilla/content/html/style/src/nsCSSParser.cpp b/mozilla/content/html/style/src/nsCSSParser.cpp index 6d8501b0e3e..dd0e43d63ef 100644 --- a/mozilla/content/html/style/src/nsCSSParser.cpp +++ b/mozilla/content/html/style/src/nsCSSParser.cpp @@ -205,6 +205,7 @@ protected: const nsCSSProperty aPropIDs[], PRInt32& aChangeHint); PRBool ParseBorderStyle(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); PRBool ParseBorderWidth(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); + PRBool ParseBorderRadius(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); PRBool ParseClip(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); PRBool ParseContent(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); PRBool ParseCounterData(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, @@ -2632,6 +2633,8 @@ PRBool CSSParserImpl::ParseProperty(PRInt32& aErrorCode, return ParseBorderSide(aErrorCode, aDeclaration, kBorderTopIDs, aChangeHint); case eCSSProperty_border_width: return ParseBorderWidth(aErrorCode, aDeclaration, aChangeHint); + case eCSSProperty__moz_border_radius: + return ParseBorderRadius(aErrorCode, aDeclaration, aChangeHint); case eCSSProperty_clip: return ParseClip(aErrorCode, aDeclaration, aChangeHint); case eCSSProperty_content: @@ -2814,7 +2817,10 @@ PRBool CSSParserImpl::ParseSingleValueProperty(PRInt32& aErrorCode, case eCSSProperty_border_top_width: return ParseVariant(aErrorCode, aValue, VARIANT_HKL, nsCSSProps::kBorderWidthKTable); - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: return ParseVariant(aErrorCode, aValue, VARIANT_HLP, nsnull); case eCSSProperty_bottom: case eCSSProperty_top: @@ -3290,6 +3296,12 @@ static const nsCSSProperty kBorderColorIDs[] = { eCSSProperty_border_bottom_color, eCSSProperty_border_left_color }; +static const nsCSSProperty kBorderRadiusIDs[] = { + eCSSProperty__moz_border_radius_topLeft, + eCSSProperty__moz_border_radius_topRight, + eCSSProperty__moz_border_radius_bottomRight, + eCSSProperty__moz_border_radius_bottomLeft +}; PRBool CSSParserImpl::ParseBorder(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint) @@ -3406,6 +3418,13 @@ PRBool CSSParserImpl::ParseBorderWidth(PRInt32& aErrorCode, nsICSSDeclaration* a return ParseBoxProperties(aErrorCode, aDeclaration, kBorderWidthIDs, aChangeHint); } +PRBool CSSParserImpl::ParseBorderRadius(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, + PRInt32& aChangeHint) +{ + return ParseBoxProperties(aErrorCode, aDeclaration, kBorderRadiusIDs, aChangeHint); +} + + PRBool CSSParserImpl::ParseClip(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint) { diff --git a/mozilla/content/html/style/src/nsCSSPropList.h b/mozilla/content/html/style/src/nsCSSPropList.h index 5546bf66651..e07c4095493 100644 --- a/mozilla/content/html/style/src/nsCSSPropList.h +++ b/mozilla/content/html/style/src/nsCSSPropList.h @@ -43,6 +43,10 @@ CSS_PROP(_moz_border_radius, VISUAL) +CSS_PROP(_moz_border_radius_topLeft, VISUAL) +CSS_PROP(_moz_border_radius_topRight, VISUAL) +CSS_PROP(_moz_border_radius_bottomLeft, VISUAL) +CSS_PROP(_moz_border_radius_bottomRight, VISUAL) CSS_PROP(azimuth, AURAL) CSS_PROP(background, VISUAL) CSS_PROP(background_attachment, VISUAL) diff --git a/mozilla/content/html/style/src/nsCSSStruct.cpp b/mozilla/content/html/style/src/nsCSSStruct.cpp index 71631711eed..362ace9cab0 100644 --- a/mozilla/content/html/style/src/nsCSSStruct.cpp +++ b/mozilla/content/html/style/src/nsCSSStruct.cpp @@ -374,14 +374,13 @@ void nsCSSDisplay::List(FILE* out, PRInt32 aIndent) const nsCSSMargin::nsCSSMargin(void) : mMargin(nsnull), mPadding(nsnull), - mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull) + mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), mBorderRadius(nsnull) { } nsCSSMargin::nsCSSMargin(const nsCSSMargin& aCopy) : mMargin(nsnull), mPadding(nsnull), - mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), - mBorderRadius(aCopy.mBorderRadius), + mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), mBorderRadius(nsnull), mOutlineWidth(aCopy.mOutlineWidth), mOutlineColor(aCopy.mOutlineColor), mOutlineStyle(aCopy.mOutlineStyle), @@ -392,6 +391,7 @@ nsCSSMargin::nsCSSMargin(const nsCSSMargin& aCopy) CSS_IF_COPY(mBorderWidth, nsCSSRect); CSS_IF_COPY(mBorderColor, nsCSSRect); CSS_IF_COPY(mBorderStyle, nsCSSRect); + CSS_IF_COPY(mBorderRadius, nsCSSRect); } nsCSSMargin::~nsCSSMargin(void) @@ -401,6 +401,7 @@ nsCSSMargin::~nsCSSMargin(void) CSS_IF_DELETE(mBorderWidth); CSS_IF_DELETE(mBorderColor); CSS_IF_DELETE(mBorderStyle); + CSS_IF_DELETE(mBorderRadius); } const nsID& nsCSSMargin::GetID(void) @@ -443,11 +444,19 @@ void nsCSSMargin::List(FILE* out, PRInt32 aIndent) const if (nsnull != mBorderStyle) { mBorderStyle->List(out, eCSSProperty_border_style, aIndent); } + if (nsnull != mBorderRadius) { + static const nsCSSProperty trbl[] = { + eCSSProperty__moz_border_radius_topLeft, + eCSSProperty__moz_border_radius_topRight, + eCSSProperty__moz_border_radius_bottomRight, + eCSSProperty__moz_border_radius_bottomLeft + }; + mBorderRadius->List(out, aIndent, trbl); + } for (PRInt32 index = aIndent; --index >= 0; ) fputs(" ", out); nsAutoString buffer; - mBorderRadius.AppendToString(buffer, eCSSProperty__moz_border_radius); mOutlineWidth.AppendToString(buffer, eCSSProperty_outline_width); mOutlineColor.AppendToString(buffer, eCSSProperty_outline_color); mOutlineStyle.AppendToString(buffer, eCSSProperty_outline_style); @@ -1362,14 +1371,29 @@ CSSDeclarationImpl::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValu } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + CSS_ENSURE(Margin) { + CSS_ENSURE_RECT(mMargin->mBorderRadius) { + switch (aProperty) { + case eCSSProperty__moz_border_radius_topLeft: mMargin->mBorderRadius->mTop = aValue; break; + case eCSSProperty__moz_border_radius_topRight: mMargin->mBorderRadius->mRight = aValue; break; + case eCSSProperty__moz_border_radius_bottomRight: mMargin->mBorderRadius->mBottom = aValue; break; + case eCSSProperty__moz_border_radius_bottomLeft: mMargin->mBorderRadius->mLeft = aValue; break; + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: case eCSSProperty_float_edge: CSS_ENSURE(Margin) { switch (aProperty) { - case eCSSProperty__moz_border_radius: mMargin->mBorderRadius = aValue; break; case eCSSProperty_outline_width: mMargin->mOutlineWidth = aValue; break; case eCSSProperty_outline_color: mMargin->mOutlineColor = aValue; break; case eCSSProperty_outline_style: mMargin->mOutlineStyle = aValue; break; @@ -1629,6 +1653,7 @@ CSSDeclarationImpl::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValu case eCSSProperty_border_color: case eCSSProperty_border_style: case eCSSProperty_border_width: + case eCSSProperty__moz_border_radius: NS_ERROR("can't append shorthand properties"); // default: // XXX explicitly removing default case so compiler will help find missed props case eCSSProperty_UNKNOWN: @@ -2015,7 +2040,27 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + if (nsnull != mMargin) { + if (nsnull != mMargin->mBorderRadius) { + CSS_ENSURE_IMPORTANT(Margin) { + CSS_ENSURE_RECT(mImportant->mMargin->mBorderRadius) { + switch (aProperty) { + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_topLeft, mMargin->mBorderRadius->mTop); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_topRight, mMargin->mBorderRadius->mRight); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_bottomRight, mMargin->mBorderRadius->mBottom); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_bottomLeft, mMargin->mBorderRadius->mLeft); + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + } + } + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: @@ -2023,7 +2068,6 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) if (nsnull != mMargin) { CSS_ENSURE_IMPORTANT(Margin) { switch (aProperty) { - CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius, mMargin->mBorderRadius); CSS_CASE_IMPORTANT(eCSSProperty_outline_width, mMargin->mOutlineWidth); CSS_CASE_IMPORTANT(eCSSProperty_outline_color, mMargin->mOutlineColor); CSS_CASE_IMPORTANT(eCSSProperty_outline_style, mMargin->mOutlineStyle); @@ -2422,6 +2466,12 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) SetValueImportant(eCSSProperty_border_bottom_width); SetValueImportant(eCSSProperty_border_left_width); break; + case eCSSProperty__moz_border_radius: + SetValueImportant(eCSSProperty__moz_border_radius_topLeft); + SetValueImportant(eCSSProperty__moz_border_radius_topRight); + SetValueImportant(eCSSProperty__moz_border_radius_bottomRight); + SetValueImportant(eCSSProperty__moz_border_radius_bottomLeft); + break; default: result = NS_ERROR_ILLEGAL_VALUE; break; @@ -2691,14 +2741,30 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue) } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + if ((nsnull != mMargin) && (nsnull != mMargin->mBorderRadius)) { + switch (aProperty) { + case eCSSProperty__moz_border_radius_topLeft: aValue = mMargin->mBorderRadius->mTop; break; + case eCSSProperty__moz_border_radius_topRight: aValue = mMargin->mBorderRadius->mRight; break; + case eCSSProperty__moz_border_radius_bottomRight: aValue = mMargin->mBorderRadius->mBottom; break; + case eCSSProperty__moz_border_radius_bottomLeft: aValue = mMargin->mBorderRadius->mLeft; break; + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + else { + aValue.Reset(); + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: case eCSSProperty_float_edge: if (nsnull != mMargin) { switch (aProperty) { - case eCSSProperty__moz_border_radius: aValue = mMargin->mBorderRadius; break; case eCSSProperty_outline_width: aValue = mMargin->mOutlineWidth; break; case eCSSProperty_outline_color: aValue = mMargin->mOutlineColor; break; case eCSSProperty_outline_style: aValue = mMargin->mOutlineStyle; break; @@ -2981,6 +3047,7 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue) case eCSSProperty_border_color: case eCSSProperty_border_style: case eCSSProperty_border_width: + case eCSSProperty__moz_border_radius: NS_ERROR("can't query for shorthand properties"); default: result = NS_ERROR_ILLEGAL_VALUE; @@ -3344,6 +3411,14 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsString& aValue) AppendValueToString(eCSSProperty_border_left_style, aValue); } break; + case eCSSProperty__moz_border_radius: + if (HAS_RECT(mMargin,mBorderRadius)) { + AppendValueToString(eCSSProperty__moz_border_radius_topLeft, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_topRight, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_bottomRight, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_bottomLeft, aValue); + } + break; case eCSSProperty_border_width: if (HAS_RECT(mMargin,mBorderWidth)) { AppendValueToString(eCSSProperty_border_top_width, aValue); aValue.Append(' '); diff --git a/mozilla/content/html/style/src/nsCSSStyleRule.cpp b/mozilla/content/html/style/src/nsCSSStyleRule.cpp index 549d2f68afe..bb815f2ec7a 100644 --- a/mozilla/content/html/style/src/nsCSSStyleRule.cpp +++ b/mozilla/content/html/style/src/nsCSSStyleRule.cpp @@ -1997,9 +1997,26 @@ MapDeclarationMarginInto(nsICSSDeclaration* aDeclaration, } } - // -moz-border-radius: length, inherit - if (! SetCoord(ourMargin->mBorderRadius, spacing->mBorderRadius, parentSpacing->mBorderRadius, - SETCOORD_LPH, aFont->mFont, aPresContext)) { + // -moz-border-radius: length, percent, inherit + if (nsnull != ourMargin->mBorderRadius) { + nsStyleCoord coord; + nsStyleCoord parentCoord; + parentSpacing->mBorderRadius.GetLeft(parentCoord); + if (SetCoord(ourMargin->mBorderRadius->mLeft, coord, parentCoord, SETCOORD_LPH, aFont->mFont, aPresContext)) { + spacing->mBorderRadius.SetLeft(coord); + } + parentSpacing->mBorderRadius.GetTop(parentCoord); + if (SetCoord(ourMargin->mBorderRadius->mTop, coord, parentCoord, SETCOORD_LPH, aFont->mFont, aPresContext)) { + spacing->mBorderRadius.SetTop(coord); + } + parentSpacing->mBorderRadius.GetRight(parentCoord); + if (SetCoord(ourMargin->mBorderRadius->mRight, coord, parentCoord, SETCOORD_LPH, aFont->mFont, aPresContext)) { + spacing->mBorderRadius.SetRight(coord); + } + parentSpacing->mBorderRadius.GetBottom(parentCoord); + if (SetCoord(ourMargin->mBorderRadius->mBottom, coord, parentCoord, SETCOORD_LPH, aFont->mFont, aPresContext)) { + spacing->mBorderRadius.SetBottom(coord); + } } // outline-width: length, enum, inherit diff --git a/mozilla/content/html/style/src/nsICSSDeclaration.h b/mozilla/content/html/style/src/nsICSSDeclaration.h index dda28d9b0b4..3155fe03612 100644 --- a/mozilla/content/html/style/src/nsICSSDeclaration.h +++ b/mozilla/content/html/style/src/nsICSSDeclaration.h @@ -215,7 +215,7 @@ struct nsCSSMargin : public nsCSSStruct { nsCSSRect* mBorderWidth; nsCSSRect* mBorderColor; nsCSSRect* mBorderStyle; - nsCSSValue mBorderRadius; // (extension) + nsCSSRect* mBorderRadius; // (extension) nsCSSValue mOutlineWidth; nsCSSValue mOutlineColor; nsCSSValue mOutlineStyle; diff --git a/mozilla/content/shared/public/nsCSSPropList.h b/mozilla/content/shared/public/nsCSSPropList.h index 5546bf66651..e07c4095493 100644 --- a/mozilla/content/shared/public/nsCSSPropList.h +++ b/mozilla/content/shared/public/nsCSSPropList.h @@ -43,6 +43,10 @@ CSS_PROP(_moz_border_radius, VISUAL) +CSS_PROP(_moz_border_radius_topLeft, VISUAL) +CSS_PROP(_moz_border_radius_topRight, VISUAL) +CSS_PROP(_moz_border_radius_bottomLeft, VISUAL) +CSS_PROP(_moz_border_radius_bottomRight, VISUAL) CSS_PROP(azimuth, AURAL) CSS_PROP(background, VISUAL) CSS_PROP(background_attachment, VISUAL) diff --git a/mozilla/layout/base/public/nsIStyleContext.h b/mozilla/layout/base/public/nsIStyleContext.h index 7943e3fb029..12f73de9b3e 100644 --- a/mozilla/layout/base/public/nsIStyleContext.h +++ b/mozilla/layout/base/public/nsIStyleContext.h @@ -84,7 +84,8 @@ struct nsStyleSpacing: public nsStyleStruct { nsStyleSides mPadding; // [reset] length, percent, inherit nsStyleSides mBorder; // [reset] length, enum (see nsStyleConsts.h) - nsStyleCoord mBorderRadius; // [reset] length, percent, inherit + nsStyleSides mBorderRadius; // [reset] length, percent, inherit + // (top=topLeft, right=topRight, bottom=bottomRight, left=bottomLeft) nsStyleCoord mOutlineWidth; // [reset] length, enum (see nsStyleConsts.h) diff --git a/mozilla/layout/base/src/nsStyleContext.cpp b/mozilla/layout/base/src/nsStyleContext.cpp index 70c416312db..7e147a9265e 100644 --- a/mozilla/layout/base/src/nsStyleContext.cpp +++ b/mozilla/layout/base/src/nsStyleContext.cpp @@ -566,7 +566,7 @@ void StyleSpacingImpl::ResetFrom(const nsStyleSpacing* aParent, nsIPresContext* mBorderColor[2] = NS_RGB(0, 0, 0); mBorderColor[3] = NS_RGB(0, 0, 0); - mBorderRadius.SetCoordValue(0); + mBorderRadius.Reset(); mOutlineWidth = medium; mOutlineStyle = NS_STYLE_BORDER_STYLE_NONE; diff --git a/mozilla/layout/html/style/src/nsCSSDeclaration.cpp b/mozilla/layout/html/style/src/nsCSSDeclaration.cpp index 71631711eed..362ace9cab0 100644 --- a/mozilla/layout/html/style/src/nsCSSDeclaration.cpp +++ b/mozilla/layout/html/style/src/nsCSSDeclaration.cpp @@ -374,14 +374,13 @@ void nsCSSDisplay::List(FILE* out, PRInt32 aIndent) const nsCSSMargin::nsCSSMargin(void) : mMargin(nsnull), mPadding(nsnull), - mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull) + mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), mBorderRadius(nsnull) { } nsCSSMargin::nsCSSMargin(const nsCSSMargin& aCopy) : mMargin(nsnull), mPadding(nsnull), - mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), - mBorderRadius(aCopy.mBorderRadius), + mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), mBorderRadius(nsnull), mOutlineWidth(aCopy.mOutlineWidth), mOutlineColor(aCopy.mOutlineColor), mOutlineStyle(aCopy.mOutlineStyle), @@ -392,6 +391,7 @@ nsCSSMargin::nsCSSMargin(const nsCSSMargin& aCopy) CSS_IF_COPY(mBorderWidth, nsCSSRect); CSS_IF_COPY(mBorderColor, nsCSSRect); CSS_IF_COPY(mBorderStyle, nsCSSRect); + CSS_IF_COPY(mBorderRadius, nsCSSRect); } nsCSSMargin::~nsCSSMargin(void) @@ -401,6 +401,7 @@ nsCSSMargin::~nsCSSMargin(void) CSS_IF_DELETE(mBorderWidth); CSS_IF_DELETE(mBorderColor); CSS_IF_DELETE(mBorderStyle); + CSS_IF_DELETE(mBorderRadius); } const nsID& nsCSSMargin::GetID(void) @@ -443,11 +444,19 @@ void nsCSSMargin::List(FILE* out, PRInt32 aIndent) const if (nsnull != mBorderStyle) { mBorderStyle->List(out, eCSSProperty_border_style, aIndent); } + if (nsnull != mBorderRadius) { + static const nsCSSProperty trbl[] = { + eCSSProperty__moz_border_radius_topLeft, + eCSSProperty__moz_border_radius_topRight, + eCSSProperty__moz_border_radius_bottomRight, + eCSSProperty__moz_border_radius_bottomLeft + }; + mBorderRadius->List(out, aIndent, trbl); + } for (PRInt32 index = aIndent; --index >= 0; ) fputs(" ", out); nsAutoString buffer; - mBorderRadius.AppendToString(buffer, eCSSProperty__moz_border_radius); mOutlineWidth.AppendToString(buffer, eCSSProperty_outline_width); mOutlineColor.AppendToString(buffer, eCSSProperty_outline_color); mOutlineStyle.AppendToString(buffer, eCSSProperty_outline_style); @@ -1362,14 +1371,29 @@ CSSDeclarationImpl::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValu } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + CSS_ENSURE(Margin) { + CSS_ENSURE_RECT(mMargin->mBorderRadius) { + switch (aProperty) { + case eCSSProperty__moz_border_radius_topLeft: mMargin->mBorderRadius->mTop = aValue; break; + case eCSSProperty__moz_border_radius_topRight: mMargin->mBorderRadius->mRight = aValue; break; + case eCSSProperty__moz_border_radius_bottomRight: mMargin->mBorderRadius->mBottom = aValue; break; + case eCSSProperty__moz_border_radius_bottomLeft: mMargin->mBorderRadius->mLeft = aValue; break; + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: case eCSSProperty_float_edge: CSS_ENSURE(Margin) { switch (aProperty) { - case eCSSProperty__moz_border_radius: mMargin->mBorderRadius = aValue; break; case eCSSProperty_outline_width: mMargin->mOutlineWidth = aValue; break; case eCSSProperty_outline_color: mMargin->mOutlineColor = aValue; break; case eCSSProperty_outline_style: mMargin->mOutlineStyle = aValue; break; @@ -1629,6 +1653,7 @@ CSSDeclarationImpl::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValu case eCSSProperty_border_color: case eCSSProperty_border_style: case eCSSProperty_border_width: + case eCSSProperty__moz_border_radius: NS_ERROR("can't append shorthand properties"); // default: // XXX explicitly removing default case so compiler will help find missed props case eCSSProperty_UNKNOWN: @@ -2015,7 +2040,27 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + if (nsnull != mMargin) { + if (nsnull != mMargin->mBorderRadius) { + CSS_ENSURE_IMPORTANT(Margin) { + CSS_ENSURE_RECT(mImportant->mMargin->mBorderRadius) { + switch (aProperty) { + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_topLeft, mMargin->mBorderRadius->mTop); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_topRight, mMargin->mBorderRadius->mRight); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_bottomRight, mMargin->mBorderRadius->mBottom); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_bottomLeft, mMargin->mBorderRadius->mLeft); + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + } + } + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: @@ -2023,7 +2068,6 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) if (nsnull != mMargin) { CSS_ENSURE_IMPORTANT(Margin) { switch (aProperty) { - CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius, mMargin->mBorderRadius); CSS_CASE_IMPORTANT(eCSSProperty_outline_width, mMargin->mOutlineWidth); CSS_CASE_IMPORTANT(eCSSProperty_outline_color, mMargin->mOutlineColor); CSS_CASE_IMPORTANT(eCSSProperty_outline_style, mMargin->mOutlineStyle); @@ -2422,6 +2466,12 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) SetValueImportant(eCSSProperty_border_bottom_width); SetValueImportant(eCSSProperty_border_left_width); break; + case eCSSProperty__moz_border_radius: + SetValueImportant(eCSSProperty__moz_border_radius_topLeft); + SetValueImportant(eCSSProperty__moz_border_radius_topRight); + SetValueImportant(eCSSProperty__moz_border_radius_bottomRight); + SetValueImportant(eCSSProperty__moz_border_radius_bottomLeft); + break; default: result = NS_ERROR_ILLEGAL_VALUE; break; @@ -2691,14 +2741,30 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue) } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + if ((nsnull != mMargin) && (nsnull != mMargin->mBorderRadius)) { + switch (aProperty) { + case eCSSProperty__moz_border_radius_topLeft: aValue = mMargin->mBorderRadius->mTop; break; + case eCSSProperty__moz_border_radius_topRight: aValue = mMargin->mBorderRadius->mRight; break; + case eCSSProperty__moz_border_radius_bottomRight: aValue = mMargin->mBorderRadius->mBottom; break; + case eCSSProperty__moz_border_radius_bottomLeft: aValue = mMargin->mBorderRadius->mLeft; break; + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + else { + aValue.Reset(); + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: case eCSSProperty_float_edge: if (nsnull != mMargin) { switch (aProperty) { - case eCSSProperty__moz_border_radius: aValue = mMargin->mBorderRadius; break; case eCSSProperty_outline_width: aValue = mMargin->mOutlineWidth; break; case eCSSProperty_outline_color: aValue = mMargin->mOutlineColor; break; case eCSSProperty_outline_style: aValue = mMargin->mOutlineStyle; break; @@ -2981,6 +3047,7 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue) case eCSSProperty_border_color: case eCSSProperty_border_style: case eCSSProperty_border_width: + case eCSSProperty__moz_border_radius: NS_ERROR("can't query for shorthand properties"); default: result = NS_ERROR_ILLEGAL_VALUE; @@ -3344,6 +3411,14 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsString& aValue) AppendValueToString(eCSSProperty_border_left_style, aValue); } break; + case eCSSProperty__moz_border_radius: + if (HAS_RECT(mMargin,mBorderRadius)) { + AppendValueToString(eCSSProperty__moz_border_radius_topLeft, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_topRight, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_bottomRight, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_bottomLeft, aValue); + } + break; case eCSSProperty_border_width: if (HAS_RECT(mMargin,mBorderWidth)) { AppendValueToString(eCSSProperty_border_top_width, aValue); aValue.Append(' '); diff --git a/mozilla/layout/html/style/src/nsCSSParser.cpp b/mozilla/layout/html/style/src/nsCSSParser.cpp index 6d8501b0e3e..dd0e43d63ef 100644 --- a/mozilla/layout/html/style/src/nsCSSParser.cpp +++ b/mozilla/layout/html/style/src/nsCSSParser.cpp @@ -205,6 +205,7 @@ protected: const nsCSSProperty aPropIDs[], PRInt32& aChangeHint); PRBool ParseBorderStyle(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); PRBool ParseBorderWidth(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); + PRBool ParseBorderRadius(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); PRBool ParseClip(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); PRBool ParseContent(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); PRBool ParseCounterData(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, @@ -2632,6 +2633,8 @@ PRBool CSSParserImpl::ParseProperty(PRInt32& aErrorCode, return ParseBorderSide(aErrorCode, aDeclaration, kBorderTopIDs, aChangeHint); case eCSSProperty_border_width: return ParseBorderWidth(aErrorCode, aDeclaration, aChangeHint); + case eCSSProperty__moz_border_radius: + return ParseBorderRadius(aErrorCode, aDeclaration, aChangeHint); case eCSSProperty_clip: return ParseClip(aErrorCode, aDeclaration, aChangeHint); case eCSSProperty_content: @@ -2814,7 +2817,10 @@ PRBool CSSParserImpl::ParseSingleValueProperty(PRInt32& aErrorCode, case eCSSProperty_border_top_width: return ParseVariant(aErrorCode, aValue, VARIANT_HKL, nsCSSProps::kBorderWidthKTable); - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: return ParseVariant(aErrorCode, aValue, VARIANT_HLP, nsnull); case eCSSProperty_bottom: case eCSSProperty_top: @@ -3290,6 +3296,12 @@ static const nsCSSProperty kBorderColorIDs[] = { eCSSProperty_border_bottom_color, eCSSProperty_border_left_color }; +static const nsCSSProperty kBorderRadiusIDs[] = { + eCSSProperty__moz_border_radius_topLeft, + eCSSProperty__moz_border_radius_topRight, + eCSSProperty__moz_border_radius_bottomRight, + eCSSProperty__moz_border_radius_bottomLeft +}; PRBool CSSParserImpl::ParseBorder(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint) @@ -3406,6 +3418,13 @@ PRBool CSSParserImpl::ParseBorderWidth(PRInt32& aErrorCode, nsICSSDeclaration* a return ParseBoxProperties(aErrorCode, aDeclaration, kBorderWidthIDs, aChangeHint); } +PRBool CSSParserImpl::ParseBorderRadius(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, + PRInt32& aChangeHint) +{ + return ParseBoxProperties(aErrorCode, aDeclaration, kBorderRadiusIDs, aChangeHint); +} + + PRBool CSSParserImpl::ParseClip(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint) { diff --git a/mozilla/layout/html/style/src/nsCSSPropList.h b/mozilla/layout/html/style/src/nsCSSPropList.h index 5546bf66651..e07c4095493 100644 --- a/mozilla/layout/html/style/src/nsCSSPropList.h +++ b/mozilla/layout/html/style/src/nsCSSPropList.h @@ -43,6 +43,10 @@ CSS_PROP(_moz_border_radius, VISUAL) +CSS_PROP(_moz_border_radius_topLeft, VISUAL) +CSS_PROP(_moz_border_radius_topRight, VISUAL) +CSS_PROP(_moz_border_radius_bottomLeft, VISUAL) +CSS_PROP(_moz_border_radius_bottomRight, VISUAL) CSS_PROP(azimuth, AURAL) CSS_PROP(background, VISUAL) CSS_PROP(background_attachment, VISUAL) diff --git a/mozilla/layout/html/style/src/nsCSSStyleRule.cpp b/mozilla/layout/html/style/src/nsCSSStyleRule.cpp index 549d2f68afe..bb815f2ec7a 100644 --- a/mozilla/layout/html/style/src/nsCSSStyleRule.cpp +++ b/mozilla/layout/html/style/src/nsCSSStyleRule.cpp @@ -1997,9 +1997,26 @@ MapDeclarationMarginInto(nsICSSDeclaration* aDeclaration, } } - // -moz-border-radius: length, inherit - if (! SetCoord(ourMargin->mBorderRadius, spacing->mBorderRadius, parentSpacing->mBorderRadius, - SETCOORD_LPH, aFont->mFont, aPresContext)) { + // -moz-border-radius: length, percent, inherit + if (nsnull != ourMargin->mBorderRadius) { + nsStyleCoord coord; + nsStyleCoord parentCoord; + parentSpacing->mBorderRadius.GetLeft(parentCoord); + if (SetCoord(ourMargin->mBorderRadius->mLeft, coord, parentCoord, SETCOORD_LPH, aFont->mFont, aPresContext)) { + spacing->mBorderRadius.SetLeft(coord); + } + parentSpacing->mBorderRadius.GetTop(parentCoord); + if (SetCoord(ourMargin->mBorderRadius->mTop, coord, parentCoord, SETCOORD_LPH, aFont->mFont, aPresContext)) { + spacing->mBorderRadius.SetTop(coord); + } + parentSpacing->mBorderRadius.GetRight(parentCoord); + if (SetCoord(ourMargin->mBorderRadius->mRight, coord, parentCoord, SETCOORD_LPH, aFont->mFont, aPresContext)) { + spacing->mBorderRadius.SetRight(coord); + } + parentSpacing->mBorderRadius.GetBottom(parentCoord); + if (SetCoord(ourMargin->mBorderRadius->mBottom, coord, parentCoord, SETCOORD_LPH, aFont->mFont, aPresContext)) { + spacing->mBorderRadius.SetBottom(coord); + } } // outline-width: length, enum, inherit diff --git a/mozilla/layout/html/style/src/nsICSSDeclaration.h b/mozilla/layout/html/style/src/nsICSSDeclaration.h index dda28d9b0b4..3155fe03612 100644 --- a/mozilla/layout/html/style/src/nsICSSDeclaration.h +++ b/mozilla/layout/html/style/src/nsICSSDeclaration.h @@ -215,7 +215,7 @@ struct nsCSSMargin : public nsCSSStruct { nsCSSRect* mBorderWidth; nsCSSRect* mBorderColor; nsCSSRect* mBorderStyle; - nsCSSValue mBorderRadius; // (extension) + nsCSSRect* mBorderRadius; // (extension) nsCSSValue mOutlineWidth; nsCSSValue mOutlineColor; nsCSSValue mOutlineStyle; diff --git a/mozilla/layout/style/nsCSSDeclaration.cpp b/mozilla/layout/style/nsCSSDeclaration.cpp index 71631711eed..362ace9cab0 100644 --- a/mozilla/layout/style/nsCSSDeclaration.cpp +++ b/mozilla/layout/style/nsCSSDeclaration.cpp @@ -374,14 +374,13 @@ void nsCSSDisplay::List(FILE* out, PRInt32 aIndent) const nsCSSMargin::nsCSSMargin(void) : mMargin(nsnull), mPadding(nsnull), - mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull) + mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), mBorderRadius(nsnull) { } nsCSSMargin::nsCSSMargin(const nsCSSMargin& aCopy) : mMargin(nsnull), mPadding(nsnull), - mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), - mBorderRadius(aCopy.mBorderRadius), + mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), mBorderRadius(nsnull), mOutlineWidth(aCopy.mOutlineWidth), mOutlineColor(aCopy.mOutlineColor), mOutlineStyle(aCopy.mOutlineStyle), @@ -392,6 +391,7 @@ nsCSSMargin::nsCSSMargin(const nsCSSMargin& aCopy) CSS_IF_COPY(mBorderWidth, nsCSSRect); CSS_IF_COPY(mBorderColor, nsCSSRect); CSS_IF_COPY(mBorderStyle, nsCSSRect); + CSS_IF_COPY(mBorderRadius, nsCSSRect); } nsCSSMargin::~nsCSSMargin(void) @@ -401,6 +401,7 @@ nsCSSMargin::~nsCSSMargin(void) CSS_IF_DELETE(mBorderWidth); CSS_IF_DELETE(mBorderColor); CSS_IF_DELETE(mBorderStyle); + CSS_IF_DELETE(mBorderRadius); } const nsID& nsCSSMargin::GetID(void) @@ -443,11 +444,19 @@ void nsCSSMargin::List(FILE* out, PRInt32 aIndent) const if (nsnull != mBorderStyle) { mBorderStyle->List(out, eCSSProperty_border_style, aIndent); } + if (nsnull != mBorderRadius) { + static const nsCSSProperty trbl[] = { + eCSSProperty__moz_border_radius_topLeft, + eCSSProperty__moz_border_radius_topRight, + eCSSProperty__moz_border_radius_bottomRight, + eCSSProperty__moz_border_radius_bottomLeft + }; + mBorderRadius->List(out, aIndent, trbl); + } for (PRInt32 index = aIndent; --index >= 0; ) fputs(" ", out); nsAutoString buffer; - mBorderRadius.AppendToString(buffer, eCSSProperty__moz_border_radius); mOutlineWidth.AppendToString(buffer, eCSSProperty_outline_width); mOutlineColor.AppendToString(buffer, eCSSProperty_outline_color); mOutlineStyle.AppendToString(buffer, eCSSProperty_outline_style); @@ -1362,14 +1371,29 @@ CSSDeclarationImpl::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValu } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + CSS_ENSURE(Margin) { + CSS_ENSURE_RECT(mMargin->mBorderRadius) { + switch (aProperty) { + case eCSSProperty__moz_border_radius_topLeft: mMargin->mBorderRadius->mTop = aValue; break; + case eCSSProperty__moz_border_radius_topRight: mMargin->mBorderRadius->mRight = aValue; break; + case eCSSProperty__moz_border_radius_bottomRight: mMargin->mBorderRadius->mBottom = aValue; break; + case eCSSProperty__moz_border_radius_bottomLeft: mMargin->mBorderRadius->mLeft = aValue; break; + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: case eCSSProperty_float_edge: CSS_ENSURE(Margin) { switch (aProperty) { - case eCSSProperty__moz_border_radius: mMargin->mBorderRadius = aValue; break; case eCSSProperty_outline_width: mMargin->mOutlineWidth = aValue; break; case eCSSProperty_outline_color: mMargin->mOutlineColor = aValue; break; case eCSSProperty_outline_style: mMargin->mOutlineStyle = aValue; break; @@ -1629,6 +1653,7 @@ CSSDeclarationImpl::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValu case eCSSProperty_border_color: case eCSSProperty_border_style: case eCSSProperty_border_width: + case eCSSProperty__moz_border_radius: NS_ERROR("can't append shorthand properties"); // default: // XXX explicitly removing default case so compiler will help find missed props case eCSSProperty_UNKNOWN: @@ -2015,7 +2040,27 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + if (nsnull != mMargin) { + if (nsnull != mMargin->mBorderRadius) { + CSS_ENSURE_IMPORTANT(Margin) { + CSS_ENSURE_RECT(mImportant->mMargin->mBorderRadius) { + switch (aProperty) { + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_topLeft, mMargin->mBorderRadius->mTop); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_topRight, mMargin->mBorderRadius->mRight); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_bottomRight, mMargin->mBorderRadius->mBottom); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_bottomLeft, mMargin->mBorderRadius->mLeft); + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + } + } + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: @@ -2023,7 +2068,6 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) if (nsnull != mMargin) { CSS_ENSURE_IMPORTANT(Margin) { switch (aProperty) { - CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius, mMargin->mBorderRadius); CSS_CASE_IMPORTANT(eCSSProperty_outline_width, mMargin->mOutlineWidth); CSS_CASE_IMPORTANT(eCSSProperty_outline_color, mMargin->mOutlineColor); CSS_CASE_IMPORTANT(eCSSProperty_outline_style, mMargin->mOutlineStyle); @@ -2422,6 +2466,12 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) SetValueImportant(eCSSProperty_border_bottom_width); SetValueImportant(eCSSProperty_border_left_width); break; + case eCSSProperty__moz_border_radius: + SetValueImportant(eCSSProperty__moz_border_radius_topLeft); + SetValueImportant(eCSSProperty__moz_border_radius_topRight); + SetValueImportant(eCSSProperty__moz_border_radius_bottomRight); + SetValueImportant(eCSSProperty__moz_border_radius_bottomLeft); + break; default: result = NS_ERROR_ILLEGAL_VALUE; break; @@ -2691,14 +2741,30 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue) } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + if ((nsnull != mMargin) && (nsnull != mMargin->mBorderRadius)) { + switch (aProperty) { + case eCSSProperty__moz_border_radius_topLeft: aValue = mMargin->mBorderRadius->mTop; break; + case eCSSProperty__moz_border_radius_topRight: aValue = mMargin->mBorderRadius->mRight; break; + case eCSSProperty__moz_border_radius_bottomRight: aValue = mMargin->mBorderRadius->mBottom; break; + case eCSSProperty__moz_border_radius_bottomLeft: aValue = mMargin->mBorderRadius->mLeft; break; + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + else { + aValue.Reset(); + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: case eCSSProperty_float_edge: if (nsnull != mMargin) { switch (aProperty) { - case eCSSProperty__moz_border_radius: aValue = mMargin->mBorderRadius; break; case eCSSProperty_outline_width: aValue = mMargin->mOutlineWidth; break; case eCSSProperty_outline_color: aValue = mMargin->mOutlineColor; break; case eCSSProperty_outline_style: aValue = mMargin->mOutlineStyle; break; @@ -2981,6 +3047,7 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue) case eCSSProperty_border_color: case eCSSProperty_border_style: case eCSSProperty_border_width: + case eCSSProperty__moz_border_radius: NS_ERROR("can't query for shorthand properties"); default: result = NS_ERROR_ILLEGAL_VALUE; @@ -3344,6 +3411,14 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsString& aValue) AppendValueToString(eCSSProperty_border_left_style, aValue); } break; + case eCSSProperty__moz_border_radius: + if (HAS_RECT(mMargin,mBorderRadius)) { + AppendValueToString(eCSSProperty__moz_border_radius_topLeft, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_topRight, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_bottomRight, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_bottomLeft, aValue); + } + break; case eCSSProperty_border_width: if (HAS_RECT(mMargin,mBorderWidth)) { AppendValueToString(eCSSProperty_border_top_width, aValue); aValue.Append(' '); diff --git a/mozilla/layout/style/nsCSSParser.cpp b/mozilla/layout/style/nsCSSParser.cpp index 6d8501b0e3e..dd0e43d63ef 100644 --- a/mozilla/layout/style/nsCSSParser.cpp +++ b/mozilla/layout/style/nsCSSParser.cpp @@ -205,6 +205,7 @@ protected: const nsCSSProperty aPropIDs[], PRInt32& aChangeHint); PRBool ParseBorderStyle(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); PRBool ParseBorderWidth(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); + PRBool ParseBorderRadius(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); PRBool ParseClip(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); PRBool ParseContent(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint); PRBool ParseCounterData(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, @@ -2632,6 +2633,8 @@ PRBool CSSParserImpl::ParseProperty(PRInt32& aErrorCode, return ParseBorderSide(aErrorCode, aDeclaration, kBorderTopIDs, aChangeHint); case eCSSProperty_border_width: return ParseBorderWidth(aErrorCode, aDeclaration, aChangeHint); + case eCSSProperty__moz_border_radius: + return ParseBorderRadius(aErrorCode, aDeclaration, aChangeHint); case eCSSProperty_clip: return ParseClip(aErrorCode, aDeclaration, aChangeHint); case eCSSProperty_content: @@ -2814,7 +2817,10 @@ PRBool CSSParserImpl::ParseSingleValueProperty(PRInt32& aErrorCode, case eCSSProperty_border_top_width: return ParseVariant(aErrorCode, aValue, VARIANT_HKL, nsCSSProps::kBorderWidthKTable); - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: return ParseVariant(aErrorCode, aValue, VARIANT_HLP, nsnull); case eCSSProperty_bottom: case eCSSProperty_top: @@ -3290,6 +3296,12 @@ static const nsCSSProperty kBorderColorIDs[] = { eCSSProperty_border_bottom_color, eCSSProperty_border_left_color }; +static const nsCSSProperty kBorderRadiusIDs[] = { + eCSSProperty__moz_border_radius_topLeft, + eCSSProperty__moz_border_radius_topRight, + eCSSProperty__moz_border_radius_bottomRight, + eCSSProperty__moz_border_radius_bottomLeft +}; PRBool CSSParserImpl::ParseBorder(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint) @@ -3406,6 +3418,13 @@ PRBool CSSParserImpl::ParseBorderWidth(PRInt32& aErrorCode, nsICSSDeclaration* a return ParseBoxProperties(aErrorCode, aDeclaration, kBorderWidthIDs, aChangeHint); } +PRBool CSSParserImpl::ParseBorderRadius(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, + PRInt32& aChangeHint) +{ + return ParseBoxProperties(aErrorCode, aDeclaration, kBorderRadiusIDs, aChangeHint); +} + + PRBool CSSParserImpl::ParseClip(PRInt32& aErrorCode, nsICSSDeclaration* aDeclaration, PRInt32& aChangeHint) { diff --git a/mozilla/layout/style/nsCSSPropList.h b/mozilla/layout/style/nsCSSPropList.h index 5546bf66651..e07c4095493 100644 --- a/mozilla/layout/style/nsCSSPropList.h +++ b/mozilla/layout/style/nsCSSPropList.h @@ -43,6 +43,10 @@ CSS_PROP(_moz_border_radius, VISUAL) +CSS_PROP(_moz_border_radius_topLeft, VISUAL) +CSS_PROP(_moz_border_radius_topRight, VISUAL) +CSS_PROP(_moz_border_radius_bottomLeft, VISUAL) +CSS_PROP(_moz_border_radius_bottomRight, VISUAL) CSS_PROP(azimuth, AURAL) CSS_PROP(background, VISUAL) CSS_PROP(background_attachment, VISUAL) diff --git a/mozilla/layout/style/nsCSSStruct.cpp b/mozilla/layout/style/nsCSSStruct.cpp index 71631711eed..362ace9cab0 100644 --- a/mozilla/layout/style/nsCSSStruct.cpp +++ b/mozilla/layout/style/nsCSSStruct.cpp @@ -374,14 +374,13 @@ void nsCSSDisplay::List(FILE* out, PRInt32 aIndent) const nsCSSMargin::nsCSSMargin(void) : mMargin(nsnull), mPadding(nsnull), - mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull) + mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), mBorderRadius(nsnull) { } nsCSSMargin::nsCSSMargin(const nsCSSMargin& aCopy) : mMargin(nsnull), mPadding(nsnull), - mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), - mBorderRadius(aCopy.mBorderRadius), + mBorderWidth(nsnull), mBorderColor(nsnull), mBorderStyle(nsnull), mBorderRadius(nsnull), mOutlineWidth(aCopy.mOutlineWidth), mOutlineColor(aCopy.mOutlineColor), mOutlineStyle(aCopy.mOutlineStyle), @@ -392,6 +391,7 @@ nsCSSMargin::nsCSSMargin(const nsCSSMargin& aCopy) CSS_IF_COPY(mBorderWidth, nsCSSRect); CSS_IF_COPY(mBorderColor, nsCSSRect); CSS_IF_COPY(mBorderStyle, nsCSSRect); + CSS_IF_COPY(mBorderRadius, nsCSSRect); } nsCSSMargin::~nsCSSMargin(void) @@ -401,6 +401,7 @@ nsCSSMargin::~nsCSSMargin(void) CSS_IF_DELETE(mBorderWidth); CSS_IF_DELETE(mBorderColor); CSS_IF_DELETE(mBorderStyle); + CSS_IF_DELETE(mBorderRadius); } const nsID& nsCSSMargin::GetID(void) @@ -443,11 +444,19 @@ void nsCSSMargin::List(FILE* out, PRInt32 aIndent) const if (nsnull != mBorderStyle) { mBorderStyle->List(out, eCSSProperty_border_style, aIndent); } + if (nsnull != mBorderRadius) { + static const nsCSSProperty trbl[] = { + eCSSProperty__moz_border_radius_topLeft, + eCSSProperty__moz_border_radius_topRight, + eCSSProperty__moz_border_radius_bottomRight, + eCSSProperty__moz_border_radius_bottomLeft + }; + mBorderRadius->List(out, aIndent, trbl); + } for (PRInt32 index = aIndent; --index >= 0; ) fputs(" ", out); nsAutoString buffer; - mBorderRadius.AppendToString(buffer, eCSSProperty__moz_border_radius); mOutlineWidth.AppendToString(buffer, eCSSProperty_outline_width); mOutlineColor.AppendToString(buffer, eCSSProperty_outline_color); mOutlineStyle.AppendToString(buffer, eCSSProperty_outline_style); @@ -1362,14 +1371,29 @@ CSSDeclarationImpl::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValu } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + CSS_ENSURE(Margin) { + CSS_ENSURE_RECT(mMargin->mBorderRadius) { + switch (aProperty) { + case eCSSProperty__moz_border_radius_topLeft: mMargin->mBorderRadius->mTop = aValue; break; + case eCSSProperty__moz_border_radius_topRight: mMargin->mBorderRadius->mRight = aValue; break; + case eCSSProperty__moz_border_radius_bottomRight: mMargin->mBorderRadius->mBottom = aValue; break; + case eCSSProperty__moz_border_radius_bottomLeft: mMargin->mBorderRadius->mLeft = aValue; break; + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: case eCSSProperty_float_edge: CSS_ENSURE(Margin) { switch (aProperty) { - case eCSSProperty__moz_border_radius: mMargin->mBorderRadius = aValue; break; case eCSSProperty_outline_width: mMargin->mOutlineWidth = aValue; break; case eCSSProperty_outline_color: mMargin->mOutlineColor = aValue; break; case eCSSProperty_outline_style: mMargin->mOutlineStyle = aValue; break; @@ -1629,6 +1653,7 @@ CSSDeclarationImpl::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValu case eCSSProperty_border_color: case eCSSProperty_border_style: case eCSSProperty_border_width: + case eCSSProperty__moz_border_radius: NS_ERROR("can't append shorthand properties"); // default: // XXX explicitly removing default case so compiler will help find missed props case eCSSProperty_UNKNOWN: @@ -2015,7 +2040,27 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + if (nsnull != mMargin) { + if (nsnull != mMargin->mBorderRadius) { + CSS_ENSURE_IMPORTANT(Margin) { + CSS_ENSURE_RECT(mImportant->mMargin->mBorderRadius) { + switch (aProperty) { + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_topLeft, mMargin->mBorderRadius->mTop); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_topRight, mMargin->mBorderRadius->mRight); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_bottomRight, mMargin->mBorderRadius->mBottom); + CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius_bottomLeft, mMargin->mBorderRadius->mLeft); + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + } + } + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: @@ -2023,7 +2068,6 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) if (nsnull != mMargin) { CSS_ENSURE_IMPORTANT(Margin) { switch (aProperty) { - CSS_CASE_IMPORTANT(eCSSProperty__moz_border_radius, mMargin->mBorderRadius); CSS_CASE_IMPORTANT(eCSSProperty_outline_width, mMargin->mOutlineWidth); CSS_CASE_IMPORTANT(eCSSProperty_outline_color, mMargin->mOutlineColor); CSS_CASE_IMPORTANT(eCSSProperty_outline_style, mMargin->mOutlineStyle); @@ -2422,6 +2466,12 @@ CSSDeclarationImpl::SetValueImportant(nsCSSProperty aProperty) SetValueImportant(eCSSProperty_border_bottom_width); SetValueImportant(eCSSProperty_border_left_width); break; + case eCSSProperty__moz_border_radius: + SetValueImportant(eCSSProperty__moz_border_radius_topLeft); + SetValueImportant(eCSSProperty__moz_border_radius_topRight); + SetValueImportant(eCSSProperty__moz_border_radius_bottomRight); + SetValueImportant(eCSSProperty__moz_border_radius_bottomLeft); + break; default: result = NS_ERROR_ILLEGAL_VALUE; break; @@ -2691,14 +2741,30 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue) } break; - case eCSSProperty__moz_border_radius: + case eCSSProperty__moz_border_radius_topLeft: + case eCSSProperty__moz_border_radius_topRight: + case eCSSProperty__moz_border_radius_bottomRight: + case eCSSProperty__moz_border_radius_bottomLeft: + if ((nsnull != mMargin) && (nsnull != mMargin->mBorderRadius)) { + switch (aProperty) { + case eCSSProperty__moz_border_radius_topLeft: aValue = mMargin->mBorderRadius->mTop; break; + case eCSSProperty__moz_border_radius_topRight: aValue = mMargin->mBorderRadius->mRight; break; + case eCSSProperty__moz_border_radius_bottomRight: aValue = mMargin->mBorderRadius->mBottom; break; + case eCSSProperty__moz_border_radius_bottomLeft: aValue = mMargin->mBorderRadius->mLeft; break; + CSS_BOGUS_DEFAULT; // make compiler happy + } + } + else { + aValue.Reset(); + } + break; + case eCSSProperty_outline_width: case eCSSProperty_outline_color: case eCSSProperty_outline_style: case eCSSProperty_float_edge: if (nsnull != mMargin) { switch (aProperty) { - case eCSSProperty__moz_border_radius: aValue = mMargin->mBorderRadius; break; case eCSSProperty_outline_width: aValue = mMargin->mOutlineWidth; break; case eCSSProperty_outline_color: aValue = mMargin->mOutlineColor; break; case eCSSProperty_outline_style: aValue = mMargin->mOutlineStyle; break; @@ -2981,6 +3047,7 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue) case eCSSProperty_border_color: case eCSSProperty_border_style: case eCSSProperty_border_width: + case eCSSProperty__moz_border_radius: NS_ERROR("can't query for shorthand properties"); default: result = NS_ERROR_ILLEGAL_VALUE; @@ -3344,6 +3411,14 @@ CSSDeclarationImpl::GetValue(nsCSSProperty aProperty, nsString& aValue) AppendValueToString(eCSSProperty_border_left_style, aValue); } break; + case eCSSProperty__moz_border_radius: + if (HAS_RECT(mMargin,mBorderRadius)) { + AppendValueToString(eCSSProperty__moz_border_radius_topLeft, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_topRight, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_bottomRight, aValue); aValue.Append(' '); + AppendValueToString(eCSSProperty__moz_border_radius_bottomLeft, aValue); + } + break; case eCSSProperty_border_width: if (HAS_RECT(mMargin,mBorderWidth)) { AppendValueToString(eCSSProperty_border_top_width, aValue); aValue.Append(' '); diff --git a/mozilla/layout/style/nsCSSStyleRule.cpp b/mozilla/layout/style/nsCSSStyleRule.cpp index 549d2f68afe..bb815f2ec7a 100644 --- a/mozilla/layout/style/nsCSSStyleRule.cpp +++ b/mozilla/layout/style/nsCSSStyleRule.cpp @@ -1997,9 +1997,26 @@ MapDeclarationMarginInto(nsICSSDeclaration* aDeclaration, } } - // -moz-border-radius: length, inherit - if (! SetCoord(ourMargin->mBorderRadius, spacing->mBorderRadius, parentSpacing->mBorderRadius, - SETCOORD_LPH, aFont->mFont, aPresContext)) { + // -moz-border-radius: length, percent, inherit + if (nsnull != ourMargin->mBorderRadius) { + nsStyleCoord coord; + nsStyleCoord parentCoord; + parentSpacing->mBorderRadius.GetLeft(parentCoord); + if (SetCoord(ourMargin->mBorderRadius->mLeft, coord, parentCoord, SETCOORD_LPH, aFont->mFont, aPresContext)) { + spacing->mBorderRadius.SetLeft(coord); + } + parentSpacing->mBorderRadius.GetTop(parentCoord); + if (SetCoord(ourMargin->mBorderRadius->mTop, coord, parentCoord, SETCOORD_LPH, aFont->mFont, aPresContext)) { + spacing->mBorderRadius.SetTop(coord); + } + parentSpacing->mBorderRadius.GetRight(parentCoord); + if (SetCoord(ourMargin->mBorderRadius->mRight, coord, parentCoord, SETCOORD_LPH, aFont->mFont, aPresContext)) { + spacing->mBorderRadius.SetRight(coord); + } + parentSpacing->mBorderRadius.GetBottom(parentCoord); + if (SetCoord(ourMargin->mBorderRadius->mBottom, coord, parentCoord, SETCOORD_LPH, aFont->mFont, aPresContext)) { + spacing->mBorderRadius.SetBottom(coord); + } } // outline-width: length, enum, inherit diff --git a/mozilla/layout/style/nsStyleContext.cpp b/mozilla/layout/style/nsStyleContext.cpp index 70c416312db..7e147a9265e 100644 --- a/mozilla/layout/style/nsStyleContext.cpp +++ b/mozilla/layout/style/nsStyleContext.cpp @@ -566,7 +566,7 @@ void StyleSpacingImpl::ResetFrom(const nsStyleSpacing* aParent, nsIPresContext* mBorderColor[2] = NS_RGB(0, 0, 0); mBorderColor[3] = NS_RGB(0, 0, 0); - mBorderRadius.SetCoordValue(0); + mBorderRadius.Reset(); mOutlineWidth = medium; mOutlineStyle = NS_STYLE_BORDER_STYLE_NONE;