Home | History | Annotate | Download | only in parser
      1 /*
      2  * Copyright (C) 2003 Lars Knoll (knoll (at) kde.org)
      3  * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved.
      4  * Copyright (C) 2008 Eric Seidel <eric (at) webkit.org>
      5  * Copyright (C) 2009 - 2010  Torch Mobile (Beijing) Co. Ltd. All rights reserved.
      6  *
      7  * This library is free software; you can redistribute it and/or
      8  * modify it under the terms of the GNU Library General Public
      9  * License as published by the Free Software Foundation; either
     10  * version 2 of the License, or (at your option) any later version.
     11  *
     12  * This library is distributed in the hope that it will be useful,
     13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15  * Library General Public License for more details.
     16  *
     17  * You should have received a copy of the GNU Library General Public License
     18  * along with this library; see the file COPYING.LIB.  If not, write to
     19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     20  * Boston, MA 02110-1301, USA.
     21  */
     22 
     23 #ifndef CSSPropertyParser_h
     24 #define CSSPropertyParser_h
     25 
     26 // FIXME: Way too many.
     27 #include "core/CSSPropertyNames.h"
     28 #include "core/CSSValueKeywords.h"
     29 #include "core/css/CSSCalculationValue.h"
     30 #include "core/css/CSSFilterValue.h"
     31 #include "core/css/CSSGradientValue.h"
     32 #include "core/css/CSSGridTemplateAreasValue.h"
     33 #include "core/css/CSSParserMode.h"
     34 #include "core/css/CSSParserValues.h"
     35 #include "core/css/CSSProperty.h"
     36 #include "core/css/CSSPropertySourceData.h"
     37 #include "core/css/CSSSelector.h"
     38 #include "platform/graphics/Color.h"
     39 #include "wtf/OwnPtr.h"
     40 #include "wtf/Vector.h"
     41 
     42 namespace WebCore {
     43 
     44 // FIXME: Many of these may not be used.
     45 class CSSArrayFunctionValue;
     46 class CSSBorderImageSliceValue;
     47 class CSSPrimitiveValue;
     48 class CSSSelectorList;
     49 class CSSValue;
     50 class CSSValueList;
     51 class CSSBasicShape;
     52 class CSSBasicShapeInset;
     53 class CSSGridLineNamesValue;
     54 class Document;
     55 class Element;
     56 class ImmutableStylePropertySet;
     57 class StyleKeyframe;
     58 class StylePropertyShorthand;
     59 class StyleKeyframe;
     60 class UseCounter;
     61 
     62 // Inputs: PropertyID, isImportant bool, CSSParserValueList.
     63 // Outputs: Vector of CSSProperties
     64 
     65 class CSSPropertyParser {
     66     STACK_ALLOCATED();
     67 public:
     68     CSSPropertyParser(OwnPtr<CSSParserValueList>&,
     69         const CSSParserContext&, bool inViewport, bool savedImportant,
     70         WillBeHeapVector<CSSProperty, 256>&, CSSRuleSourceData::Type);
     71     ~CSSPropertyParser();
     72 
     73     // FIXME: Should this be on a separate ColorParser object?
     74     template<typename StringType>
     75     static bool fastParseColor(RGBA32&, const StringType&, bool strict);
     76 
     77     bool parseValue(CSSPropertyID, bool important);
     78 
     79     static bool isSystemColor(int id);
     80 
     81 private:
     82     bool inShorthand() const { return m_inParseShorthand; }
     83     bool inQuirksMode() const { return isQuirksModeBehavior(m_context.mode()); }
     84 
     85     bool inViewport() const { return m_inViewport; }
     86     bool parseViewportProperty(CSSPropertyID propId, bool important);
     87     bool parseViewportShorthand(CSSPropertyID propId, CSSPropertyID first, CSSPropertyID second, bool important);
     88 
     89     KURL completeURL(const String& url) const;
     90 
     91     void addPropertyWithPrefixingVariant(CSSPropertyID, PassRefPtrWillBeRawPtr<CSSValue>, bool important, bool implicit = false);
     92     void addProperty(CSSPropertyID, PassRefPtrWillBeRawPtr<CSSValue>, bool important, bool implicit = false);
     93     void rollbackLastProperties(int num);
     94     bool hasProperties() const { return !m_parsedProperties.isEmpty(); }
     95     void addExpandedPropertyForValue(CSSPropertyID propId, PassRefPtrWillBeRawPtr<CSSValue>, bool);
     96 
     97     PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseValidPrimitive(CSSValueID ident, CSSParserValue*);
     98 
     99     bool parseShorthand(CSSPropertyID, const StylePropertyShorthand&, bool important);
    100     bool parse4Values(CSSPropertyID, const CSSPropertyID* properties, bool important);
    101     bool parseContent(CSSPropertyID, bool important);
    102     bool parseQuotes(CSSPropertyID, bool important);
    103 
    104     PassRefPtrWillBeRawPtr<CSSValue> parseAttr(CSSParserValueList* args);
    105 
    106     PassRefPtrWillBeRawPtr<CSSValue> parseBackgroundColor();
    107 
    108     bool parseFillImage(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&);
    109 
    110     enum FillPositionFlag { InvalidFillPosition = 0, AmbiguousFillPosition = 1, XFillPosition = 2, YFillPosition = 4 };
    111     enum FillPositionParsingMode { ResolveValuesAsPercent = 0, ResolveValuesAsKeyword = 1 };
    112     PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseFillPositionComponent(CSSParserValueList*, unsigned& cumulativeFlags, FillPositionFlag& individualFlag, FillPositionParsingMode = ResolveValuesAsPercent);
    113     PassRefPtrWillBeRawPtr<CSSValue> parseFillPositionX(CSSParserValueList*);
    114     PassRefPtrWillBeRawPtr<CSSValue> parseFillPositionY(CSSParserValueList*);
    115     void parse2ValuesFillPosition(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&);
    116     bool isPotentialPositionValue(CSSParserValue*);
    117     void parseFillPosition(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&);
    118     void parse3ValuesFillPosition(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&, PassRefPtrWillBeRawPtr<CSSPrimitiveValue>, PassRefPtrWillBeRawPtr<CSSPrimitiveValue>);
    119     void parse4ValuesFillPosition(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&, PassRefPtrWillBeRawPtr<CSSPrimitiveValue>, PassRefPtrWillBeRawPtr<CSSPrimitiveValue>);
    120 
    121     void parseFillRepeat(RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&);
    122     PassRefPtrWillBeRawPtr<CSSValue> parseFillSize(CSSPropertyID, bool &allowComma);
    123 
    124     bool parseFillProperty(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&);
    125     bool parseFillShorthand(CSSPropertyID, const CSSPropertyID* properties, int numProperties, bool important);
    126 
    127     void addFillValue(RefPtrWillBeRawPtr<CSSValue>& lval, PassRefPtrWillBeRawPtr<CSSValue> rval);
    128 
    129     void addAnimationValue(RefPtrWillBeRawPtr<CSSValue>& lval, PassRefPtrWillBeRawPtr<CSSValue> rval);
    130 
    131     PassRefPtrWillBeRawPtr<CSSValue> parseAnimationDelay();
    132     PassRefPtrWillBeRawPtr<CSSValue> parseAnimationDirection();
    133     PassRefPtrWillBeRawPtr<CSSValue> parseAnimationDuration();
    134     PassRefPtrWillBeRawPtr<CSSValue> parseAnimationFillMode();
    135     PassRefPtrWillBeRawPtr<CSSValue> parseAnimationIterationCount();
    136     PassRefPtrWillBeRawPtr<CSSValue> parseAnimationName();
    137     PassRefPtrWillBeRawPtr<CSSValue> parseAnimationPlayState();
    138     PassRefPtrWillBeRawPtr<CSSValue> parseAnimationProperty();
    139     PassRefPtrWillBeRawPtr<CSSValue> parseAnimationTimingFunction();
    140 
    141     bool parseWebkitTransformOriginShorthand(RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&);
    142     bool parseCubicBezierTimingFunctionValue(CSSParserValueList*& args, double& result);
    143     PassRefPtrWillBeRawPtr<CSSValue> parseAnimationProperty(CSSPropertyID);
    144     PassRefPtrWillBeRawPtr<CSSValueList> parseAnimationPropertyList(CSSPropertyID);
    145     bool parseTransitionShorthand(CSSPropertyID, bool important);
    146     bool parseAnimationShorthand(CSSPropertyID, bool important);
    147 
    148     PassRefPtrWillBeRawPtr<CSSValue> parseColumnWidth();
    149     PassRefPtrWillBeRawPtr<CSSValue> parseColumnCount();
    150     bool parseColumnsShorthand(bool important);
    151 
    152     PassRefPtrWillBeRawPtr<CSSValue> parseGridPosition();
    153     bool parseIntegerOrCustomIdentFromGridPosition(RefPtrWillBeRawPtr<CSSPrimitiveValue>& numericValue, RefPtrWillBeRawPtr<CSSPrimitiveValue>& gridLineName);
    154     bool parseGridItemPositionShorthand(CSSPropertyID, bool important);
    155     bool parseGridTemplateRowsAndAreas(PassRefPtrWillBeRawPtr<CSSValue>, bool important);
    156     bool parseGridTemplateShorthand(bool important);
    157     bool parseGridShorthand(bool important);
    158     bool parseGridAreaShorthand(bool important);
    159     bool parseSingleGridAreaLonghand(RefPtrWillBeRawPtr<CSSValue>&);
    160     PassRefPtrWillBeRawPtr<CSSValue> parseGridTrackList(bool important);
    161     bool parseGridTrackRepeatFunction(CSSValueList&);
    162     PassRefPtrWillBeRawPtr<CSSValue> parseGridTrackSize(CSSParserValueList& inputList);
    163     PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseGridBreadth(CSSParserValue*);
    164     bool parseGridTemplateAreasRow(NamedGridAreaMap&, const size_t, size_t&);
    165     PassRefPtrWillBeRawPtr<CSSValue> parseGridTemplateAreas();
    166     void parseGridLineNames(CSSParserValueList&, CSSValueList&, CSSGridLineNamesValue* = 0);
    167 
    168     bool parseClipShape(CSSPropertyID, bool important);
    169 
    170     bool parseItemPositionOverflowPosition(CSSPropertyID, bool important);
    171 
    172     PassRefPtrWillBeRawPtr<CSSValue> parseShapeProperty(CSSPropertyID propId);
    173     PassRefPtrWillBeRawPtr<CSSValue> parseBasicShapeAndOrBox();
    174     PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseBasicShape();
    175     PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseShapeRadius(CSSParserValue*);
    176 
    177     PassRefPtrWillBeRawPtr<CSSBasicShape> parseBasicShapeCircle(CSSParserValueList* args);
    178     PassRefPtrWillBeRawPtr<CSSBasicShape> parseBasicShapeEllipse(CSSParserValueList* args);
    179     PassRefPtrWillBeRawPtr<CSSBasicShape> parseBasicShapePolygon(CSSParserValueList* args);
    180     PassRefPtrWillBeRawPtr<CSSBasicShape> parseBasicShapeInset(CSSParserValueList* args);
    181 
    182     bool parseFont(bool important);
    183     PassRefPtrWillBeRawPtr<CSSValueList> parseFontFamily();
    184 
    185     bool parseCounter(CSSPropertyID, int defaultValue, bool important);
    186     PassRefPtrWillBeRawPtr<CSSValue> parseCounterContent(CSSParserValueList* args, bool counters);
    187 
    188     bool parseColorParameters(CSSParserValue*, int* colorValues, bool parseAlpha);
    189     bool parseHSLParameters(CSSParserValue*, double* colorValues, bool parseAlpha);
    190     PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseColor(CSSParserValue* = 0);
    191     bool parseColorFromValue(CSSParserValue*, RGBA32&);
    192 
    193     bool parseLineHeight(bool important);
    194     bool parseFontSize(bool important);
    195     bool parseFontVariant(bool important);
    196     bool parseFontWeight(bool important);
    197     bool parseFontFaceSrc();
    198     bool parseFontFaceUnicodeRange();
    199 
    200     bool parseSVGValue(CSSPropertyID propId, bool important);
    201     PassRefPtrWillBeRawPtr<CSSValue> parseSVGPaint();
    202     PassRefPtrWillBeRawPtr<CSSValue> parseSVGStrokeDasharray();
    203 
    204     PassRefPtrWillBeRawPtr<CSSValue> parsePaintOrder() const;
    205 
    206     // CSS3 Parsing Routines (for properties specific to CSS3)
    207     PassRefPtrWillBeRawPtr<CSSValueList> parseShadow(CSSParserValueList*, CSSPropertyID);
    208     bool parseBorderImageShorthand(CSSPropertyID, bool important);
    209     PassRefPtrWillBeRawPtr<CSSValue> parseBorderImage(CSSPropertyID);
    210     bool parseBorderImageRepeat(RefPtrWillBeRawPtr<CSSValue>&);
    211     bool parseBorderImageSlice(CSSPropertyID, RefPtrWillBeRawPtr<CSSBorderImageSliceValue>&);
    212     bool parseBorderImageWidth(RefPtrWillBeRawPtr<CSSPrimitiveValue>&);
    213     bool parseBorderImageOutset(RefPtrWillBeRawPtr<CSSPrimitiveValue>&);
    214     bool parseBorderRadius(CSSPropertyID, bool important);
    215 
    216     bool parseAspectRatio(bool important);
    217 
    218     bool parseReflect(CSSPropertyID, bool important);
    219 
    220     bool parseFlex(CSSParserValueList* args, bool important);
    221 
    222     bool parseObjectPosition(bool important);
    223 
    224     // Image generators
    225     bool parseCanvas(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&);
    226 
    227     bool parseDeprecatedGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&);
    228     bool parseDeprecatedLinearGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, CSSGradientRepeat repeating);
    229     bool parseDeprecatedRadialGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, CSSGradientRepeat repeating);
    230     bool parseLinearGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, CSSGradientRepeat repeating);
    231     bool parseRadialGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, CSSGradientRepeat repeating);
    232     bool parseGradientColorStops(CSSParserValueList*, CSSGradientValue*, bool expectComma);
    233 
    234     bool parseCrossfade(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&);
    235 
    236     PassRefPtrWillBeRawPtr<CSSValue> parseImageSet(CSSParserValueList*);
    237 
    238     bool parseWillChange(bool important);
    239 
    240     PassRefPtrWillBeRawPtr<CSSValueList> parseFilter();
    241     PassRefPtrWillBeRawPtr<CSSFilterValue> parseBuiltinFilterArguments(CSSParserValueList*, CSSFilterValue::FilterOperationType);
    242 
    243     PassRefPtrWillBeRawPtr<CSSValueList> parseTransformOrigin();
    244     PassRefPtrWillBeRawPtr<CSSValueList> parseTransform(CSSPropertyID);
    245     PassRefPtrWillBeRawPtr<CSSValue> parseTransformValue(CSSPropertyID, CSSParserValue*);
    246     bool parseWebkitTransformOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, CSSPropertyID& propId3, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&);
    247     bool parseWebkitPerspectiveOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2,  RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&);
    248 
    249     bool parseTextEmphasisStyle(bool important);
    250 
    251     bool parseTouchAction(bool important);
    252 
    253     void addTextDecorationProperty(CSSPropertyID, PassRefPtrWillBeRawPtr<CSSValue>, bool important);
    254     bool parseTextDecoration(CSSPropertyID propId, bool important);
    255     bool parseTextUnderlinePosition(bool important);
    256 
    257     PassRefPtrWillBeRawPtr<CSSValue> parseTextIndent();
    258 
    259     bool parseLineBoxContain(bool important);
    260     bool parseCalculation(CSSParserValue*, ValueRange);
    261 
    262     bool parseFontFeatureTag(CSSValueList*);
    263     bool parseFontFeatureSettings(bool important);
    264 
    265     bool parseFontVariantLigatures(bool important);
    266 
    267     bool parseGeneratedImage(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&);
    268 
    269     PassRefPtrWillBeRawPtr<CSSPrimitiveValue> createPrimitiveNumericValue(CSSParserValue*);
    270     PassRefPtrWillBeRawPtr<CSSPrimitiveValue> createPrimitiveStringValue(CSSParserValue*);
    271 
    272     PassRefPtrWillBeRawPtr<CSSValue> createCSSImageValueWithReferrer(const String& rawValue, const KURL&);
    273 
    274     bool validWidthOrHeight(CSSParserValue*);
    275 
    276     PassRefPtrWillBeRawPtr<CSSBasicShape> parseInsetRoundedCorners(PassRefPtrWillBeRawPtr<CSSBasicShapeInset>, CSSParserValueList*);
    277 
    278     enum SizeParameterType {
    279         None,
    280         Auto,
    281         Length,
    282         PageSize,
    283         Orientation,
    284     };
    285 
    286     bool parsePage(CSSPropertyID propId, bool important);
    287     bool parseSize(CSSPropertyID propId, bool important);
    288     SizeParameterType parseSizeParameter(CSSValueList* parsedValues, CSSParserValue*, SizeParameterType prevParamType);
    289 
    290     bool parseFontFaceSrcURI(CSSValueList*);
    291     bool parseFontFaceSrcLocal(CSSValueList*);
    292 
    293     enum PropertyType {
    294         PropertyExplicit,
    295         PropertyImplicit
    296     };
    297 
    298     class ImplicitScope {
    299         STACK_ALLOCATED();
    300         WTF_MAKE_NONCOPYABLE(ImplicitScope);
    301     public:
    302         ImplicitScope(CSSPropertyParser* parser, PropertyType propertyType)
    303             : m_parser(parser)
    304         {
    305             m_parser->m_implicitShorthand = propertyType == CSSPropertyParser::PropertyImplicit;
    306         }
    307 
    308         ~ImplicitScope()
    309         {
    310             m_parser->m_implicitShorthand = false;
    311         }
    312 
    313     private:
    314         CSSPropertyParser* m_parser;
    315     };
    316 
    317     class ShorthandScope {
    318         STACK_ALLOCATED();
    319     public:
    320         ShorthandScope(CSSPropertyParser* parser, CSSPropertyID propId) : m_parser(parser)
    321         {
    322             if (!(m_parser->m_inParseShorthand++))
    323                 m_parser->m_currentShorthand = propId;
    324         }
    325         ~ShorthandScope()
    326         {
    327             if (!(--m_parser->m_inParseShorthand))
    328                 m_parser->m_currentShorthand = CSSPropertyInvalid;
    329         }
    330 
    331     private:
    332         CSSPropertyParser* m_parser;
    333     };
    334 
    335     enum ReleaseParsedCalcValueCondition {
    336         ReleaseParsedCalcValue,
    337         DoNotReleaseParsedCalcValue
    338     };
    339 
    340     enum Units {
    341         FUnknown = 0x0000,
    342         FInteger = 0x0001,
    343         FNumber = 0x0002, // Real Numbers
    344         FPercent = 0x0004,
    345         FLength = 0x0008,
    346         FAngle = 0x0010,
    347         FTime = 0x0020,
    348         FFrequency = 0x0040,
    349         FPositiveInteger = 0x0080,
    350         FRelative = 0x0100,
    351         FResolution = 0x0200,
    352         FNonNeg = 0x0400
    353     };
    354 
    355     friend inline Units operator|(Units a, Units b)
    356     {
    357         return static_cast<Units>(static_cast<unsigned>(a) | static_cast<unsigned>(b));
    358     }
    359 
    360     bool validCalculationUnit(CSSParserValue*, Units, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue);
    361 
    362     bool shouldAcceptUnitLessValues(CSSParserValue*, Units, CSSParserMode);
    363 
    364     inline bool validUnit(CSSParserValue* value, Units unitflags, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue) { return validUnit(value, unitflags, m_context.mode(), releaseCalc); }
    365     bool validUnit(CSSParserValue*, Units, CSSParserMode, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue);
    366 
    367     bool parseBorderImageQuad(Units, RefPtrWillBeRawPtr<CSSPrimitiveValue>&);
    368     int colorIntFromValue(CSSParserValue*);
    369     bool isCalculation(CSSParserValue*);
    370 
    371 private:
    372     // Inputs:
    373     // FIXME: This should not be an OwnPtr&, many callers will need to be changed.
    374     const OwnPtr<CSSParserValueList>& m_valueList;
    375     const CSSParserContext& m_context;
    376     const bool m_inViewport;
    377     const bool m_important; // FIXME: This is only used by font-face-src and unicode-range and undoubtably wrong!
    378 
    379     // Outputs:
    380     WillBeHeapVector<CSSProperty, 256>& m_parsedProperties;
    381     CSSRuleSourceData::Type m_ruleType;
    382 
    383     // Locals during parsing:
    384     int m_inParseShorthand;
    385     CSSPropertyID m_currentShorthand;
    386     bool m_implicitShorthand;
    387     RefPtrWillBeMember<CSSCalcValue> m_parsedCalculation;
    388 
    389     // FIXME: There is probably a small set of APIs we could expose for these
    390     // classes w/o needing to make them friends.
    391     friend class ShadowParseContext;
    392     friend class BorderImageParseContext;
    393     friend class BorderImageSliceParseContext;
    394     friend class BorderImageQuadParseContext;
    395     friend class TransformOperationInfo;
    396     friend bool parseDeprecatedGradientColorStop(CSSPropertyParser*, CSSParserValue*, CSSGradientColorStop&);
    397     friend PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseGradientColorOrKeyword(CSSPropertyParser*, CSSParserValue*);
    398 };
    399 
    400 CSSPropertyID cssPropertyID(const CSSParserString&);
    401 CSSPropertyID cssPropertyID(const String&);
    402 CSSValueID cssValueKeywordID(const CSSParserString&);
    403 
    404 bool isKeywordPropertyID(CSSPropertyID);
    405 bool isValidKeywordPropertyAndValue(CSSPropertyID, CSSValueID, const CSSParserContext&);
    406 
    407 } // namespace WebCore
    408 
    409 #endif // CSSPropertyParser_h
    410