From 0aa1ee134583c462e6ab7acb578de46bdadb165c Mon Sep 17 00:00:00 2001 From: Dave Townsend Date: Sun, 10 Aug 2008 00:07:59 +0100 Subject: [PATCH] Backed out Bug 441469 due to Tp regressions --- .../en-US/chrome/layout/css.properties | 6 +- dom/public/nsDOMClassInfoID.h | 4 - dom/src/base/nsDOMClassInfo.cpp | 17 +- layout/style/nsCSSDeclaration.h | 12 +- layout/style/nsCSSParser.cpp | 514 ++++-------------- layout/style/nsCSSProperty.h | 15 - layout/style/nsCSSProps.cpp | 66 +-- layout/style/nsCSSProps.h | 5 - layout/style/nsCSSRules.cpp | 428 +-------------- layout/style/nsCSSRules.h | 87 +-- layout/style/nsCSSValue.cpp | 19 +- layout/style/nsCSSValue.h | 23 +- layout/style/test/Makefile.in | 1 - layout/style/test/test_font_face_parser.html | 206 ------- 14 files changed, 140 insertions(+), 1263 deletions(-) delete mode 100644 layout/style/test/test_font_face_parser.html diff --git a/dom/locales/en-US/chrome/layout/css.properties b/dom/locales/en-US/chrome/layout/css.properties index b8ae7b0cd029..77839c06d2c3 100644 --- a/dom/locales/en-US/chrome/layout/css.properties +++ b/dom/locales/en-US/chrome/layout/css.properties @@ -42,8 +42,8 @@ PEParseRuleWSOnly=Whitespace-only string given to be parsed as rule. PEDeclDropped=Declaration dropped. PEDeclSkipped=Skipped to next declaration. PEUnknownProperty=Unknown property '%1$S'. -PEValueParsingError=Error in parsing value for '%1$S'. -PEExpectEndValue=Expected end of value but found '%1$S'. +PEPropertyParsingError=Error in parsing value for property '%1$S'. +PEExpectEndProperty=Expected end of value for property but found '%1$S'. PESkipAtRuleEOF=end of unknown at-rule PEUnknownAtRule=Unrecognized at-rule or error parsing at-rule '%1$S'. PECharsetRuleEOF=charset string in @charset rule @@ -127,8 +127,6 @@ PEBadDeclOrRuleEnd2=Expected ';' or '}' to terminate declaration but found '%1$S PEInaccessibleProperty2=Cannot specify value for internal property. PECommentEOF=end of comment SEUnterminatedString=Found unclosed string '%1$S'. -PEFontDescExpected=Expected font descriptor but found '%1$S'. -PEUnknownFontDesc=Unknown descriptor '%1$S' in @font-face rule. PEMQExpectedExpressionStart=Expected '(' to start media query expression but found '%1$S'. PEMQExpressionEOF=contents of media query expression PEMQExpectedFeatureName=Expected media feature name but found '%1$S'. diff --git a/dom/public/nsDOMClassInfoID.h b/dom/public/nsDOMClassInfoID.h index f047464ecd6c..a28acb3d3c50 100644 --- a/dom/public/nsDOMClassInfoID.h +++ b/dom/public/nsDOMClassInfoID.h @@ -428,10 +428,6 @@ enum nsDOMClassInfoID { eDOMClassInfo_Geolocation_id, eDOMClassInfo_Geolocator_id, - // @font-face in CSS - eDOMClassInfo_CSSFontFaceRule_id, - eDOMClassInfo_CSSFontFaceStyleDecl_id, - // WhatWG Video Element #if defined(MOZ_MEDIA) eDOMClassInfo_HTMLVideoElement_id, diff --git a/dom/src/base/nsDOMClassInfo.cpp b/dom/src/base/nsDOMClassInfo.cpp index 4e054050f15f..5dcd1ca72ecc 100644 --- a/dom/src/base/nsDOMClassInfo.cpp +++ b/dom/src/base/nsDOMClassInfo.cpp @@ -325,7 +325,6 @@ #include "nsIDOMCSSCharsetRule.h" #include "nsIDOMCSSImportRule.h" #include "nsIDOMCSSMediaRule.h" -#include "nsIDOMCSSFontFaceRule.h" #include "nsIDOMCSSMozDocumentRule.h" #include "nsIDOMCSSPrimitiveValue.h" #include "nsIDOMCSSStyleRule.h" @@ -815,7 +814,7 @@ static nsDOMClassInfoData sClassInfoData[] = { NS_DEFINE_CLASSINFO_DATA(CSSStyleDeclaration, nsCSSStyleDeclSH, ARRAY_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(ComputedCSSStyleDeclaration, nsCSSStyleDeclSH, - ARRAY_SCRIPTABLE_FLAGS) + DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(ROCSSPrimitiveValue, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) @@ -1254,11 +1253,6 @@ static nsDOMClassInfoData sClassInfoData[] = { NS_DEFINE_CLASSINFO_DATA(Geolocator, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) - NS_DEFINE_CLASSINFO_DATA(CSSFontFaceRule, nsDOMGenericSH, - DOM_DEFAULT_SCRIPTABLE_FLAGS) - NS_DEFINE_CLASSINFO_DATA(CSSFontFaceStyleDecl, nsCSSStyleDeclSH, - ARRAY_SCRIPTABLE_FLAGS) - #if defined(MOZ_MEDIA) NS_DEFINE_CLASSINFO_DATA(HTMLVideoElement, nsHTMLElementSH, ELEMENT_SCRIPTABLE_FLAGS) @@ -3446,15 +3440,6 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_ENTRY(nsIDOMGeolocator) DOM_CLASSINFO_MAP_END - DOM_CLASSINFO_MAP_BEGIN(CSSFontFaceRule, nsIDOMCSSFontFaceRule) - DOM_CLASSINFO_MAP_ENTRY(nsIDOMCSSFontFaceRule) - DOM_CLASSINFO_MAP_END - - DOM_CLASSINFO_MAP_BEGIN_NO_CLASS_IF(CSSFontFaceStyleDecl, - nsIDOMCSSStyleDeclaration) - DOM_CLASSINFO_MAP_ENTRY(nsIDOMCSSStyleDeclaration) - DOM_CLASSINFO_MAP_END - #if defined(MOZ_MEDIA) DOM_CLASSINFO_MAP_BEGIN(HTMLVideoElement, nsIDOMHTMLVideoElement) DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLVideoElement) diff --git a/layout/style/nsCSSDeclaration.h b/layout/style/nsCSSDeclaration.h index cbb5f5cc2b44..9bd1ea1ec3eb 100644 --- a/layout/style/nsCSSDeclaration.h +++ b/layout/style/nsCSSDeclaration.h @@ -150,11 +150,6 @@ public: void List(FILE* out = stdout, PRInt32 aIndent = 0) const; #endif - // return whether there was a value in |aValue| (i.e., it had a non-null unit) - static PRBool AppendCSSValueToString(nsCSSProperty aProperty, - const nsCSSValue& aValue, - nsAString& aResult); - private: // Not implemented, and not supported. nsCSSDeclaration& operator=(const nsCSSDeclaration& aCopy); @@ -163,6 +158,13 @@ private: static void AppendImportanceToString(PRBool aIsImportant, nsAString& aString); // return whether there was a value in |aValue| (i.e., it had a non-null unit) PRBool AppendValueToString(nsCSSProperty aProperty, nsAString& aResult) const; +public: + // return whether there was a value in |aValue| (i.e., it had a non-null unit) + static PRBool AppendCSSValueToString(nsCSSProperty aProperty, + const nsCSSValue& aValue, + nsAString& aResult); + +private: // May be called only for properties whose type is eCSSType_Value. nsresult GetValueOrImportantValue(nsCSSProperty aProperty, nsCSSValue& aValue) const; diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index 93833399226a..6b598e1b7097 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -294,12 +294,7 @@ protected: PRBool ProcessNameSpace(nsresult& aErrorCode, const nsString& aPrefix, const nsString& aURLSpec, RuleAppendFunc aAppendFunc, void* aProcessData); - PRBool ParseFontFaceRule(nsresult& aErrorCode, RuleAppendFunc aAppendFunc, void* aProcessData); - PRBool ParseFontDescriptor(nsresult& aErrorCode, nsCSSFontFaceRule* aRule); - PRBool ParseFontDescriptorValue(nsresult& aErrorCode, nsCSSFontDesc aDescID, - nsCSSValue& aValue); - PRBool ParsePageRule(nsresult& aErrorCode, RuleAppendFunc aAppendFunc, void* aProcessData); enum nsSelectorParsingStatus { @@ -421,11 +416,7 @@ protected: PRBool ParseCursor(nsresult& aErrorCode); PRBool ParseFont(nsresult& aErrorCode); PRBool ParseFontWeight(nsresult& aErrorCode, nsCSSValue& aValue); - PRBool ParseOneFamily(nsresult& aErrorCode, nsAString& aValue); PRBool ParseFamily(nsresult& aErrorCode, nsCSSValue& aValue); - PRBool ParseFontSrc(nsresult& aErrorCode, nsCSSValue& aValue); - PRBool ParseFontSrcFormat(nsresult& aErrorCode, nsTArray& values); - PRBool ParseFontRanges(nsresult& aErrorCode, nsCSSValue& aValue); PRBool ParseListStyle(nsresult& aErrorCode); PRBool ParseMargin(nsresult& aErrorCode); PRBool ParseMarks(nsresult& aErrorCode, nsCSSValue& aValue); @@ -1085,13 +1076,13 @@ CSSParserImpl::ParseProperty(const nsCSSProperty aPropID, } else { if (parsedOK) { // Junk at end of property value. - REPORT_UNEXPECTED_TOKEN(PEExpectEndValue); + REPORT_UNEXPECTED_TOKEN(PEExpectEndProperty); } NS_ConvertASCIItoUTF16 propName(nsCSSProps::GetStringValue(aPropID)); const PRUnichar *params[] = { propName.get() }; - REPORT_UNEXPECTED_P(PEValueParsingError, params); + REPORT_UNEXPECTED_P(PEPropertyParsingError, params); REPORT_UNEXPECTED(PEDeclDropped); OUTPUT_ERROR(); ClearTempData(aPropID); @@ -1315,7 +1306,7 @@ PRBool CSSParserImpl::ExpectEndProperty(nsresult& aErrorCode) UngetToken(); return PR_TRUE; } - REPORT_UNEXPECTED_TOKEN(PEExpectEndValue); + REPORT_UNEXPECTED_TOKEN(PEExpectEndProperty); UngetToken(); return PR_FALSE; } @@ -1999,109 +1990,12 @@ PRBool CSSParserImpl::ProcessNameSpace(nsresult& aErrorCode, const nsString& aPr return result; } -// font-face-rule: '@font-face' '{' font-description '}' -// font-description: font-descriptor+ -PRBool -CSSParserImpl::ParseFontFaceRule(nsresult& aErrorCode, - RuleAppendFunc aAppendFunc, void* aData) +PRBool CSSParserImpl::ParseFontFaceRule(nsresult& aErrorCode, RuleAppendFunc aAppendFunc, void* aData) { - if (!ExpectSymbol(aErrorCode, '{', PR_TRUE)) - return PR_FALSE; - - nsRefPtr rule(new nsCSSFontFaceRule()); - if (!rule) { - aErrorCode = NS_ERROR_OUT_OF_MEMORY; - return PR_FALSE; - } - - for (;;) { - if (!GetToken(aErrorCode, PR_TRUE)) { - REPORT_UNEXPECTED_EOF(PEFontFaceEOF); - break; - } - if (mToken.IsSymbol('}')) { // done! - UngetToken(); - break; - } - - // ignore extra semicolons - if (mToken.IsSymbol(';')) - continue; - - if (!ParseFontDescriptor(aErrorCode, rule)) { - REPORT_UNEXPECTED(PEDeclSkipped); - OUTPUT_ERROR(); - if (!SkipDeclaration(aErrorCode, PR_TRUE)) - break; - } - } - if (!ExpectSymbol(aErrorCode, '}', PR_TRUE)) - return PR_FALSE; - (*aAppendFunc)(rule, aData); - return PR_TRUE; + // XXX not yet implemented + return PR_FALSE; } -// font-descriptor: font-family-desc -// | font-style-desc -// | font-weight-desc -// | font-stretch-desc -// | font-src-desc -// | unicode-range-desc -// -// All font-*-desc productions follow the pattern -// IDENT ':' value ';' -// -// On entry to this function, mToken is the IDENT. - -PRBool -CSSParserImpl::ParseFontDescriptor(nsresult& aErrorCode, - nsCSSFontFaceRule* aRule) -{ - if (eCSSToken_Ident != mToken.mType) { - REPORT_UNEXPECTED_TOKEN(PEFontDescExpected); - return PR_FALSE; - } - - nsString descName = mToken.mIdent; - if (!ExpectSymbol(aErrorCode, ':', PR_TRUE)) { - REPORT_UNEXPECTED_TOKEN(PEParseDeclarationNoColon); - OUTPUT_ERROR(); - return PR_FALSE; - } - - nsCSSFontDesc descID = nsCSSProps::LookupFontDesc(descName); - nsCSSValue value; - - if (descID == eCSSFontDesc_UNKNOWN) { - if (NonMozillaVendorIdentifier(descName)) { - // silently skip other vendors' extensions - SkipDeclaration(aErrorCode, PR_TRUE); - return PR_TRUE; - } else { - const PRUnichar *params[] = { - descName.get() - }; - REPORT_UNEXPECTED_P(PEUnknownFontDesc, params); - return PR_FALSE; - } - } - - if (!ParseFontDescriptorValue(aErrorCode, descID, value)) { - const PRUnichar *params[] = { - descName.get() - }; - REPORT_UNEXPECTED_P(PEValueParsingError, params); - return PR_FALSE; - } - - if (!ExpectEndProperty(aErrorCode)) - return PR_FALSE; - - aRule->SetDesc(descID, value); - return PR_TRUE; -} - - PRBool CSSParserImpl::ParsePageRule(nsresult& aErrorCode, RuleAppendFunc aAppendFunc, void* aData) { // XXX not yet implemented @@ -3853,7 +3747,7 @@ CSSParserImpl::ParseDeclaration(nsresult& aErrorCode, const PRUnichar *params[] = { propertyName.get() }; - REPORT_UNEXPECTED_P(PEValueParsingError, params); + REPORT_UNEXPECTED_P(PEPropertyParsingError, params); REPORT_UNEXPECTED(PEDeclDropped); OUTPUT_ERROR(); ClearTempData(propID); @@ -4550,48 +4444,46 @@ PRBool CSSParserImpl::ParseAttr(nsresult& aErrorCode, nsCSSValue& aValue) return PR_FALSE; } -PRBool -CSSParserImpl::ParseURL(nsresult& aErrorCode, nsCSSValue& aValue) +PRBool CSSParserImpl::ParseURL(nsresult& aErrorCode, nsCSSValue& aValue) { if (!mSheetPrincipal) { NS_NOTREACHED("Codepaths that expect to parse URLs MUST pass in an " "origin principal"); return PR_FALSE; } + + if (ExpectSymbol(aErrorCode, '(', PR_FALSE)) { + if (! GetURLToken(aErrorCode)) { + return PR_FALSE; + } + nsCSSToken* tk = &mToken; + if ((eCSSToken_String == tk->mType) || (eCSSToken_URL == tk->mType)) { + // Translate url into an absolute url if the url is relative to + // the style sheet. + nsCOMPtr uri; + NS_NewURI(getter_AddRefs(uri), tk->mIdent, nsnull, mBaseURL); + if (ExpectSymbol(aErrorCode, ')', PR_TRUE)) { + // Set a null value on failure. Most failure cases should be + // NS_ERROR_MALFORMED_URI. + nsStringBuffer* buffer = nsCSSValue::BufferFromString(tk->mIdent); + if (NS_UNLIKELY(!buffer)) { + aErrorCode = NS_ERROR_OUT_OF_MEMORY; + return PR_FALSE; + } - if (!ExpectSymbol(aErrorCode, '(', PR_FALSE)) - return PR_FALSE; - if (!GetURLToken(aErrorCode)) - return PR_FALSE; - - nsCSSToken* tk = &mToken; - if (eCSSToken_String != tk->mType && eCSSToken_URL != tk->mType) - return PR_FALSE; - - nsString url = tk->mIdent; - if (!ExpectSymbol(aErrorCode, ')', PR_TRUE)) - return PR_FALSE; - - // Translate url into an absolute url if the url is relative to the - // style sheet. - nsCOMPtr uri; - NS_NewURI(getter_AddRefs(uri), url, nsnull, mBaseURL); - - nsStringBuffer* buffer = nsCSSValue::BufferFromString(url); - if (NS_UNLIKELY(!buffer)) { - aErrorCode = NS_ERROR_OUT_OF_MEMORY; - return PR_FALSE; + nsCSSValue::URL *url = + new nsCSSValue::URL(uri, buffer, mSheetURL, mSheetPrincipal); + buffer->Release(); + if (NS_UNLIKELY(!url)) { + aErrorCode = NS_ERROR_OUT_OF_MEMORY; + return PR_FALSE; + } + aValue.SetURLValue(url); + return PR_TRUE; + } + } } - nsCSSValue::URL *urlVal = - new nsCSSValue::URL(uri, buffer, mSheetURL, mSheetPrincipal); - - buffer->Release(); - if (NS_UNLIKELY(!urlVal)) { - aErrorCode = NS_ERROR_OUT_OF_MEMORY; - return PR_FALSE; - } - aValue.SetURLValue(urlVal); - return PR_TRUE; + return PR_FALSE; } PRInt32 CSSParserImpl::ParseChoice(nsresult& aErrorCode, nsCSSValue aValues[], @@ -5493,95 +5385,6 @@ PRBool CSSParserImpl::ParseSingleValueProperty(nsresult& aErrorCode, return PR_FALSE; } -// nsFont::EnumerateFamilies callback for ParseFontDescriptorValue -struct NS_STACK_CLASS ExtractFirstFamilyData { - nsAutoString mFamilyName; - PRBool mGood; - ExtractFirstFamilyData() : mFamilyName(), mGood(PR_FALSE) {} -}; - -static PRBool -ExtractFirstFamily(const nsString& aFamily, - PRBool aGeneric, - void* aData) -{ - ExtractFirstFamilyData* realData = (ExtractFirstFamilyData*) aData; - if (aGeneric || realData->mFamilyName.Length() > 0) { - realData->mGood = PR_FALSE; - return PR_FALSE; - } - realData->mFamilyName.Assign(aFamily); - realData->mGood = PR_TRUE; - return PR_TRUE; -} - -// font-descriptor: descriptor ':' value ';' -// caller has advanced mToken to point at the descriptor -PRBool -CSSParserImpl::ParseFontDescriptorValue(nsresult& aErrorCode, - nsCSSFontDesc aDescID, - nsCSSValue& aValue) -{ - switch (aDescID) { - // These four are similar to the properties of the same name, - // possibly with more restrictions on the values they can take. - case eCSSFontDesc_Family: { - if (!ParseFamily(aErrorCode, aValue) || - aValue.GetUnit() != eCSSUnit_String) - return PR_FALSE; - - // the style parameters to the nsFont constructor are ignored, - // because it's only being used to call EnumerateFamilies - nsAutoString valueStr; - aValue.GetStringValue(valueStr); - nsFont font(valueStr, 0, 0, 0, 0, 0); - ExtractFirstFamilyData dat; - - font.EnumerateFamilies(ExtractFirstFamily, (void*) &dat); - if (!dat.mGood) - return PR_FALSE; - - aValue.SetStringValue(dat.mFamilyName, eCSSUnit_String); - return PR_TRUE; - } - - case eCSSFontDesc_Style: - // property is VARIANT_HMK|VARIANT_SYSFONT - return ParseVariant(aErrorCode, aValue, VARIANT_KEYWORD | VARIANT_NORMAL, - nsCSSProps::kFontStyleKTable); - - case eCSSFontDesc_Weight: - return (ParseFontWeight(aErrorCode, aValue) && - aValue.GetUnit() != eCSSUnit_Inherit && - aValue.GetUnit() != eCSSUnit_Initial && - (aValue.GetUnit() != eCSSUnit_Enumerated || - (aValue.GetIntValue() != NS_STYLE_FONT_WEIGHT_BOLDER && - aValue.GetIntValue() != NS_STYLE_FONT_WEIGHT_LIGHTER))); - - case eCSSFontDesc_Stretch: - // property is VARIANT_HMK|VARIANT_SYSFONT - return (ParseVariant(aErrorCode, aValue, VARIANT_KEYWORD | VARIANT_NORMAL, - nsCSSProps::kFontStretchKTable) && - (aValue.GetUnit() != eCSSUnit_Enumerated || - (aValue.GetIntValue() != NS_STYLE_FONT_STRETCH_WIDER && - aValue.GetIntValue() != NS_STYLE_FONT_STRETCH_NARROWER))); - - // These two are unique to @font-face and have their own special grammar. - case eCSSFontDesc_Src: - return ParseFontSrc(aErrorCode, aValue); - - case eCSSFontDesc_UnicodeRange: - return ParseFontRanges(aErrorCode, aValue); - - case eCSSFontDesc_UNKNOWN: - case eCSSFontDesc_COUNT: - NS_NOTREACHED("bad nsCSSFontDesc code"); - } - // explicitly do NOT have a default case to let the compiler - // help find missing descriptors - return PR_FALSE; -} - void CSSParserImpl::InitBoxPropsAsPhysical(const nsCSSProperty *aSourceProperties) { @@ -6621,86 +6424,78 @@ PRBool CSSParserImpl::ParseFontWeight(nsresult& aErrorCode, nsCSSValue& aValue) return PR_FALSE; } -PRBool CSSParserImpl::ParseOneFamily(nsresult& aErrorCode, nsAString& aFamily) +PRBool CSSParserImpl::ParseFamily(nsresult& aErrorCode, nsCSSValue& aValue) { - if (!GetToken(aErrorCode, PR_TRUE)) - return PR_FALSE; - nsCSSToken* tk = &mToken; - - if (eCSSToken_Ident == tk->mType) { - aFamily.Append(tk->mIdent); - for (;;) { - if (!GetToken(aErrorCode, PR_FALSE)) - break; - - if (eCSSToken_Ident == tk->mType) { - aFamily.Append(tk->mIdent); - } else if (eCSSToken_WhiteSpace == tk->mType) { - // Lookahead one token and drop whitespace if we are ending the - // font name. - if (!GetToken(aErrorCode, PR_TRUE)) + nsAutoString family; + PRBool firstOne = PR_TRUE; + for (;;) { + if (!GetToken(aErrorCode, PR_TRUE)) { + break; + } + if (eCSSToken_Ident == tk->mType) { + if (firstOne) { + nsCSSKeyword keyword = nsCSSKeywords::LookupKeyword(tk->mIdent); + if (keyword == eCSSKeyword_inherit) { + aValue.SetInheritValue(); + return PR_TRUE; + } + if (keyword == eCSSKeyword__moz_initial) { + aValue.SetInitialValue(); + return PR_TRUE; + } + if (keyword == eCSSKeyword__moz_use_system_font && + !IsParsingCompoundProperty()) { + aValue.SetSystemFontValue(); + return PR_TRUE; + } + } + else { + family.Append(PRUnichar(',')); + } + family.Append(tk->mIdent); + for (;;) { + if (!GetToken(aErrorCode, PR_FALSE)) { break; - - UngetToken(); - if (eCSSToken_Ident == tk->mType) - aFamily.Append(PRUnichar(' ')); - else + } + if (eCSSToken_Ident == tk->mType) { + family.Append(tk->mIdent); + } else if (eCSSToken_WhiteSpace == tk->mType) { + // Lookahead one token and drop whitespace if we ending the + // font name. + if (!GetToken(aErrorCode, PR_TRUE)) { + break; + } + if (eCSSToken_Ident != tk->mType) { + UngetToken(); + break; + } + UngetToken(); + family.Append(PRUnichar(' ')); + } else { + UngetToken(); break; - } else { + } + } + firstOne = PR_FALSE; + } else if (eCSSToken_String == tk->mType) { + if (!firstOne) { + family.Append(PRUnichar(',')); + } + family.Append(tk->mSymbol); // replace the quotes + family.Append(tk->mIdent); // XXX What if it had escaped quotes? + family.Append(tk->mSymbol); + firstOne = PR_FALSE; + } else if (eCSSToken_Symbol == tk->mType) { + if (',' != tk->mSymbol) { UngetToken(); break; } - } - return PR_TRUE; - - } else if (eCSSToken_String == tk->mType) { - aFamily.Append(tk->mSymbol); // replace the quotes - aFamily.Append(tk->mIdent); // XXX What if it had escaped quotes? - aFamily.Append(tk->mSymbol); - return PR_TRUE; - - } else { - UngetToken(); - return PR_FALSE; - } -} - -PRBool CSSParserImpl::ParseFamily(nsresult& aErrorCode, nsCSSValue& aValue) -{ - if (!GetToken(aErrorCode, PR_TRUE)) - return PR_FALSE; - - if (eCSSToken_Ident == mToken.mType) { - nsCSSKeyword keyword = nsCSSKeywords::LookupKeyword(mToken.mIdent); - if (keyword == eCSSKeyword_inherit) { - aValue.SetInheritValue(); - return PR_TRUE; - } - if (keyword == eCSSKeyword__moz_initial) { - aValue.SetInitialValue(); - return PR_TRUE; - } - if (keyword == eCSSKeyword__moz_use_system_font && - !IsParsingCompoundProperty()) { - aValue.SetSystemFontValue(); - return PR_TRUE; - } - } - - UngetToken(); - - nsAutoString family; - for (;;) { - if (!ParseOneFamily(aErrorCode, family)) - return PR_FALSE; - - if (!ExpectSymbol(aErrorCode, ',', PR_TRUE)) + } else { + UngetToken(); break; - - family.Append(PRUnichar(',')); + } } - if (family.IsEmpty()) { return PR_FALSE; } @@ -6708,111 +6503,6 @@ PRBool CSSParserImpl::ParseFamily(nsresult& aErrorCode, nsCSSValue& aValue) return PR_TRUE; } -// src: ( uri-src | local-src ) (',' ( uri-src | local-src ) )* -// uri-src: uri [ 'format(' string ( ',' string )* ')' ] -// local-src: 'local(' ( string | ident ) ')' - -PRBool -CSSParserImpl::ParseFontSrc(nsresult& aErrorCode, nsCSSValue& aValue) -{ - // could we maybe turn nsCSSValue::Array into nsTArray? - nsTArray values; - nsCSSValue cur; - for (;;) { - if (!GetToken(aErrorCode, PR_TRUE)) - break; - - if (mToken.mType == eCSSToken_Function && - mToken.mIdent.LowerCaseEqualsLiteral("url")) { - if (!ParseURL(aErrorCode, cur)) - return PR_FALSE; - values.AppendElement(cur); - if (!ParseFontSrcFormat(aErrorCode, values)) - return PR_FALSE; - - } else if (mToken.mType == eCSSToken_Function && - mToken.mIdent.LowerCaseEqualsLiteral("local")) { - // css3-fonts does not specify a formal grammar for local(). - // The text permits both unquoted identifiers and quoted - // strings. We resolve this ambiguity in the spec by - // assuming that the appropriate production is a single - // , possibly surrounded by whitespace. - - nsAutoString family; - if (!ExpectSymbol(aErrorCode, '(', PR_FALSE)) - return PR_FALSE; - if (!ParseOneFamily(aErrorCode, family)) - return PR_FALSE; - if (!ExpectSymbol(aErrorCode, ')', PR_TRUE)) - return PR_FALSE; - - // the style parameters to the nsFont constructor are ignored, - // because it's only being used to call EnumerateFamilies - nsFont font(family, 0, 0, 0, 0, 0); - ExtractFirstFamilyData dat; - - font.EnumerateFamilies(ExtractFirstFamily, (void*) &dat); - if (!dat.mGood) - return PR_FALSE; - - cur.SetStringValue(dat.mFamilyName, eCSSUnit_Local_Font); - values.AppendElement(cur); - } else { - return PR_FALSE; - } - - if (!ExpectSymbol(aErrorCode, ',', PR_TRUE)) - break; - } - - nsRefPtr srcVals - = nsCSSValue::Array::Create(values.Length()); - if (!srcVals) - return PR_FALSE; - - PRUint32 i; - for (i = 0; i < values.Length(); i++) - srcVals->Item(i) = values[i]; - aValue.SetArrayValue(srcVals, eCSSUnit_Array); - return PR_TRUE; -} - -PRBool -CSSParserImpl::ParseFontSrcFormat(nsresult& aErrorCode, - nsTArray & values) -{ - if (!GetToken(aErrorCode, PR_TRUE)) - return PR_TRUE; // EOF harmless here - if (mToken.mType != eCSSToken_Function || - !mToken.mIdent.LowerCaseEqualsLiteral("format")) { - UngetToken(); - return PR_TRUE; - } - if (!ExpectSymbol(aErrorCode, '(', PR_FALSE)) - return PR_FALSE; - - do { - if (!GetToken(aErrorCode, PR_TRUE)) - return PR_FALSE; - - if (mToken.mType != eCSSToken_String) - return PR_FALSE; - - nsCSSValue cur(mToken.mIdent, eCSSUnit_Font_Format); - values.AppendElement(cur); - } while (ExpectSymbol(aErrorCode, ',', PR_TRUE)); - - return ExpectSymbol(aErrorCode, ')', PR_TRUE); -} - -// font-ranges: urange ( ',' urange )* -PRBool -CSSParserImpl::ParseFontRanges(nsresult& aErrorCode, nsCSSValue& aValue) -{ - // not currently implemented (bug 443976) - return PR_FALSE; -} - PRBool CSSParserImpl::ParseListStyle(nsresult& aErrorCode) { const PRInt32 numProps = 3; diff --git a/layout/style/nsCSSProperty.h b/layout/style/nsCSSProperty.h index aff83959a62e..b01baf817be3 100644 --- a/layout/style/nsCSSProperty.h +++ b/layout/style/nsCSSProperty.h @@ -75,19 +75,4 @@ enum nsCSSType { eCSSType_ValuePairList }; -// The "descriptors" that can appear in a @font-face rule. -// They have the syntax of properties but different value rules. -// Keep in sync with kCSSRawFontDescs in nsCSSProps.cpp and -// nsCSSFontFaceStyleDecl::Fields in nsCSSRules.cpp. -enum nsCSSFontDesc { - eCSSFontDesc_UNKNOWN = -1, - eCSSFontDesc_Family, - eCSSFontDesc_Style, - eCSSFontDesc_Weight, - eCSSFontDesc_Stretch, - eCSSFontDesc_Src, - eCSSFontDesc_UnicodeRange, - eCSSFontDesc_COUNT -}; - #endif /* nsCSSProperty_h___ */ diff --git a/layout/style/nsCSSProps.cpp b/layout/style/nsCSSProps.cpp index 1ae4e155098a..3acc867ab48c 100644 --- a/layout/style/nsCSSProps.cpp +++ b/layout/style/nsCSSProps.cpp @@ -68,25 +68,12 @@ const char* const kCSSRawProperties[] = { static PRInt32 gTableRefCount; static nsStaticCaseInsensitiveNameTable* gPropertyTable; -static nsStaticCaseInsensitiveNameTable* gFontDescTable; - -// Keep in sync with enum nsCSSFontDesc in nsCSSProperty.h. -static const char* const kCSSRawFontDescs[] = { - "font-family", - "font-style", - "font-weight", - "font-stretch", - "src", - "unicode-range" -}; void nsCSSProps::AddRefTable(void) { if (0 == gTableRefCount++) { NS_ASSERTION(!gPropertyTable, "pre existing array!"); - NS_ASSERTION(!gFontDescTable, "pre existing array!"); - gPropertyTable = new nsStaticCaseInsensitiveNameTable(); if (gPropertyTable) { #ifdef DEBUG @@ -96,29 +83,12 @@ nsCSSProps::AddRefTable(void) nsCAutoString temp1(kCSSRawProperties[index]); nsCAutoString temp2(kCSSRawProperties[index]); ToLowerCase(temp1); - NS_ASSERTION(temp1.Equals(temp2), "upper case char in prop table"); - NS_ASSERTION(-1 == temp1.FindChar('_'), "underscore char in prop table"); + NS_ASSERTION(temp1.Equals(temp2), "upper case char in table"); + NS_ASSERTION(-1 == temp1.FindChar('_'), "underscore char in table"); } } #endif - gPropertyTable->Init(kCSSRawProperties, eCSSProperty_COUNT); - } - - gFontDescTable = new nsStaticCaseInsensitiveNameTable(); - if (gFontDescTable) { -#ifdef DEBUG - { - // let's verify the table... - for (PRInt32 index = 0; index < eCSSFontDesc_COUNT; ++index) { - nsCAutoString temp1(kCSSRawFontDescs[index]); - nsCAutoString temp2(kCSSRawFontDescs[index]); - ToLowerCase(temp1); - NS_ASSERTION(temp1.Equals(temp2), "upper case char in desc table"); - NS_ASSERTION(-1 == temp1.FindChar('_'), "underscore char in desc table"); - } - } -#endif - gFontDescTable->Init(kCSSRawFontDescs, eCSSFontDesc_COUNT); + gPropertyTable->Init(kCSSRawProperties, eCSSProperty_COUNT); } } } @@ -131,10 +101,6 @@ nsCSSProps::ReleaseTable(void) delete gPropertyTable; gPropertyTable = nsnull; } - if (gFontDescTable) { - delete gFontDescTable; - gFontDescTable = nsnull; - } } } @@ -194,20 +160,6 @@ nsCSSProps::LookupProperty(const nsAString& aProperty) return res; } -nsCSSFontDesc -nsCSSProps::LookupFontDesc(const nsACString& aFontDesc) -{ - NS_ASSERTION(gFontDescTable, "no lookup table, needs addref"); - return nsCSSFontDesc(gFontDescTable->Lookup(aFontDesc)); -} - -nsCSSFontDesc -nsCSSProps::LookupFontDesc(const nsAString& aFontDesc) -{ - NS_ASSERTION(gFontDescTable, "no lookup table, needs addref"); - return nsCSSFontDesc(gFontDescTable->Lookup(aFontDesc)); -} - const nsAFlatCString& nsCSSProps::GetStringValue(nsCSSProperty aProperty) { @@ -220,18 +172,6 @@ nsCSSProps::GetStringValue(nsCSSProperty aProperty) } } -const nsAFlatCString& -nsCSSProps::GetStringValue(nsCSSFontDesc aFontDescID) -{ - NS_ASSERTION(gFontDescTable, "no lookup table, needs addref"); - if (gFontDescTable) { - return gFontDescTable->GetStringValue(PRInt32(aFontDescID)); - } else { - static nsDependentCString sNullStr(""); - return sNullStr; - } -} - /***************************************************************************/ diff --git a/layout/style/nsCSSProps.h b/layout/style/nsCSSProps.h index 26b7793f8f44..9fb388fc33b8 100644 --- a/layout/style/nsCSSProps.h +++ b/layout/style/nsCSSProps.h @@ -65,13 +65,8 @@ public: return (aProperty >= eCSSProperty_COUNT_no_shorthands); } - // Same but for @font-face descriptors - static nsCSSFontDesc LookupFontDesc(const nsAString& aProperty); - static nsCSSFontDesc LookupFontDesc(const nsACString& aProperty); - // Given a property enum, get the string value static const nsAFlatCString& GetStringValue(nsCSSProperty aProperty); - static const nsAFlatCString& GetStringValue(nsCSSFontDesc aFontDesc); // Given a CSS Property and a Property Enum Value // Return back a const nsString& representation of the diff --git a/layout/style/nsCSSRules.cpp b/layout/style/nsCSSRules.cpp index a952423d1f57..210efb26af51 100644 --- a/layout/style/nsCSSRules.cpp +++ b/layout/style/nsCSSRules.cpp @@ -39,7 +39,6 @@ /* rules in a CSS stylesheet other than style rules (e.g., @import rules) */ #include "nsCSSRules.h" -#include "nsCSSValue.h" #include "nsICSSImportRule.h" #include "nsICSSNameSpaceRule.h" @@ -48,7 +47,6 @@ #include "nsIURL.h" #include "nsCSSRule.h" -#include "nsCSSProps.h" #include "nsICSSStyleSheet.h" #include "nsCOMPtr.h" @@ -58,7 +56,6 @@ #include "nsIDOMCSSMediaRule.h" #include "nsIDOMCSSMozDocumentRule.h" #include "nsIDOMCSSCharsetRule.h" -#include "nsIDOMCSSStyleDeclaration.h" #include "nsIMediaList.h" #include "nsIDOMMediaList.h" #include "nsIDOMCSSRuleList.h" @@ -69,8 +66,6 @@ #include "nsContentUtils.h" #include "nsStyleConsts.h" #include "nsDOMError.h" -#include "nsStyleUtil.h" -#include "nsCSSDeclaration.h" #define IMPL_STYLE_RULE_INHERIT(_class, super) \ NS_IMETHODIMP _class::GetStyleSheet(nsIStyleSheet*& aSheet) const { return super::GetStyleSheet(aSheet); } \ @@ -1018,7 +1013,7 @@ nsCSSMediaRule::GetMedia(nsIDOMMediaList* *aMedia) return NS_OK; } - return CallQueryInterface(mMedia.get(), aMedia); + return CallQueryInterface(mMedia, aMedia); } NS_IMETHODIMP @@ -1456,424 +1451,3 @@ CSSNameSpaceRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule) *aParentRule = nsnull; return NS_OK; } - -// ------------------------------------------- -// nsCSSFontFaceStyleDecl and related routines -// - -// A src: descriptor is represented as an array value; each entry in -// the array can be eCSSUnit_URL, eCSSUnit_Local_Font, or -// eCSSUnit_Font_Format. Blocks of eCSSUnit_Font_Format may appear -// only after one of the first two. (css3-fonts only contemplates -// annotating URLs with formats, but we handle the general case.) -static void -SerializeFontSrc(const nsCSSValue& src, nsAString & aResult NS_OUTPARAM) -{ - NS_PRECONDITION(src.GetUnit() == eCSSUnit_Null || - src.GetUnit() == eCSSUnit_Array, - "improper value unit for src:"); - aResult.Truncate(); - if (src.GetUnit() != eCSSUnit_Array) - return; - - const nsCSSValue::Array& sources = *src.GetArrayValue(); - PRUint32 i = 0; - - while (i < sources.Count()) { - nsAutoString formats; - - if (sources[i].GetUnit() == eCSSUnit_URL) { - nsDependentString url(sources[i].GetOriginalURLValue()); - nsAutoString escapedUrl; - nsStyleUtil::EscapeCSSString(url, escapedUrl); - aResult.AppendLiteral("url(\""); - aResult.Append(escapedUrl); - aResult.AppendLiteral("\")"); - } else if (sources[i].GetUnit() == eCSSUnit_Local_Font) { - nsDependentString local(sources[i].GetStringBufferValue()); - nsAutoString escapedLocal; - nsStyleUtil::EscapeCSSString(local, escapedLocal); - aResult.AppendLiteral("local(\""); - aResult.Append(escapedLocal); - aResult.AppendLiteral("\")"); - } else { - NS_NOTREACHED("entry in src: descriptor with improper unit"); - i++; - continue; - } - - i++; - formats.Truncate(); - while (i < sources.Count() && - sources[i].GetUnit() == eCSSUnit_Font_Format) { - formats.Append('"'); - formats.Append(sources[i].GetStringBufferValue()); - formats.AppendLiteral("\", "); - i++; - } - if (formats.Length() > 0) { - formats.Truncate(formats.Length() - 2); // remove the last comma - aResult.AppendLiteral(" format("); - aResult.Append(formats); - aResult.Append(')'); - } - aResult.AppendLiteral(", "); - } - aResult.Truncate(aResult.Length() - 2); // remove the last comma-space -} - -// Mapping from nsCSSFontDesc codes to nsCSSFontFaceStyleDecl fields. -// Keep this in sync with enum nsCSSFontDesc in nsCSSProperty.h. -nsCSSValue nsCSSFontFaceStyleDecl::* const -nsCSSFontFaceStyleDecl::Fields[] = { - &nsCSSFontFaceStyleDecl::mFamily, - &nsCSSFontFaceStyleDecl::mStyle, - &nsCSSFontFaceStyleDecl::mWeight, - &nsCSSFontFaceStyleDecl::mStretch, - &nsCSSFontFaceStyleDecl::mSrc, - &nsCSSFontFaceStyleDecl::mUnicodeRange -}; - -// QueryInterface implementation for nsCSSFontFaceStyleDecl -NS_INTERFACE_MAP_BEGIN(nsCSSFontFaceStyleDecl) - NS_INTERFACE_MAP_ENTRY(nsIDOMCSSStyleDeclaration) - NS_INTERFACE_MAP_ENTRY(nsISupports) - NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(CSSFontFaceStyleDecl) -NS_INTERFACE_MAP_END - -NS_IMPL_ADDREF_USING_AGGREGATOR(nsCSSFontFaceStyleDecl, ContainingRule()) -NS_IMPL_RELEASE_USING_AGGREGATOR(nsCSSFontFaceStyleDecl, ContainingRule()) - -// helper for string GetPropertyValue and RemovePropertyValue -nsresult -nsCSSFontFaceStyleDecl::GetPropertyValue(nsCSSFontDesc aFontDescID, - nsAString & aResult NS_OUTPARAM) const -{ - NS_ENSURE_ARG_RANGE(aFontDescID, eCSSFontDesc_UNKNOWN, - eCSSFontDesc_COUNT - 1); - - aResult.Truncate(); - if (aFontDescID == eCSSFontDesc_UNKNOWN) - return NS_OK; - - const nsCSSValue& val = this->*nsCSSFontFaceStyleDecl::Fields[aFontDescID]; - - switch (aFontDescID) { - case eCSSFontDesc_Family: { - // we don't use AppendCSSValueToString here because it doesn't - // canonicalize the way we want, and anyway it's overkill when - // we know we have eCSSUnit_String - nsDependentString family(val.GetStringBufferValue()); - nsAutoString escapedFamily; - nsStyleUtil::EscapeCSSString(family, escapedFamily); - aResult.Append('"'); - aResult.Append(escapedFamily); - aResult.Append('"'); - return NS_OK; - } - - case eCSSFontDesc_Style: - nsCSSDeclaration::AppendCSSValueToString(eCSSProperty_font_style, val, - aResult); - return NS_OK; - - case eCSSFontDesc_Weight: - nsCSSDeclaration::AppendCSSValueToString(eCSSProperty_font_weight, val, - aResult); - return NS_OK; - - case eCSSFontDesc_Stretch: - nsCSSDeclaration::AppendCSSValueToString(eCSSProperty_font_stretch, val, - aResult); - return NS_OK; - - case eCSSFontDesc_Src: - SerializeFontSrc(val, aResult); - return NS_OK; - - case eCSSFontDesc_UnicodeRange: - // these are not implemented, so always return an empty string - return NS_OK; - - case eCSSFontDesc_UNKNOWN: - case eCSSFontDesc_COUNT: - ; - } - NS_NOTREACHED("nsCSSFontFaceStyleDecl::GetPropertyValue: " - "out-of-range value got to the switch"); - return NS_ERROR_INVALID_ARG; -} - - -// attribute DOMString cssText; -NS_IMETHODIMP -nsCSSFontFaceStyleDecl::GetCssText(nsAString & aCssText) -{ - nsAutoString descStr; - - aCssText.Truncate(); - for (nsCSSFontDesc id = nsCSSFontDesc(eCSSFontDesc_UNKNOWN + 1); - id < eCSSFontDesc_COUNT; - id = nsCSSFontDesc(id + 1)) { - if ((this->*nsCSSFontFaceStyleDecl::Fields[id]).GetUnit() - != eCSSUnit_Null && - NS_SUCCEEDED(GetPropertyValue(id, descStr))) { - NS_ASSERTION(descStr.Length() > 0, - "GetCssText: non-null unit, empty property value"); - aCssText.AppendLiteral(" "); - aCssText.AppendASCII(nsCSSProps::GetStringValue(id).get()); - aCssText.AppendLiteral(": "); - aCssText.Append(descStr); - aCssText.AppendLiteral(";\n"); - } - } - return NS_OK; -} - -NS_IMETHODIMP -nsCSSFontFaceStyleDecl::SetCssText(const nsAString & aCssText) -{ - return NS_ERROR_NOT_IMPLEMENTED; // bug 443978 -} - -// DOMString getPropertyValue (in DOMString propertyName); -NS_IMETHODIMP -nsCSSFontFaceStyleDecl::GetPropertyValue(const nsAString & propertyName, - nsAString & aResult NS_OUTPARAM) -{ - return GetPropertyValue(nsCSSProps::LookupFontDesc(propertyName), aResult); -} - -// nsIDOMCSSValue getPropertyCSSValue (in DOMString propertyName); -NS_IMETHODIMP -nsCSSFontFaceStyleDecl::GetPropertyCSSValue(const nsAString & propertyName, - nsIDOMCSSValue **aResult NS_OUTPARAM) -{ - // ??? nsDOMCSSDeclaration returns null/NS_OK, but that seems wrong. - return NS_ERROR_NOT_IMPLEMENTED; -} - -// DOMString removeProperty (in DOMString propertyName) raises (DOMException); -NS_IMETHODIMP -nsCSSFontFaceStyleDecl::RemoveProperty(const nsAString & propertyName, - nsAString & aResult NS_OUTPARAM) -{ - nsCSSFontDesc descID = nsCSSProps::LookupFontDesc(propertyName); - NS_ASSERTION(descID >= eCSSFontDesc_UNKNOWN && - descID < eCSSFontDesc_COUNT, - "LookupFontDesc returned value out of range"); - - if (descID == eCSSFontDesc_UNKNOWN) { - aResult.Truncate(); - } else { - nsresult rv = GetPropertyValue(descID, aResult); - NS_ENSURE_SUCCESS(rv, rv); - (this->*nsCSSFontFaceStyleDecl::Fields[descID]).Reset(); - } - return NS_OK; -} - -// DOMString getPropertyPriority (in DOMString propertyName); -NS_IMETHODIMP -nsCSSFontFaceStyleDecl::GetPropertyPriority(const nsAString & propertyName, - nsAString & aResult NS_OUTPARAM) -{ - // font descriptors do not have priorities at present - aResult.Truncate(); - return NS_OK; -} - -// void setProperty (in DOMString propertyName, in DOMString value, -// in DOMString priority) raises (DOMException); -NS_IMETHODIMP -nsCSSFontFaceStyleDecl::SetProperty(const nsAString & propertyName, - const nsAString & value, - const nsAString & priority) -{ - return NS_ERROR_NOT_IMPLEMENTED; // bug 443978 -} - -// readonly attribute unsigned long length; -NS_IMETHODIMP -nsCSSFontFaceStyleDecl::GetLength(PRUint32 *aLength) -{ - PRUint32 len = 0; - for (nsCSSFontDesc id = nsCSSFontDesc(eCSSFontDesc_UNKNOWN + 1); - id < eCSSFontDesc_COUNT; - id = nsCSSFontDesc(id + 1)) - if ((this->*nsCSSFontFaceStyleDecl::Fields[id]).GetUnit() != eCSSUnit_Null) - len++; - - *aLength = len; - return NS_OK; -} - -// DOMString item (in unsigned long index); -NS_IMETHODIMP -nsCSSFontFaceStyleDecl::Item(PRUint32 index, nsAString & aResult NS_OUTPARAM) - { - PRInt32 nset = -1; - for (nsCSSFontDesc id = nsCSSFontDesc(eCSSFontDesc_UNKNOWN + 1); - id < eCSSFontDesc_COUNT; - id = nsCSSFontDesc(id + 1)) { - if ((this->*nsCSSFontFaceStyleDecl::Fields[id]).GetUnit() - != eCSSUnit_Null) { - nset++; - if (nset == PRInt32(index)) { - aResult.AssignASCII(nsCSSProps::GetStringValue(id).get()); - return NS_OK; - } - } - } - aResult.Truncate(); - return NS_OK; -} - -// readonly attribute nsIDOMCSSRule parentRule; -NS_IMETHODIMP -nsCSSFontFaceStyleDecl::GetParentRule(nsIDOMCSSRule** aParentRule) -{ - return ContainingRule()->GetDOMRule(aParentRule); -} - - -// ------------------------------------------- -// nsCSSFontFaceRule -// - -NS_IMETHODIMP -nsCSSFontFaceRule::Clone(nsICSSRule*& aClone) const -{ - nsCSSFontFaceRule* clone = new nsCSSFontFaceRule(*this); - if (clone) { - return CallQueryInterface(clone, &aClone); - } - aClone = nsnull; - return NS_ERROR_OUT_OF_MEMORY; -} - -NS_IMPL_ADDREF_INHERITED(nsCSSFontFaceRule, nsCSSRule) -NS_IMPL_RELEASE_INHERITED(nsCSSFontFaceRule, nsCSSRule) - -// QueryInterface implementation for nsCSSFontFaceRule -NS_INTERFACE_MAP_BEGIN(nsCSSFontFaceRule) - NS_INTERFACE_MAP_ENTRY(nsICSSRule) - NS_INTERFACE_MAP_ENTRY(nsIStyleRule) - NS_INTERFACE_MAP_ENTRY(nsIDOMCSSFontFaceRule) - NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRule) - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsICSSRule) - NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(CSSFontFaceRule) -NS_INTERFACE_MAP_END - -IMPL_STYLE_RULE_INHERIT(nsCSSFontFaceRule, nsCSSRule) - -#ifdef DEBUG -NS_IMETHODIMP -nsCSSFontFaceRule::List(FILE* out, PRInt32 aIndent) const -{ - nsCString baseInd, descInd; - for (PRInt32 indent = aIndent; --indent >= 0; ) { - baseInd.AppendLiteral(" "); - descInd.AppendLiteral(" "); - } - descInd.AppendLiteral(" "); - - nsString descStr; - - fprintf(out, "%s@font-face {\n", baseInd.get()); - for (nsCSSFontDesc id = nsCSSFontDesc(eCSSFontDesc_UNKNOWN + 1); - id < eCSSFontDesc_COUNT; - id = nsCSSFontDesc(id + 1)) - if ((mDecl.*nsCSSFontFaceStyleDecl::Fields[id]).GetUnit() - != eCSSUnit_Null) { - if (NS_FAILED(mDecl.GetPropertyValue(id, descStr))) - descStr.AssignLiteral("#"); - else if (descStr.Length() == 0) - descStr.AssignLiteral("#"); - fprintf(out, "%s%s: %s\n", - descInd.get(), nsCSSProps::GetStringValue(id).get(), - NS_ConvertUTF16toUTF8(descStr).get()); - } - fprintf(out, "%s}\n", baseInd.get()); - return NS_OK; -} -#endif - -NS_IMETHODIMP -nsCSSFontFaceRule::GetType(PRInt32& aType) const -{ - aType = nsICSSRule::FONT_FACE_RULE; - return NS_OK; -} - -NS_IMETHODIMP -nsCSSFontFaceRule::GetType(PRUint16* aType) -{ - *aType = nsIDOMCSSRule::FONT_FACE_RULE; - return NS_OK; -} - -NS_IMETHODIMP -nsCSSFontFaceRule::GetCssText(nsAString& aCssText) -{ - nsAutoString propText; - mDecl.GetCssText(propText); - - aCssText.AssignLiteral("@font-face {\n"); - aCssText.Append(propText); - aCssText.Append('}'); - return NS_OK; -} - -NS_IMETHODIMP -nsCSSFontFaceRule::SetCssText(const nsAString& aCssText) -{ - return NS_ERROR_NOT_IMPLEMENTED; // bug 443978 -} - -NS_IMETHODIMP -nsCSSFontFaceRule::GetParentStyleSheet(nsIDOMCSSStyleSheet** aSheet) -{ - if (mSheet) { - return CallQueryInterface(mSheet, aSheet); - } - *aSheet = nsnull; - return NS_OK; -} - -NS_IMETHODIMP -nsCSSFontFaceRule::GetParentRule(nsIDOMCSSRule** aParentRule) -{ - if (mParentRule) { - return mParentRule->GetDOMRule(aParentRule); - } - *aParentRule = nsnull; - return NS_OK; -} - -NS_IMETHODIMP -nsCSSFontFaceRule::GetStyle(nsIDOMCSSStyleDeclaration** aStyle) -{ - return CallQueryInterface(&mDecl, aStyle); -} - -// Arguably these should forward to nsCSSFontFaceStyleDecl methods. -void -nsCSSFontFaceRule::SetDesc(nsCSSFontDesc aDescID, nsCSSValue const & aValue) -{ - NS_PRECONDITION(aDescID > eCSSFontDesc_UNKNOWN && - aDescID < eCSSFontDesc_COUNT, - "aDescID out of range in nsCSSFontFaceRule::SetDesc"); - - mDecl.*nsCSSFontFaceStyleDecl::Fields[aDescID] = aValue; -} - -void -nsCSSFontFaceRule::GetDesc(nsCSSFontDesc aDescID, nsCSSValue & aValue) -{ - NS_PRECONDITION(aDescID > eCSSFontDesc_UNKNOWN && - aDescID < eCSSFontDesc_COUNT, - "aDescID out of range in nsCSSFontFaceRule::GetDesc"); - - aValue = mDecl.*nsCSSFontFaceStyleDecl::Fields[aDescID]; -} diff --git a/layout/style/nsCSSRules.h b/layout/style/nsCSSRules.h index 53c88c64752c..a37974cd544d 100644 --- a/layout/style/nsCSSRules.h +++ b/layout/style/nsCSSRules.h @@ -45,13 +45,12 @@ #include "nsCSSRule.h" #include "nsICSSGroupRule.h" +#include "nsCOMPtr.h" +#include "nsAutoPtr.h" +#include "nsCOMArray.h" #include "nsIDOMCSSMediaRule.h" #include "nsIDOMCSSMozDocumentRule.h" -#include "nsIDOMCSSFontFaceRule.h" -#include "nsIDOMCSSStyleDeclaration.h" -#include "nsAutoPtr.h" -#include "nsCSSProperty.h" -#include "nsCSSValue.h" +#include "nsString.h" class CSSGroupRuleRuleListImpl; class nsMediaList; @@ -143,7 +142,7 @@ public: nsresult SetMedia(nsMediaList* aMedia); protected: - nsRefPtr mMedia; + nsCOMPtr mMedia; }; class nsCSSDocumentRule : public nsCSSGroupRule, @@ -202,81 +201,5 @@ protected: nsAutoPtr mURLs; // linked list of |struct URL| above. }; -// A nsCSSFontFaceStyleDecl is always embedded in a nsCSSFontFaceRule. -class nsCSSFontFaceRule; -class nsCSSFontFaceStyleDecl : public nsIDOMCSSStyleDeclaration -{ -public: - NS_DECL_ISUPPORTS - NS_DECL_NSIDOMCSSSTYLEDECLARATION - - nsresult GetPropertyValue(nsCSSFontDesc aFontDescID, - nsAString & aResult NS_OUTPARAM) const; - -protected: - friend class nsCSSFontFaceRule; - nsCSSValue mFamily; - nsCSSValue mStyle; - nsCSSValue mWeight; - nsCSSValue mStretch; - nsCSSValue mSrc; - nsCSSValue mUnicodeRange; - - static nsCSSValue nsCSSFontFaceStyleDecl::* const Fields[]; - inline nsCSSFontFaceRule* ContainingRule(); - inline const nsCSSFontFaceRule* ContainingRule() const; - -private: - // NOT TO BE IMPLEMENTED - // This object cannot be allocated on its own, only as part of - // nsCSSFontFaceRule. - void* operator new(size_t size) CPP_THROW_NEW; -}; - -class nsCSSFontFaceRule : public nsCSSRule, - public nsICSSRule, - public nsIDOMCSSFontFaceRule -{ -public: - NS_DECL_ISUPPORTS_INHERITED - - // nsIStyleRule methods -#ifdef DEBUG - NS_IMETHOD List(FILE* out = stdout, PRInt32 aIndent = 0) const; -#endif - - // nsICSSRule methods - DECL_STYLE_RULE_INHERIT - - NS_IMETHOD GetType(PRInt32& aType) const; - NS_IMETHOD Clone(nsICSSRule*& aClone) const; - - // nsIDOMCSSRule interface - NS_DECL_NSIDOMCSSRULE - - // nsIDOMCSSFontFaceRule interface - NS_DECL_NSIDOMCSSFONTFACERULE - - void SetDesc(nsCSSFontDesc aDescID, nsCSSValue const & aValue); - void GetDesc(nsCSSFontDesc aDescID, nsCSSValue & aValue); - -protected: - friend class nsCSSFontFaceStyleDecl; - nsCSSFontFaceStyleDecl mDecl; -}; - -inline nsCSSFontFaceRule* -nsCSSFontFaceStyleDecl::ContainingRule() -{ - return reinterpret_cast - (reinterpret_cast(this) - offsetof(nsCSSFontFaceRule, mDecl)); -} - -inline const nsCSSFontFaceRule* -nsCSSFontFaceStyleDecl::ContainingRule() const -{ - return reinterpret_cast - (reinterpret_cast(this) - offsetof(nsCSSFontFaceRule, mDecl)); -} #endif /* !defined(nsCSSRules_h_) */ diff --git a/layout/style/nsCSSValue.cpp b/layout/style/nsCSSValue.cpp index d5c1ef3ed7d7..35e41dc7b4aa 100644 --- a/layout/style/nsCSSValue.cpp +++ b/layout/style/nsCSSValue.cpp @@ -80,8 +80,8 @@ nsCSSValue::nsCSSValue(float aValue, nsCSSUnit aUnit) nsCSSValue::nsCSSValue(const nsString& aValue, nsCSSUnit aUnit) : mUnit(aUnit) { - NS_ASSERTION(UnitHasStringValue(), "not a string value"); - if (UnitHasStringValue()) { + NS_ASSERTION((eCSSUnit_String <= aUnit) && (aUnit <= eCSSUnit_Attr), "not a string value"); + if ((eCSSUnit_String <= aUnit) && (aUnit <= eCSSUnit_Attr)) { mValue.mString = BufferFromString(aValue); if (NS_UNLIKELY(!mValue.mString)) { // XXXbz not much we can do here; just make sure that our promise of a @@ -133,7 +133,7 @@ nsCSSValue::nsCSSValue(const nsCSSValue& aCopy) else if (eCSSUnit_Percent <= mUnit) { mValue.mFloat = aCopy.mValue.mFloat; } - else if (UnitHasStringValue()) { + else if (eCSSUnit_String <= mUnit && mUnit <= eCSSUnit_Attr) { mValue.mString = aCopy.mValue.mString; mValue.mString->AddRef(); } @@ -175,7 +175,7 @@ PRBool nsCSSValue::operator==(const nsCSSValue& aOther) const if (mUnit <= eCSSUnit_Dummy) { return PR_TRUE; } - else if (UnitHasStringValue()) { + else if ((eCSSUnit_String <= mUnit) && (mUnit <= eCSSUnit_Attr)) { return (NS_strcmp(GetBufferValue(mValue.mString), GetBufferValue(aOther.mValue.mString)) == 0); } @@ -247,7 +247,7 @@ nscoord nsCSSValue::GetLengthTwips() const void nsCSSValue::DoReset() { - if (UnitHasStringValue()) { + if (eCSSUnit_String <= mUnit && mUnit <= eCSSUnit_Attr) { mValue.mString->Release(); } else if (eCSSUnit_Array <= mUnit && mUnit <= eCSSUnit_Counters) { mValue.mArray->Release(); @@ -291,18 +291,17 @@ void nsCSSValue::SetFloatValue(float aValue, nsCSSUnit aUnit) void nsCSSValue::SetStringValue(const nsString& aValue, nsCSSUnit aUnit) { + NS_ASSERTION((eCSSUnit_String <= aUnit) && (aUnit <= eCSSUnit_Attr), "not a string unit"); Reset(); - mUnit = aUnit; - NS_ASSERTION(UnitHasStringValue(), "not a string unit"); - if (UnitHasStringValue()) { + if ((eCSSUnit_String <= aUnit) && (aUnit <= eCSSUnit_Attr)) { + mUnit = aUnit; mValue.mString = BufferFromString(aValue); if (NS_UNLIKELY(!mValue.mString)) { // XXXbz not much we can do here; just make sure that our promise of a // non-null mValue.mString holds for string units. mUnit = eCSSUnit_Null; } - } else - mUnit = eCSSUnit_Null; + } } void nsCSSValue::SetColorValue(nscolor aValue) diff --git a/layout/style/nsCSSValue.h b/layout/style/nsCSSValue.h index 9431c0f54610..cc53a25b49c4 100644 --- a/layout/style/nsCSSValue.h +++ b/layout/style/nsCSSValue.h @@ -66,8 +66,6 @@ enum nsCSSUnit { // only in temporary values eCSSUnit_String = 10, // (PRUnichar*) a string value eCSSUnit_Attr = 11, // (PRUnichar*) a attr(string) value - eCSSUnit_Local_Font = 12, // (PRUnichar*) a local font name - eCSSUnit_Font_Format = 13, // (PRUnichar*) a font format name eCSSUnit_Array = 20, // (nsCSSValue::Array*) a list of values eCSSUnit_Counter = 21, // (nsCSSValue::Array*) a counter(string,[string]) value eCSSUnit_Counters = 22, // (nsCSSValue::Array*) a counters(string,string[,string]) value @@ -163,20 +161,17 @@ public: nsCSSUnit GetUnit() const { return mUnit; } PRBool IsLengthUnit() const - { return eCSSUnit_Inch <= mUnit && mUnit <= eCSSUnit_Pixel; } + { return PRBool((eCSSUnit_Inch <= mUnit) && (mUnit <= eCSSUnit_Pixel)); } PRBool IsFixedLengthUnit() const - { return eCSSUnit_Inch <= mUnit && mUnit <= eCSSUnit_Cicero; } + { return PRBool((eCSSUnit_Inch <= mUnit) && (mUnit <= eCSSUnit_Cicero)); } PRBool IsRelativeLengthUnit() const - { return eCSSUnit_EM <= mUnit && mUnit <= eCSSUnit_Pixel; } + { return PRBool((eCSSUnit_EM <= mUnit) && (mUnit <= eCSSUnit_Pixel)); } PRBool IsAngularUnit() const - { return eCSSUnit_Degree <= mUnit && mUnit <= eCSSUnit_Radian; } + { return PRBool((eCSSUnit_Degree <= mUnit) && (mUnit <= eCSSUnit_Radian)); } PRBool IsFrequencyUnit() const - { return eCSSUnit_Hertz <= mUnit && mUnit <= eCSSUnit_Kilohertz; } + { return PRBool((eCSSUnit_Hertz <= mUnit) && (mUnit <= eCSSUnit_Kilohertz)); } PRBool IsTimeUnit() const - { return eCSSUnit_Seconds <= mUnit && mUnit <= eCSSUnit_Milliseconds; } - - PRBool UnitHasStringValue() const - { return eCSSUnit_String <= mUnit && mUnit <= eCSSUnit_Font_Format; } + { return PRBool((eCSSUnit_Seconds <= mUnit) && (mUnit <= eCSSUnit_Milliseconds)); } PRInt32 GetIntValue() const { @@ -200,7 +195,8 @@ public: nsAString& GetStringValue(nsAString& aBuffer) const { - NS_ASSERTION(UnitHasStringValue(), "not a string value"); + NS_ASSERTION(eCSSUnit_String <= mUnit && mUnit <= eCSSUnit_Attr, + "not a string value"); aBuffer.Truncate(); PRUint32 len = NS_strlen(GetBufferValue(mValue.mString)); mValue.mString->ToString(len, aBuffer); @@ -209,7 +205,8 @@ public: const PRUnichar* GetStringBufferValue() const { - NS_ASSERTION(UnitHasStringValue(), "not a string value"); + NS_ASSERTION(eCSSUnit_String <= mUnit && mUnit <= eCSSUnit_Attr, + "not a string value"); return GetBufferValue(mValue.mString); } diff --git a/layout/style/test/Makefile.in b/layout/style/test/Makefile.in index 2d1b0f8e6f61..2f905e0256fe 100644 --- a/layout/style/test/Makefile.in +++ b/layout/style/test/Makefile.in @@ -99,7 +99,6 @@ _TEST_FILES = test_acid3_test46.html \ test_compute_data_with_start_struct.html \ test_css_eof_handling.html \ test_dont_use_document_colors.html \ - test_font_face_parser.html \ test_inherit_computation.html \ test_inherit_storage.html \ test_initial_computation.html \ diff --git a/layout/style/test/test_font_face_parser.html b/layout/style/test/test_font_face_parser.html deleted file mode 100644 index 1dfd98c1f8ce..000000000000 --- a/layout/style/test/test_font_face_parser.html +++ /dev/null @@ -1,206 +0,0 @@ - - - - - Test of @font-face parser - - - - - -

@font-face parsing (bug 441469)

-

-
-
-
-