diff --git a/mozilla/content/html/style/public/nsICSSParser.h b/mozilla/content/html/style/public/nsICSSParser.h index 1be84c97ad3..99992e07991 100644 --- a/mozilla/content/html/style/public/nsICSSParser.h +++ b/mozilla/content/html/style/public/nsICSSParser.h @@ -72,6 +72,11 @@ public: // Set whether or not to emulate Nav quirks NS_IMETHOD SetQuirkMode(PRBool aQuirkMode) = 0; +#ifdef MOZ_SVG + // Set whether or not we are in an SVG element + NS_IMETHOD SetSVGMode(PRBool aSVGMode) = 0; +#endif + // Set loader to use for child sheets NS_IMETHOD SetChildLoader(nsICSSLoader* aChildLoader) = 0; diff --git a/mozilla/content/html/style/src/nsCSSParser.cpp b/mozilla/content/html/style/src/nsCSSParser.cpp index e029905f956..58f254ef2d8 100644 --- a/mozilla/content/html/style/src/nsCSSParser.cpp +++ b/mozilla/content/html/style/src/nsCSSParser.cpp @@ -99,6 +99,10 @@ public: NS_IMETHOD SetQuirkMode(PRBool aQuirkMode); +#ifdef MOZ_SVG + NS_IMETHOD SetSVGMode(PRBool aSVGMode); +#endif + NS_IMETHOD SetChildLoader(nsICSSLoader* aChildLoader); NS_IMETHOD Parse(nsIUnicharInputStream* aInput, @@ -338,6 +342,11 @@ protected: // True if we are in quirks mode; false in standards or almost standards mode PRPackedBool mNavQuirkMode; +#ifdef MOZ_SVG + // True if we are in SVG mode; false in "normal" CSS + PRPackedBool mSVGMode; +#endif + // True if tagnames and attributes are case-sensitive PRPackedBool mCaseSensitive; @@ -431,6 +440,9 @@ CSSParserImpl::CSSParserImpl() mSection(eCSSSection_Charset), mHavePushBack(PR_FALSE), mNavQuirkMode(PR_FALSE), +#ifdef MOZ_SVG + mSVGMode(PR_FALSE), +#endif mCaseSensitive(PR_FALSE), mParsingCompoundProperty(PR_FALSE) { @@ -476,6 +488,15 @@ CSSParserImpl::SetQuirkMode(PRBool aQuirkMode) return NS_OK; } +#ifdef MOZ_SVG +NS_IMETHODIMP +CSSParserImpl::SetSVGMode(PRBool aSVGMode) +{ + mSVGMode = aSVGMode; + return NS_OK; +} +#endif + NS_IMETHODIMP CSSParserImpl::SetChildLoader(nsICSSLoader* aChildLoader) { @@ -3515,6 +3536,19 @@ PRBool CSSParserImpl::ParseVariant(nsresult& aErrorCode, nsCSSValue& aValue, return PR_TRUE; } } + +#ifdef MOZ_SVG + if (mSVGMode && !IsParsingCompoundProperty()) { + // STANDARD: SVG Spec states that lengths and coordinates can be unitless + // in which case they default to user-units (1 px = 1 user unit) + if (((aVariantMask & VARIANT_LENGTH) != 0) && + (eCSSToken_Number == tk->mType)) { + aValue.SetFloatValue(tk->mNumber, eCSSUnit_Pixel); + return PR_TRUE; + } + } +#endif + if (((aVariantMask & VARIANT_URL) != 0) && (eCSSToken_Function == tk->mType) && tk->mIdent.LowerCaseEqualsLiteral("url")) { diff --git a/mozilla/content/svg/content/src/nsSVGElement.cpp b/mozilla/content/svg/content/src/nsSVGElement.cpp index 319f577c717..344e884493d 100644 --- a/mozilla/content/svg/content/src/nsSVGElement.cpp +++ b/mozilla/content/svg/content/src/nsSVGElement.cpp @@ -738,6 +738,16 @@ nsSVGElement::UpdateContentStyleRule() if (!parser) return; + // SVG and CSS differ slightly in their interpretation of some of + // the attributes. SVG allows attributes of the form: font-size="5" + // (style="font-size: 5" if using a style attribute) + // where CSS requires units: font-size="5pt" (style="font-size: 5pt") + // Set a flag to pass information to the parser so that we can use + // the CSS parser to parse the font-size attribute. Note that this + // does *not* effect the use of CSS stylesheets, which will still + // require units + parser->SetSVGMode(PR_TRUE); + PRUint32 attrCount = mAttrsAndChildren.AttrCount(); for (PRUint32 i = 0; i < attrCount; ++i) { const nsAttrName* attrName = mAttrsAndChildren.GetSafeAttrNameAt(i); diff --git a/mozilla/layout/style/nsCSSParser.cpp b/mozilla/layout/style/nsCSSParser.cpp index e029905f956..58f254ef2d8 100644 --- a/mozilla/layout/style/nsCSSParser.cpp +++ b/mozilla/layout/style/nsCSSParser.cpp @@ -99,6 +99,10 @@ public: NS_IMETHOD SetQuirkMode(PRBool aQuirkMode); +#ifdef MOZ_SVG + NS_IMETHOD SetSVGMode(PRBool aSVGMode); +#endif + NS_IMETHOD SetChildLoader(nsICSSLoader* aChildLoader); NS_IMETHOD Parse(nsIUnicharInputStream* aInput, @@ -338,6 +342,11 @@ protected: // True if we are in quirks mode; false in standards or almost standards mode PRPackedBool mNavQuirkMode; +#ifdef MOZ_SVG + // True if we are in SVG mode; false in "normal" CSS + PRPackedBool mSVGMode; +#endif + // True if tagnames and attributes are case-sensitive PRPackedBool mCaseSensitive; @@ -431,6 +440,9 @@ CSSParserImpl::CSSParserImpl() mSection(eCSSSection_Charset), mHavePushBack(PR_FALSE), mNavQuirkMode(PR_FALSE), +#ifdef MOZ_SVG + mSVGMode(PR_FALSE), +#endif mCaseSensitive(PR_FALSE), mParsingCompoundProperty(PR_FALSE) { @@ -476,6 +488,15 @@ CSSParserImpl::SetQuirkMode(PRBool aQuirkMode) return NS_OK; } +#ifdef MOZ_SVG +NS_IMETHODIMP +CSSParserImpl::SetSVGMode(PRBool aSVGMode) +{ + mSVGMode = aSVGMode; + return NS_OK; +} +#endif + NS_IMETHODIMP CSSParserImpl::SetChildLoader(nsICSSLoader* aChildLoader) { @@ -3515,6 +3536,19 @@ PRBool CSSParserImpl::ParseVariant(nsresult& aErrorCode, nsCSSValue& aValue, return PR_TRUE; } } + +#ifdef MOZ_SVG + if (mSVGMode && !IsParsingCompoundProperty()) { + // STANDARD: SVG Spec states that lengths and coordinates can be unitless + // in which case they default to user-units (1 px = 1 user unit) + if (((aVariantMask & VARIANT_LENGTH) != 0) && + (eCSSToken_Number == tk->mType)) { + aValue.SetFloatValue(tk->mNumber, eCSSUnit_Pixel); + return PR_TRUE; + } + } +#endif + if (((aVariantMask & VARIANT_URL) != 0) && (eCSSToken_Function == tk->mType) && tk->mIdent.LowerCaseEqualsLiteral("url")) { diff --git a/mozilla/layout/style/nsICSSParser.h b/mozilla/layout/style/nsICSSParser.h index 1be84c97ad3..99992e07991 100644 --- a/mozilla/layout/style/nsICSSParser.h +++ b/mozilla/layout/style/nsICSSParser.h @@ -72,6 +72,11 @@ public: // Set whether or not to emulate Nav quirks NS_IMETHOD SetQuirkMode(PRBool aQuirkMode) = 0; +#ifdef MOZ_SVG + // Set whether or not we are in an SVG element + NS_IMETHOD SetSVGMode(PRBool aSVGMode) = 0; +#endif + // Set loader to use for child sheets NS_IMETHOD SetChildLoader(nsICSSLoader* aChildLoader) = 0;