diff --git a/content/html/style/src/nsCSSDeclaration.cpp b/content/html/style/src/nsCSSDeclaration.cpp index 8fe5137809b8..1d4cfc12261f 100644 --- a/content/html/style/src/nsCSSDeclaration.cpp +++ b/content/html/style/src/nsCSSDeclaration.cpp @@ -389,6 +389,7 @@ void nsCSSColor::List(FILE* out, PRInt32 aIndent) const mBackFilter.AppendToString(buffer, PROP_BACKGROUND_FILTER); mCursor.AppendToString(buffer, PROP_CURSOR); mCursorImage.AppendToString(buffer, PROP_CURSOR_IMAGE); + mOpacity.AppendToString(buffer, PROP_OPACITY); fputs(buffer, out); } @@ -781,6 +782,7 @@ nsresult CSSDeclarationImpl::AddValue(PRInt32 aProperty, const nsCSSValue& aValu case PROP_BACKGROUND_FILTER: case PROP_CURSOR: case PROP_CURSOR_IMAGE: + case PROP_OPACITY: if (nsnull == mColor) { mColor = new nsCSSColor(); } @@ -796,6 +798,7 @@ nsresult CSSDeclarationImpl::AddValue(PRInt32 aProperty, const nsCSSValue& aValu case PROP_BACKGROUND_FILTER: mColor->mBackFilter = aValue; break; case PROP_CURSOR: mColor->mCursor = aValue; break; case PROP_CURSOR_IMAGE: mColor->mCursorImage = aValue; break; + case PROP_OPACITY: mColor->mOpacity = aValue; break; } } else { @@ -1138,6 +1141,7 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue) case PROP_BACKGROUND_FILTER: case PROP_CURSOR: case PROP_CURSOR_IMAGE: + case PROP_OPACITY: if (nsnull != mColor) { switch (aProperty) { case PROP_COLOR: aValue = mColor->mColor; break; @@ -1150,6 +1154,7 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue) case PROP_BACKGROUND_FILTER: aValue = mColor->mBackFilter; break; case PROP_CURSOR: aValue = mColor->mCursor; break; case PROP_CURSOR_IMAGE: aValue = mColor->mCursorImage; break; + case PROP_OPACITY: aValue = mColor->mOpacity; break; } } else { diff --git a/content/html/style/src/nsCSSParser.cpp b/content/html/style/src/nsCSSParser.cpp index 2c23dbcfdac4..d3fa2b38c097 100644 --- a/content/html/style/src/nsCSSParser.cpp +++ b/content/html/style/src/nsCSSParser.cpp @@ -1099,6 +1099,7 @@ CSSParserImpl::ParseDeclaration(PRInt32* aErrorCode, #define VARIANT_CK (VARIANT_COLOR | VARIANT_KEYWORD) #define VARIANT_C VARIANT_COLOR #define VARIANT_UK (VARIANT_URL | VARIANT_KEYWORD) +#define VARIANT_HPN (VARIANT_INHERIT | VARIANT_PERCENT | VARIANT_NUMBER) // Keyword id tables for variant/enum parsing static PRInt32 kBackgroundAttachmentKTable[] = { @@ -1685,6 +1686,8 @@ PRBool CSSParserImpl::ParseProperty(PRInt32* aErrorCode, case PROP_PADDING_RIGHT: case PROP_PADDING_TOP: return ParseVariant(aErrorCode, aDeclaration, aName, VARIANT_LP, nsnull); + case PROP_OPACITY: + return ParseVariant(aErrorCode, aDeclaration, aName, VARIANT_HPN, nsnull); case PROP_OVERFLOW: return ParseEnum(aErrorCode, aDeclaration, aName, kOverflowKTable); case PROP_POSITION: diff --git a/content/html/style/src/nsCSSStruct.cpp b/content/html/style/src/nsCSSStruct.cpp index 8fe5137809b8..1d4cfc12261f 100644 --- a/content/html/style/src/nsCSSStruct.cpp +++ b/content/html/style/src/nsCSSStruct.cpp @@ -389,6 +389,7 @@ void nsCSSColor::List(FILE* out, PRInt32 aIndent) const mBackFilter.AppendToString(buffer, PROP_BACKGROUND_FILTER); mCursor.AppendToString(buffer, PROP_CURSOR); mCursorImage.AppendToString(buffer, PROP_CURSOR_IMAGE); + mOpacity.AppendToString(buffer, PROP_OPACITY); fputs(buffer, out); } @@ -781,6 +782,7 @@ nsresult CSSDeclarationImpl::AddValue(PRInt32 aProperty, const nsCSSValue& aValu case PROP_BACKGROUND_FILTER: case PROP_CURSOR: case PROP_CURSOR_IMAGE: + case PROP_OPACITY: if (nsnull == mColor) { mColor = new nsCSSColor(); } @@ -796,6 +798,7 @@ nsresult CSSDeclarationImpl::AddValue(PRInt32 aProperty, const nsCSSValue& aValu case PROP_BACKGROUND_FILTER: mColor->mBackFilter = aValue; break; case PROP_CURSOR: mColor->mCursor = aValue; break; case PROP_CURSOR_IMAGE: mColor->mCursorImage = aValue; break; + case PROP_OPACITY: mColor->mOpacity = aValue; break; } } else { @@ -1138,6 +1141,7 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue) case PROP_BACKGROUND_FILTER: case PROP_CURSOR: case PROP_CURSOR_IMAGE: + case PROP_OPACITY: if (nsnull != mColor) { switch (aProperty) { case PROP_COLOR: aValue = mColor->mColor; break; @@ -1150,6 +1154,7 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue) case PROP_BACKGROUND_FILTER: aValue = mColor->mBackFilter; break; case PROP_CURSOR: aValue = mColor->mCursor; break; case PROP_CURSOR_IMAGE: aValue = mColor->mCursorImage; break; + case PROP_OPACITY: aValue = mColor->mOpacity; break; } } else { diff --git a/content/html/style/src/nsCSSStyleRule.cpp b/content/html/style/src/nsCSSStyleRule.cpp index 584cc8c30a8c..e4c66be6dd82 100644 --- a/content/html/style/src/nsCSSStyleRule.cpp +++ b/content/html/style/src/nsCSSStyleRule.cpp @@ -843,6 +843,25 @@ void CSSStyleRuleImpl::MapStyleInto(nsIStyleContext* aContext, nsIPresContext* a color->mBackgroundFlags &= ~NS_STYLE_BG_Y_POSITION_PERCENT; } + // opacity: factor, percent, enum + if (ourColor->mOpacity.GetUnit() == eCSSUnit_Percent) { + color->mOpacity.SetPercentValue(ourColor->mOpacity.GetPercentValue()); + } + else if (ourColor->mOpacity.GetUnit() == eCSSUnit_Number) { + color->mOpacity.SetFactorValue(ourColor->mOpacity.GetFloatValue()); + } + else if (ourColor->mOpacity.GetUnit() == eCSSUnit_Enumerated) { + // Only enum value is inherit + nsStyleColor* parentColor = color; + nsIStyleContext* parentContext = aContext->GetParent(); + if (nsnull != parentContext) { + parentColor = (nsStyleColor*)parentContext->GetData(eStyleStruct_Color); + color->mOpacity = parentColor->mOpacity; + NS_RELEASE(parentContext); + } + + } + // XXX: NYI nsCSSValue mBackFilter; } } diff --git a/content/html/style/src/nsICSSDeclaration.h b/content/html/style/src/nsICSSDeclaration.h index 827fe2aa9f84..b662854f001d 100644 --- a/content/html/style/src/nsICSSDeclaration.h +++ b/content/html/style/src/nsICSSDeclaration.h @@ -230,6 +230,7 @@ struct nsCSSColor : public nsCSSStruct { nsCSSValue mBackFilter; nsCSSValue mCursor; nsCSSValue mCursorImage; + nsCSSValue mOpacity; }; struct nsCSSText : public nsCSSStruct { diff --git a/layout/html/style/src/nsCSSDeclaration.cpp b/layout/html/style/src/nsCSSDeclaration.cpp index 8fe5137809b8..1d4cfc12261f 100644 --- a/layout/html/style/src/nsCSSDeclaration.cpp +++ b/layout/html/style/src/nsCSSDeclaration.cpp @@ -389,6 +389,7 @@ void nsCSSColor::List(FILE* out, PRInt32 aIndent) const mBackFilter.AppendToString(buffer, PROP_BACKGROUND_FILTER); mCursor.AppendToString(buffer, PROP_CURSOR); mCursorImage.AppendToString(buffer, PROP_CURSOR_IMAGE); + mOpacity.AppendToString(buffer, PROP_OPACITY); fputs(buffer, out); } @@ -781,6 +782,7 @@ nsresult CSSDeclarationImpl::AddValue(PRInt32 aProperty, const nsCSSValue& aValu case PROP_BACKGROUND_FILTER: case PROP_CURSOR: case PROP_CURSOR_IMAGE: + case PROP_OPACITY: if (nsnull == mColor) { mColor = new nsCSSColor(); } @@ -796,6 +798,7 @@ nsresult CSSDeclarationImpl::AddValue(PRInt32 aProperty, const nsCSSValue& aValu case PROP_BACKGROUND_FILTER: mColor->mBackFilter = aValue; break; case PROP_CURSOR: mColor->mCursor = aValue; break; case PROP_CURSOR_IMAGE: mColor->mCursorImage = aValue; break; + case PROP_OPACITY: mColor->mOpacity = aValue; break; } } else { @@ -1138,6 +1141,7 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue) case PROP_BACKGROUND_FILTER: case PROP_CURSOR: case PROP_CURSOR_IMAGE: + case PROP_OPACITY: if (nsnull != mColor) { switch (aProperty) { case PROP_COLOR: aValue = mColor->mColor; break; @@ -1150,6 +1154,7 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue) case PROP_BACKGROUND_FILTER: aValue = mColor->mBackFilter; break; case PROP_CURSOR: aValue = mColor->mCursor; break; case PROP_CURSOR_IMAGE: aValue = mColor->mCursorImage; break; + case PROP_OPACITY: aValue = mColor->mOpacity; break; } } else { diff --git a/layout/html/style/src/nsCSSParser.cpp b/layout/html/style/src/nsCSSParser.cpp index 2c23dbcfdac4..d3fa2b38c097 100644 --- a/layout/html/style/src/nsCSSParser.cpp +++ b/layout/html/style/src/nsCSSParser.cpp @@ -1099,6 +1099,7 @@ CSSParserImpl::ParseDeclaration(PRInt32* aErrorCode, #define VARIANT_CK (VARIANT_COLOR | VARIANT_KEYWORD) #define VARIANT_C VARIANT_COLOR #define VARIANT_UK (VARIANT_URL | VARIANT_KEYWORD) +#define VARIANT_HPN (VARIANT_INHERIT | VARIANT_PERCENT | VARIANT_NUMBER) // Keyword id tables for variant/enum parsing static PRInt32 kBackgroundAttachmentKTable[] = { @@ -1685,6 +1686,8 @@ PRBool CSSParserImpl::ParseProperty(PRInt32* aErrorCode, case PROP_PADDING_RIGHT: case PROP_PADDING_TOP: return ParseVariant(aErrorCode, aDeclaration, aName, VARIANT_LP, nsnull); + case PROP_OPACITY: + return ParseVariant(aErrorCode, aDeclaration, aName, VARIANT_HPN, nsnull); case PROP_OVERFLOW: return ParseEnum(aErrorCode, aDeclaration, aName, kOverflowKTable); case PROP_POSITION: diff --git a/layout/html/style/src/nsCSSStyleRule.cpp b/layout/html/style/src/nsCSSStyleRule.cpp index 584cc8c30a8c..e4c66be6dd82 100644 --- a/layout/html/style/src/nsCSSStyleRule.cpp +++ b/layout/html/style/src/nsCSSStyleRule.cpp @@ -843,6 +843,25 @@ void CSSStyleRuleImpl::MapStyleInto(nsIStyleContext* aContext, nsIPresContext* a color->mBackgroundFlags &= ~NS_STYLE_BG_Y_POSITION_PERCENT; } + // opacity: factor, percent, enum + if (ourColor->mOpacity.GetUnit() == eCSSUnit_Percent) { + color->mOpacity.SetPercentValue(ourColor->mOpacity.GetPercentValue()); + } + else if (ourColor->mOpacity.GetUnit() == eCSSUnit_Number) { + color->mOpacity.SetFactorValue(ourColor->mOpacity.GetFloatValue()); + } + else if (ourColor->mOpacity.GetUnit() == eCSSUnit_Enumerated) { + // Only enum value is inherit + nsStyleColor* parentColor = color; + nsIStyleContext* parentContext = aContext->GetParent(); + if (nsnull != parentContext) { + parentColor = (nsStyleColor*)parentContext->GetData(eStyleStruct_Color); + color->mOpacity = parentColor->mOpacity; + NS_RELEASE(parentContext); + } + + } + // XXX: NYI nsCSSValue mBackFilter; } } diff --git a/layout/html/style/src/nsICSSDeclaration.h b/layout/html/style/src/nsICSSDeclaration.h index 827fe2aa9f84..b662854f001d 100644 --- a/layout/html/style/src/nsICSSDeclaration.h +++ b/layout/html/style/src/nsICSSDeclaration.h @@ -230,6 +230,7 @@ struct nsCSSColor : public nsCSSStruct { nsCSSValue mBackFilter; nsCSSValue mCursor; nsCSSValue mCursorImage; + nsCSSValue mOpacity; }; struct nsCSSText : public nsCSSStruct { diff --git a/layout/style/nsCSSDeclaration.cpp b/layout/style/nsCSSDeclaration.cpp index 8fe5137809b8..1d4cfc12261f 100644 --- a/layout/style/nsCSSDeclaration.cpp +++ b/layout/style/nsCSSDeclaration.cpp @@ -389,6 +389,7 @@ void nsCSSColor::List(FILE* out, PRInt32 aIndent) const mBackFilter.AppendToString(buffer, PROP_BACKGROUND_FILTER); mCursor.AppendToString(buffer, PROP_CURSOR); mCursorImage.AppendToString(buffer, PROP_CURSOR_IMAGE); + mOpacity.AppendToString(buffer, PROP_OPACITY); fputs(buffer, out); } @@ -781,6 +782,7 @@ nsresult CSSDeclarationImpl::AddValue(PRInt32 aProperty, const nsCSSValue& aValu case PROP_BACKGROUND_FILTER: case PROP_CURSOR: case PROP_CURSOR_IMAGE: + case PROP_OPACITY: if (nsnull == mColor) { mColor = new nsCSSColor(); } @@ -796,6 +798,7 @@ nsresult CSSDeclarationImpl::AddValue(PRInt32 aProperty, const nsCSSValue& aValu case PROP_BACKGROUND_FILTER: mColor->mBackFilter = aValue; break; case PROP_CURSOR: mColor->mCursor = aValue; break; case PROP_CURSOR_IMAGE: mColor->mCursorImage = aValue; break; + case PROP_OPACITY: mColor->mOpacity = aValue; break; } } else { @@ -1138,6 +1141,7 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue) case PROP_BACKGROUND_FILTER: case PROP_CURSOR: case PROP_CURSOR_IMAGE: + case PROP_OPACITY: if (nsnull != mColor) { switch (aProperty) { case PROP_COLOR: aValue = mColor->mColor; break; @@ -1150,6 +1154,7 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue) case PROP_BACKGROUND_FILTER: aValue = mColor->mBackFilter; break; case PROP_CURSOR: aValue = mColor->mCursor; break; case PROP_CURSOR_IMAGE: aValue = mColor->mCursorImage; break; + case PROP_OPACITY: aValue = mColor->mOpacity; break; } } else { diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index 2c23dbcfdac4..d3fa2b38c097 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -1099,6 +1099,7 @@ CSSParserImpl::ParseDeclaration(PRInt32* aErrorCode, #define VARIANT_CK (VARIANT_COLOR | VARIANT_KEYWORD) #define VARIANT_C VARIANT_COLOR #define VARIANT_UK (VARIANT_URL | VARIANT_KEYWORD) +#define VARIANT_HPN (VARIANT_INHERIT | VARIANT_PERCENT | VARIANT_NUMBER) // Keyword id tables for variant/enum parsing static PRInt32 kBackgroundAttachmentKTable[] = { @@ -1685,6 +1686,8 @@ PRBool CSSParserImpl::ParseProperty(PRInt32* aErrorCode, case PROP_PADDING_RIGHT: case PROP_PADDING_TOP: return ParseVariant(aErrorCode, aDeclaration, aName, VARIANT_LP, nsnull); + case PROP_OPACITY: + return ParseVariant(aErrorCode, aDeclaration, aName, VARIANT_HPN, nsnull); case PROP_OVERFLOW: return ParseEnum(aErrorCode, aDeclaration, aName, kOverflowKTable); case PROP_POSITION: diff --git a/layout/style/nsCSSStruct.cpp b/layout/style/nsCSSStruct.cpp index 8fe5137809b8..1d4cfc12261f 100644 --- a/layout/style/nsCSSStruct.cpp +++ b/layout/style/nsCSSStruct.cpp @@ -389,6 +389,7 @@ void nsCSSColor::List(FILE* out, PRInt32 aIndent) const mBackFilter.AppendToString(buffer, PROP_BACKGROUND_FILTER); mCursor.AppendToString(buffer, PROP_CURSOR); mCursorImage.AppendToString(buffer, PROP_CURSOR_IMAGE); + mOpacity.AppendToString(buffer, PROP_OPACITY); fputs(buffer, out); } @@ -781,6 +782,7 @@ nsresult CSSDeclarationImpl::AddValue(PRInt32 aProperty, const nsCSSValue& aValu case PROP_BACKGROUND_FILTER: case PROP_CURSOR: case PROP_CURSOR_IMAGE: + case PROP_OPACITY: if (nsnull == mColor) { mColor = new nsCSSColor(); } @@ -796,6 +798,7 @@ nsresult CSSDeclarationImpl::AddValue(PRInt32 aProperty, const nsCSSValue& aValu case PROP_BACKGROUND_FILTER: mColor->mBackFilter = aValue; break; case PROP_CURSOR: mColor->mCursor = aValue; break; case PROP_CURSOR_IMAGE: mColor->mCursorImage = aValue; break; + case PROP_OPACITY: mColor->mOpacity = aValue; break; } } else { @@ -1138,6 +1141,7 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue) case PROP_BACKGROUND_FILTER: case PROP_CURSOR: case PROP_CURSOR_IMAGE: + case PROP_OPACITY: if (nsnull != mColor) { switch (aProperty) { case PROP_COLOR: aValue = mColor->mColor; break; @@ -1150,6 +1154,7 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue) case PROP_BACKGROUND_FILTER: aValue = mColor->mBackFilter; break; case PROP_CURSOR: aValue = mColor->mCursor; break; case PROP_CURSOR_IMAGE: aValue = mColor->mCursorImage; break; + case PROP_OPACITY: aValue = mColor->mOpacity; break; } } else { diff --git a/layout/style/nsCSSStyleRule.cpp b/layout/style/nsCSSStyleRule.cpp index 584cc8c30a8c..e4c66be6dd82 100644 --- a/layout/style/nsCSSStyleRule.cpp +++ b/layout/style/nsCSSStyleRule.cpp @@ -843,6 +843,25 @@ void CSSStyleRuleImpl::MapStyleInto(nsIStyleContext* aContext, nsIPresContext* a color->mBackgroundFlags &= ~NS_STYLE_BG_Y_POSITION_PERCENT; } + // opacity: factor, percent, enum + if (ourColor->mOpacity.GetUnit() == eCSSUnit_Percent) { + color->mOpacity.SetPercentValue(ourColor->mOpacity.GetPercentValue()); + } + else if (ourColor->mOpacity.GetUnit() == eCSSUnit_Number) { + color->mOpacity.SetFactorValue(ourColor->mOpacity.GetFloatValue()); + } + else if (ourColor->mOpacity.GetUnit() == eCSSUnit_Enumerated) { + // Only enum value is inherit + nsStyleColor* parentColor = color; + nsIStyleContext* parentContext = aContext->GetParent(); + if (nsnull != parentContext) { + parentColor = (nsStyleColor*)parentContext->GetData(eStyleStruct_Color); + color->mOpacity = parentColor->mOpacity; + NS_RELEASE(parentContext); + } + + } + // XXX: NYI nsCSSValue mBackFilter; } }