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/CSSProperty.h" 34 #include "core/css/CSSPropertySourceData.h" 35 #include "core/css/CSSSelector.h" 36 #include "core/css/parser/CSSParserMode.h" 37 #include "core/css/parser/CSSParserValues.h" 38 #include "platform/graphics/Color.h" 39 #include "wtf/OwnPtr.h" 40 #include "wtf/Vector.h" 41 42 namespace blink { 43 44 class CSSBorderImageSliceValue; 45 class CSSPrimitiveValue; 46 class CSSValue; 47 class CSSValueList; 48 class CSSBasicShape; 49 class CSSBasicShapeInset; 50 class CSSGridLineNamesValue; 51 class StylePropertyShorthand; 52 53 // Inputs: PropertyID, isImportant bool, CSSParserValueList. 54 // Outputs: Vector of CSSProperties 55 56 class CSSPropertyParser { 57 STACK_ALLOCATED(); 58 public: 59 static bool parseValue(CSSPropertyID, bool important, 60 CSSParserValueList*, const CSSParserContext&, bool inViewport, 61 WillBeHeapVector<CSSProperty, 256>&, CSSRuleSourceData::Type); 62 63 // FIXME: Should this be on a separate ColorParser object? 64 template<typename StringType> 65 static bool fastParseColor(RGBA32&, const StringType&, bool strict); 66 67 static bool isSystemColor(int id); 68 69 private: 70 CSSPropertyParser(CSSParserValueList*, const CSSParserContext&, bool inViewport, 71 WillBeHeapVector<CSSProperty, 256>&, CSSRuleSourceData::Type); 72 73 bool parseValue(CSSPropertyID, bool important); 74 75 bool inShorthand() const { return m_inParseShorthand; } 76 bool inQuirksMode() const { return isQuirksModeBehavior(m_context.mode()); } 77 78 bool inViewport() const { return m_inViewport; } 79 bool parseViewportProperty(CSSPropertyID propId, bool important); 80 bool parseViewportShorthand(CSSPropertyID propId, CSSPropertyID first, CSSPropertyID second, bool important); 81 82 KURL completeURL(const String& url) const; 83 84 void addPropertyWithPrefixingVariant(CSSPropertyID, PassRefPtrWillBeRawPtr<CSSValue>, bool important, bool implicit = false); 85 void addProperty(CSSPropertyID, PassRefPtrWillBeRawPtr<CSSValue>, bool important, bool implicit = false); 86 void rollbackLastProperties(int num); 87 void addExpandedPropertyForValue(CSSPropertyID propId, PassRefPtrWillBeRawPtr<CSSValue>, bool); 88 89 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseValidPrimitive(CSSValueID ident, CSSParserValue*); 90 91 bool parseShorthand(CSSPropertyID, const StylePropertyShorthand&, bool important); 92 bool parse4Values(CSSPropertyID, const CSSPropertyID* properties, bool important); 93 bool parseContent(CSSPropertyID, bool important); 94 PassRefPtrWillBeRawPtr<CSSValue> parseQuotes(); 95 96 PassRefPtrWillBeRawPtr<CSSValue> parseAttr(CSSParserValueList* args); 97 98 PassRefPtrWillBeRawPtr<CSSValue> parseBackgroundColor(); 99 100 bool parseFillImage(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&); 101 102 enum FillPositionFlag { InvalidFillPosition = 0, AmbiguousFillPosition = 1, XFillPosition = 2, YFillPosition = 4 }; 103 enum FillPositionParsingMode { ResolveValuesAsPercent = 0, ResolveValuesAsKeyword = 1 }; 104 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseFillPositionComponent(CSSParserValueList*, unsigned& cumulativeFlags, FillPositionFlag& individualFlag, FillPositionParsingMode = ResolveValuesAsPercent); 105 PassRefPtrWillBeRawPtr<CSSValue> parseFillPositionX(CSSParserValueList*); 106 PassRefPtrWillBeRawPtr<CSSValue> parseFillPositionY(CSSParserValueList*); 107 void parse2ValuesFillPosition(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&); 108 bool isPotentialPositionValue(CSSParserValue*); 109 void parseFillPosition(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&); 110 void parse3ValuesFillPosition(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&, PassRefPtrWillBeRawPtr<CSSPrimitiveValue>, PassRefPtrWillBeRawPtr<CSSPrimitiveValue>); 111 void parse4ValuesFillPosition(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&, PassRefPtrWillBeRawPtr<CSSPrimitiveValue>, PassRefPtrWillBeRawPtr<CSSPrimitiveValue>); 112 113 void parseFillRepeat(RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&); 114 PassRefPtrWillBeRawPtr<CSSValue> parseFillSize(CSSPropertyID, bool &allowComma); 115 116 bool parseFillProperty(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&); 117 bool parseFillShorthand(CSSPropertyID, const CSSPropertyID* properties, int numProperties, bool important); 118 119 void addFillValue(RefPtrWillBeRawPtr<CSSValue>& lval, PassRefPtrWillBeRawPtr<CSSValue> rval); 120 121 PassRefPtrWillBeRawPtr<CSSValue> parseAnimationDelay(); 122 PassRefPtrWillBeRawPtr<CSSValue> parseAnimationDirection(); 123 PassRefPtrWillBeRawPtr<CSSValue> parseAnimationDuration(); 124 PassRefPtrWillBeRawPtr<CSSValue> parseAnimationFillMode(); 125 PassRefPtrWillBeRawPtr<CSSValue> parseAnimationIterationCount(); 126 PassRefPtrWillBeRawPtr<CSSValue> parseAnimationName(); 127 PassRefPtrWillBeRawPtr<CSSValue> parseAnimationPlayState(); 128 PassRefPtrWillBeRawPtr<CSSValue> parseAnimationProperty(); 129 PassRefPtrWillBeRawPtr<CSSValue> parseAnimationTimingFunction(); 130 131 bool parseWebkitTransformOriginShorthand(bool important); 132 bool parseCubicBezierTimingFunctionValue(CSSParserValueList*& args, double& result); 133 PassRefPtrWillBeRawPtr<CSSValue> parseAnimationProperty(CSSPropertyID); 134 PassRefPtrWillBeRawPtr<CSSValueList> parseAnimationPropertyList(CSSPropertyID); 135 bool parseTransitionShorthand(CSSPropertyID, bool important); 136 bool parseAnimationShorthand(CSSPropertyID, bool important); 137 138 PassRefPtrWillBeRawPtr<CSSValue> parseColumnWidth(); 139 PassRefPtrWillBeRawPtr<CSSValue> parseColumnCount(); 140 bool parseColumnsShorthand(bool important); 141 142 PassRefPtrWillBeRawPtr<CSSValue> parseGridPosition(); 143 bool parseIntegerOrCustomIdentFromGridPosition(RefPtrWillBeRawPtr<CSSPrimitiveValue>& numericValue, RefPtrWillBeRawPtr<CSSPrimitiveValue>& gridLineName); 144 bool parseGridItemPositionShorthand(CSSPropertyID, bool important); 145 bool parseGridTemplateRowsAndAreas(PassRefPtrWillBeRawPtr<CSSValue>, bool important); 146 bool parseGridTemplateShorthand(bool important); 147 bool parseGridShorthand(bool important); 148 bool parseGridAreaShorthand(bool important); 149 bool parseSingleGridAreaLonghand(RefPtrWillBeRawPtr<CSSValue>&); 150 PassRefPtrWillBeRawPtr<CSSValue> parseGridTrackList(); 151 bool parseGridTrackRepeatFunction(CSSValueList&); 152 PassRefPtrWillBeRawPtr<CSSValue> parseGridTrackSize(CSSParserValueList& inputList); 153 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseGridBreadth(CSSParserValue*); 154 bool parseGridTemplateAreasRow(NamedGridAreaMap&, const size_t, size_t&); 155 PassRefPtrWillBeRawPtr<CSSValue> parseGridTemplateAreas(); 156 bool parseGridLineNames(CSSParserValueList&, CSSValueList&, CSSGridLineNamesValue* = 0); 157 PassRefPtrWillBeRawPtr<CSSValue> parseGridAutoFlow(CSSParserValueList&); 158 159 bool parseClipShape(CSSPropertyID, bool important); 160 161 bool parseLegacyPosition(CSSPropertyID, bool important); 162 bool parseItemPositionOverflowPosition(CSSPropertyID, bool important); 163 164 PassRefPtrWillBeRawPtr<CSSValue> parseShapeProperty(CSSPropertyID propId); 165 PassRefPtrWillBeRawPtr<CSSValue> parseBasicShapeAndOrBox(); 166 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseBasicShape(); 167 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseShapeRadius(CSSParserValue*); 168 169 PassRefPtrWillBeRawPtr<CSSBasicShape> parseBasicShapeCircle(CSSParserValueList* args); 170 PassRefPtrWillBeRawPtr<CSSBasicShape> parseBasicShapeEllipse(CSSParserValueList* args); 171 PassRefPtrWillBeRawPtr<CSSBasicShape> parseBasicShapePolygon(CSSParserValueList* args); 172 PassRefPtrWillBeRawPtr<CSSBasicShape> parseBasicShapeInset(CSSParserValueList* args); 173 174 bool parseFont(bool important); 175 PassRefPtrWillBeRawPtr<CSSValueList> parseFontFamily(); 176 177 PassRefPtrWillBeRawPtr<CSSValue> parseCounter(int defaultValue); 178 PassRefPtrWillBeRawPtr<CSSValue> parseCounterContent(CSSParserValueList* args, bool counters); 179 180 bool parseColorParameters(CSSParserValue*, int* colorValues, bool parseAlpha); 181 bool parseHSLParameters(CSSParserValue*, double* colorValues, bool parseAlpha); 182 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseColor(CSSParserValue* = 0, bool acceptQuirkyColors = false); 183 bool parseColorFromValue(CSSParserValue*, RGBA32&, bool acceptQuirkyColors = false); 184 185 bool parseLineHeight(bool important); 186 bool parseFontSize(bool important); 187 bool parseFontVariant(bool important); 188 bool parseFontWeight(bool important); 189 PassRefPtrWillBeRawPtr<CSSValueList> parseFontFaceSrc(); 190 PassRefPtrWillBeRawPtr<CSSValueList> parseFontFaceUnicodeRange(); 191 192 bool parseSVGValue(CSSPropertyID propId, bool important); 193 PassRefPtrWillBeRawPtr<CSSValue> parseSVGStrokeDasharray(); 194 195 PassRefPtrWillBeRawPtr<CSSValue> parsePaintOrder() const; 196 197 // CSS3 Parsing Routines (for properties specific to CSS3) 198 PassRefPtrWillBeRawPtr<CSSValueList> parseShadow(CSSParserValueList*, CSSPropertyID); 199 bool parseBorderImageShorthand(CSSPropertyID, bool important); 200 PassRefPtrWillBeRawPtr<CSSValue> parseBorderImage(CSSPropertyID); 201 bool parseBorderImageRepeat(RefPtrWillBeRawPtr<CSSValue>&); 202 bool parseBorderImageSlice(CSSPropertyID, RefPtrWillBeRawPtr<CSSBorderImageSliceValue>&); 203 bool parseBorderImageWidth(RefPtrWillBeRawPtr<CSSPrimitiveValue>&); 204 bool parseBorderImageOutset(RefPtrWillBeRawPtr<CSSPrimitiveValue>&); 205 bool parseBorderRadius(CSSPropertyID, bool important); 206 207 PassRefPtrWillBeRawPtr<CSSValue> parseAspectRatio(); 208 209 PassRefPtrWillBeRawPtr<CSSValue> parseReflect(); 210 211 bool parseFlex(CSSParserValueList* args, bool important); 212 213 PassRefPtrWillBeRawPtr<CSSValue> parseObjectPosition(); 214 215 // Image generators 216 bool parseCanvas(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&); 217 218 bool parseDeprecatedGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&); 219 bool parseDeprecatedLinearGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, CSSGradientRepeat repeating); 220 bool parseDeprecatedRadialGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, CSSGradientRepeat repeating); 221 bool parseLinearGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, CSSGradientRepeat repeating); 222 bool parseRadialGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, CSSGradientRepeat repeating); 223 bool parseGradientColorStops(CSSParserValueList*, CSSGradientValue*, bool expectComma); 224 225 bool parseCrossfade(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&); 226 227 PassRefPtrWillBeRawPtr<CSSValue> parseImageSet(CSSParserValueList*); 228 229 PassRefPtrWillBeRawPtr<CSSValue> parseWillChange(); 230 231 PassRefPtrWillBeRawPtr<CSSValueList> parseFilter(); 232 PassRefPtrWillBeRawPtr<CSSFilterValue> parseBuiltinFilterArguments(CSSParserValueList*, CSSFilterValue::FilterOperationType); 233 234 PassRefPtrWillBeRawPtr<CSSValueList> parseTransformOrigin(); 235 PassRefPtrWillBeRawPtr<CSSValueList> parseTransform(CSSPropertyID); 236 PassRefPtrWillBeRawPtr<CSSValue> parseTransformValue(CSSPropertyID, CSSParserValue*); 237 238 bool parseTextEmphasisStyle(bool important); 239 240 PassRefPtrWillBeRawPtr<CSSValue> parseTouchAction(); 241 242 void addTextDecorationProperty(CSSPropertyID, PassRefPtrWillBeRawPtr<CSSValue>, bool important); 243 bool parseTextDecoration(CSSPropertyID propId, bool important); 244 bool parseTextUnderlinePosition(bool important); 245 246 PassRefPtrWillBeRawPtr<CSSValue> parseTextIndent(); 247 248 bool parseLineBoxContain(bool important); 249 bool parseCalculation(CSSParserValue*, ValueRange); 250 251 bool parseFontFeatureTag(CSSValueList*); 252 bool parseFontFeatureSettings(bool important); 253 254 bool parseFontVariantLigatures(bool important); 255 256 bool parseGeneratedImage(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&); 257 258 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> createPrimitiveNumericValue(CSSParserValue*); 259 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> createPrimitiveStringValue(CSSParserValue*); 260 261 PassRefPtrWillBeRawPtr<CSSValue> createCSSImageValueWithReferrer(const String& rawValue, const KURL&); 262 263 bool validWidthOrHeight(CSSParserValue*); 264 265 PassRefPtrWillBeRawPtr<CSSBasicShape> parseInsetRoundedCorners(PassRefPtrWillBeRawPtr<CSSBasicShapeInset>, CSSParserValueList*); 266 267 enum SizeParameterType { 268 None, 269 Auto, 270 Length, 271 PageSize, 272 Orientation, 273 }; 274 275 bool parsePage(CSSPropertyID propId, bool important); 276 bool parseSize(CSSPropertyID propId, bool important); 277 SizeParameterType parseSizeParameter(CSSValueList* parsedValues, CSSParserValue*, SizeParameterType prevParamType); 278 279 bool parseFontFaceSrcURI(CSSValueList*); 280 bool parseFontFaceSrcLocal(CSSValueList*); 281 282 class ImplicitScope { 283 STACK_ALLOCATED(); 284 WTF_MAKE_NONCOPYABLE(ImplicitScope); 285 public: 286 ImplicitScope(CSSPropertyParser* parser) 287 : m_parser(parser) 288 { 289 m_parser->m_implicitShorthand = true; 290 } 291 292 ~ImplicitScope() 293 { 294 m_parser->m_implicitShorthand = false; 295 } 296 297 private: 298 CSSPropertyParser* m_parser; 299 }; 300 301 class ShorthandScope { 302 STACK_ALLOCATED(); 303 public: 304 ShorthandScope(CSSPropertyParser* parser, CSSPropertyID propId) : m_parser(parser) 305 { 306 if (!(m_parser->m_inParseShorthand++)) 307 m_parser->m_currentShorthand = propId; 308 } 309 ~ShorthandScope() 310 { 311 if (!(--m_parser->m_inParseShorthand)) 312 m_parser->m_currentShorthand = CSSPropertyInvalid; 313 } 314 315 private: 316 CSSPropertyParser* m_parser; 317 }; 318 319 enum ReleaseParsedCalcValueCondition { 320 ReleaseParsedCalcValue, 321 DoNotReleaseParsedCalcValue 322 }; 323 324 enum Units { 325 FUnknown = 0x0000, 326 FInteger = 0x0001, 327 FNumber = 0x0002, // Real Numbers 328 FPercent = 0x0004, 329 FLength = 0x0008, 330 FAngle = 0x0010, 331 FTime = 0x0020, 332 FFrequency = 0x0040, 333 FPositiveInteger = 0x0080, 334 FRelative = 0x0100, 335 FResolution = 0x0200, 336 FNonNeg = 0x0400 337 }; 338 339 friend inline Units operator|(Units a, Units b) 340 { 341 return static_cast<Units>(static_cast<unsigned>(a) | static_cast<unsigned>(b)); 342 } 343 344 bool validCalculationUnit(CSSParserValue*, Units, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue); 345 346 bool shouldAcceptUnitLessValues(CSSParserValue*, Units, CSSParserMode); 347 348 inline bool validUnit(CSSParserValue* value, Units unitflags, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue) { return validUnit(value, unitflags, m_context.mode(), releaseCalc); } 349 bool validUnit(CSSParserValue*, Units, CSSParserMode, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue); 350 351 bool parseBorderImageQuad(Units, RefPtrWillBeRawPtr<CSSPrimitiveValue>&); 352 int colorIntFromValue(CSSParserValue*); 353 bool isCalculation(CSSParserValue*); 354 355 private: 356 // Inputs: 357 CSSParserValueList* m_valueList; 358 const CSSParserContext& m_context; 359 const bool m_inViewport; 360 361 // Outputs: 362 WillBeHeapVector<CSSProperty, 256>& m_parsedProperties; 363 CSSRuleSourceData::Type m_ruleType; 364 365 // Locals during parsing: 366 int m_inParseShorthand; 367 CSSPropertyID m_currentShorthand; 368 bool m_implicitShorthand; 369 RefPtrWillBeMember<CSSCalcValue> m_parsedCalculation; 370 371 // FIXME: There is probably a small set of APIs we could expose for these 372 // classes w/o needing to make them friends. 373 friend class ShadowParseContext; 374 friend class BorderImageParseContext; 375 friend class BorderImageSliceParseContext; 376 friend class BorderImageQuadParseContext; 377 friend class TransformOperationInfo; 378 friend bool parseDeprecatedGradientColorStop(CSSPropertyParser*, CSSParserValue*, CSSGradientColorStop&); 379 friend PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseGradientColorOrKeyword(CSSPropertyParser*, CSSParserValue*); 380 }; 381 382 CSSPropertyID cssPropertyID(const CSSParserString&); 383 CSSPropertyID cssPropertyID(const String&); 384 CSSValueID cssValueKeywordID(const CSSParserString&); 385 386 bool isKeywordPropertyID(CSSPropertyID); 387 bool isValidKeywordPropertyAndValue(CSSPropertyID, CSSValueID, const CSSParserContext&); 388 389 } // namespace blink 390 391 #endif // CSSPropertyParser_h 392