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 CSSParser_h 24 #define CSSParser_h 25 26 #include "CSSPropertyNames.h" 27 #include "CSSValueKeywords.h" 28 #include "core/css/CSSCalculationValue.h" 29 #include "core/css/CSSFilterValue.h" 30 #include "core/css/CSSGradientValue.h" 31 #include "core/css/CSSParserMode.h" 32 #include "core/css/CSSParserValues.h" 33 #include "core/css/CSSProperty.h" 34 #include "core/css/CSSPropertySourceData.h" 35 #include "core/css/CSSSelector.h" 36 #include "core/css/CSSTokenizer.h" 37 #include "core/css/MediaQuery.h" 38 #include "core/css/StylePropertySet.h" 39 #include "core/frame/UseCounter.h" 40 #include "platform/graphics/Color.h" 41 #include "wtf/HashSet.h" 42 #include "wtf/OwnPtr.h" 43 #include "wtf/Vector.h" 44 #include "wtf/text/AtomicString.h" 45 #include "wtf/text/TextPosition.h" 46 47 namespace WebCore { 48 49 class AnimationParseContext; 50 class CSSArrayFunctionValue; 51 class CSSBorderImageSliceValue; 52 class CSSMixFunctionValue; 53 class CSSPrimitiveValue; 54 class CSSSelectorList; 55 class CSSShaderValue; 56 class CSSValue; 57 class CSSValueList; 58 class CSSBasicShape; 59 class Document; 60 class Element; 61 class ImmutableStylePropertySet; 62 class MediaQueryExp; 63 class MediaQuerySet; 64 class MutableStylePropertySet; 65 class StyleKeyframe; 66 class StylePropertyShorthand; 67 class StyleRuleBase; 68 class StyleRuleKeyframes; 69 class StyleKeyframe; 70 class StyleSheetContents; 71 72 // FIXME: This class is shared with CSSTokenizer so should we rename it to CSSSourceLocation? 73 struct CSSParserLocation { 74 unsigned offset; 75 unsigned lineNumber; 76 CSSParserString token; 77 }; 78 79 class CSSParser { 80 friend inline int cssyylex(void*, CSSParser*); 81 82 public: 83 class SourceDataHandler; 84 enum ErrorType { 85 NoError, 86 PropertyDeclarationError, 87 InvalidPropertyValueError, 88 InvalidPropertyError, 89 InvalidSelectorError, 90 InvalidSupportsConditionError, 91 InvalidRuleError, 92 InvalidMediaQueryError, 93 InvalidKeyframeSelectorError, 94 InvalidSelectorPseudoError, 95 UnterminatedCommentError, 96 GeneralError 97 }; 98 99 CSSParser(const CSSParserContext&, UseCounter* = 0); 100 101 ~CSSParser(); 102 103 void parseSheet(StyleSheetContents*, const String&, const TextPosition& startPosition = TextPosition::minimumPosition(), SourceDataHandler* = 0, bool = false); 104 PassRefPtr<StyleRuleBase> parseRule(StyleSheetContents*, const String&); 105 PassRefPtr<StyleKeyframe> parseKeyframeRule(StyleSheetContents*, const String&); 106 bool parseSupportsCondition(const String&); 107 static bool parseValue(MutableStylePropertySet*, CSSPropertyID, const String&, bool important, CSSParserMode, StyleSheetContents*); 108 static bool parseColor(RGBA32& color, const String&, bool strict = false); 109 static bool parseSystemColor(RGBA32& color, const String&, Document*); 110 static PassRefPtr<CSSValueList> parseFontFaceValue(const AtomicString&); 111 PassRefPtr<CSSPrimitiveValue> parseValidPrimitive(CSSValueID ident, CSSParserValue*); 112 bool parseDeclaration(MutableStylePropertySet*, const String&, SourceDataHandler*, StyleSheetContents* contextStyleSheet); 113 static PassRefPtr<ImmutableStylePropertySet> parseInlineStyleDeclaration(const String&, Element*); 114 PassRefPtr<MediaQuerySet> parseMediaQueryList(const String&); 115 PassOwnPtr<Vector<double> > parseKeyframeKeyList(const String&); 116 117 void addPropertyWithPrefixingVariant(CSSPropertyID, PassRefPtr<CSSValue>, bool important, bool implicit = false); 118 void addProperty(CSSPropertyID, PassRefPtr<CSSValue>, bool important, bool implicit = false); 119 void rollbackLastProperties(int num); 120 bool hasProperties() const { return !m_parsedProperties.isEmpty(); } 121 void addExpandedPropertyForValue(CSSPropertyID propId, PassRefPtr<CSSValue>, bool); 122 void setCurrentProperty(CSSPropertyID); 123 124 bool parseValue(CSSPropertyID, bool important); 125 bool parseShorthand(CSSPropertyID, const StylePropertyShorthand&, bool important); 126 bool parse4Values(CSSPropertyID, const CSSPropertyID* properties, bool important); 127 bool parseContent(CSSPropertyID, bool important); 128 bool parseQuotes(CSSPropertyID, bool important); 129 130 static bool parseValue(MutableStylePropertySet*, CSSPropertyID, const String&, bool important, const Document&); 131 void storeVariableDeclaration(const CSSParserString&, PassOwnPtr<CSSParserValueList>, bool important); 132 133 PassRefPtr<CSSValue> parseAttr(CSSParserValueList* args); 134 135 PassRefPtr<CSSValue> parseBackgroundColor(); 136 137 bool parseFillImage(CSSParserValueList*, RefPtr<CSSValue>&); 138 139 enum FillPositionFlag { InvalidFillPosition = 0, AmbiguousFillPosition = 1, XFillPosition = 2, YFillPosition = 4 }; 140 enum FillPositionParsingMode { ResolveValuesAsPercent = 0, ResolveValuesAsKeyword = 1 }; 141 PassRefPtr<CSSPrimitiveValue> parseFillPositionComponent(CSSParserValueList*, unsigned& cumulativeFlags, FillPositionFlag& individualFlag, FillPositionParsingMode = ResolveValuesAsPercent); 142 PassRefPtr<CSSValue> parseFillPositionX(CSSParserValueList*); 143 PassRefPtr<CSSValue> parseFillPositionY(CSSParserValueList*); 144 void parse2ValuesFillPosition(CSSParserValueList*, RefPtr<CSSValue>&, RefPtr<CSSValue>&); 145 bool isPotentialPositionValue(CSSParserValue*); 146 void parseFillPosition(CSSParserValueList*, RefPtr<CSSValue>&, RefPtr<CSSValue>&); 147 void parse3ValuesFillPosition(CSSParserValueList*, RefPtr<CSSValue>&, RefPtr<CSSValue>&, PassRefPtr<CSSPrimitiveValue>, PassRefPtr<CSSPrimitiveValue>); 148 void parse4ValuesFillPosition(CSSParserValueList*, RefPtr<CSSValue>&, RefPtr<CSSValue>&, PassRefPtr<CSSPrimitiveValue>, PassRefPtr<CSSPrimitiveValue>); 149 150 void parseFillRepeat(RefPtr<CSSValue>&, RefPtr<CSSValue>&); 151 PassRefPtr<CSSValue> parseFillSize(CSSPropertyID, bool &allowComma); 152 153 bool parseFillProperty(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, RefPtr<CSSValue>&, RefPtr<CSSValue>&); 154 bool parseFillShorthand(CSSPropertyID, const CSSPropertyID* properties, int numProperties, bool important); 155 156 void addFillValue(RefPtr<CSSValue>& lval, PassRefPtr<CSSValue> rval); 157 158 void addAnimationValue(RefPtr<CSSValue>& lval, PassRefPtr<CSSValue> rval); 159 160 PassRefPtr<CSSValue> parseAnimationDelay(); 161 PassRefPtr<CSSValue> parseAnimationDirection(); 162 PassRefPtr<CSSValue> parseAnimationDuration(); 163 PassRefPtr<CSSValue> parseAnimationFillMode(); 164 PassRefPtr<CSSValue> parseAnimationIterationCount(); 165 PassRefPtr<CSSValue> parseAnimationName(); 166 PassRefPtr<CSSValue> parseAnimationPlayState(); 167 PassRefPtr<CSSValue> parseAnimationProperty(AnimationParseContext&); 168 PassRefPtr<CSSValue> parseAnimationTimingFunction(); 169 170 bool parseTransformOriginShorthand(RefPtr<CSSValue>&, RefPtr<CSSValue>&, RefPtr<CSSValue>&); 171 bool parseCubicBezierTimingFunctionValue(CSSParserValueList*& args, double& result); 172 bool parseAnimationProperty(CSSPropertyID, RefPtr<CSSValue>&, AnimationParseContext&); 173 bool parseTransitionShorthand(CSSPropertyID, bool important); 174 bool parseAnimationShorthand(CSSPropertyID, bool important); 175 176 PassRefPtr<CSSValue> parseColumnWidth(); 177 PassRefPtr<CSSValue> parseColumnCount(); 178 bool parseColumnsShorthand(bool important); 179 180 PassRefPtr<CSSValue> parseGridPosition(); 181 bool parseIntegerOrStringFromGridPosition(RefPtr<CSSPrimitiveValue>& numericValue, RefPtr<CSSPrimitiveValue>& gridLineName); 182 bool parseGridItemPositionShorthand(CSSPropertyID, bool important); 183 bool parseGridAreaShorthand(bool important); 184 bool parseSingleGridAreaLonghand(RefPtr<CSSValue>&); 185 bool parseGridTrackList(CSSPropertyID, bool important); 186 bool parseGridTrackRepeatFunction(CSSValueList&); 187 PassRefPtr<CSSValue> parseGridTrackSize(CSSParserValueList& inputList); 188 PassRefPtr<CSSPrimitiveValue> parseGridBreadth(CSSParserValue*); 189 PassRefPtr<CSSValue> parseGridTemplate(); 190 void parseGridLineNames(CSSParserValueList* inputList, CSSValueList&); 191 192 bool parseClipShape(CSSPropertyID, bool important); 193 194 bool parseBasicShape(CSSPropertyID, bool important); 195 PassRefPtr<CSSBasicShape> parseBasicShapeRectangle(CSSParserValueList* args); 196 PassRefPtr<CSSBasicShape> parseBasicShapeCircle(CSSParserValueList* args); 197 PassRefPtr<CSSBasicShape> parseBasicShapeEllipse(CSSParserValueList* args); 198 PassRefPtr<CSSBasicShape> parseBasicShapePolygon(CSSParserValueList* args); 199 PassRefPtr<CSSBasicShape> parseBasicShapeInsetRectangle(CSSParserValueList* args); 200 201 bool parseFont(bool important); 202 PassRefPtr<CSSValueList> parseFontFamily(); 203 204 bool parseCounter(CSSPropertyID, int defaultValue, bool important); 205 PassRefPtr<CSSValue> parseCounterContent(CSSParserValueList* args, bool counters); 206 207 bool parseColorParameters(CSSParserValue*, int* colorValues, bool parseAlpha); 208 bool parseHSLParameters(CSSParserValue*, double* colorValues, bool parseAlpha); 209 PassRefPtr<CSSPrimitiveValue> parseColor(CSSParserValue* = 0); 210 bool parseColorFromValue(CSSParserValue*, RGBA32&); 211 void parseSelector(const String&, CSSSelectorList&); 212 213 template<typename StringType> 214 static bool fastParseColor(RGBA32&, const StringType&, bool strict); 215 216 bool parseLineHeight(bool important); 217 bool parseFontSize(bool important); 218 bool parseFontVariant(bool important); 219 bool parseFontWeight(bool important); 220 bool parseFontFaceSrc(); 221 bool parseFontFaceUnicodeRange(); 222 223 bool parseSVGValue(CSSPropertyID propId, bool important); 224 PassRefPtr<CSSValue> parseSVGPaint(); 225 PassRefPtr<CSSValue> parseSVGColor(); 226 PassRefPtr<CSSValue> parseSVGStrokeDasharray(); 227 228 PassRefPtr<CSSValue> parsePaintOrder() const; 229 230 // CSS3 Parsing Routines (for properties specific to CSS3) 231 PassRefPtr<CSSValueList> parseShadow(CSSParserValueList*, CSSPropertyID); 232 bool parseBorderImageShorthand(CSSPropertyID, bool important); 233 PassRefPtr<CSSValue> parseBorderImage(CSSPropertyID); 234 bool parseBorderImageRepeat(RefPtr<CSSValue>&); 235 bool parseBorderImageSlice(CSSPropertyID, RefPtr<CSSBorderImageSliceValue>&); 236 bool parseBorderImageWidth(RefPtr<CSSPrimitiveValue>&); 237 bool parseBorderImageOutset(RefPtr<CSSPrimitiveValue>&); 238 bool parseBorderRadius(CSSPropertyID, bool important); 239 240 bool parseAspectRatio(bool important); 241 242 bool parseReflect(CSSPropertyID, bool important); 243 244 bool parseFlex(CSSParserValueList* args, bool important); 245 246 bool parseObjectPosition(bool important); 247 248 // Image generators 249 bool parseCanvas(CSSParserValueList*, RefPtr<CSSValue>&); 250 251 bool parseDeprecatedGradient(CSSParserValueList*, RefPtr<CSSValue>&); 252 bool parseDeprecatedLinearGradient(CSSParserValueList*, RefPtr<CSSValue>&, CSSGradientRepeat repeating); 253 bool parseDeprecatedRadialGradient(CSSParserValueList*, RefPtr<CSSValue>&, CSSGradientRepeat repeating); 254 bool parseLinearGradient(CSSParserValueList*, RefPtr<CSSValue>&, CSSGradientRepeat repeating); 255 bool parseRadialGradient(CSSParserValueList*, RefPtr<CSSValue>&, CSSGradientRepeat repeating); 256 bool parseGradientColorStops(CSSParserValueList*, CSSGradientValue*, bool expectComma); 257 258 bool parseCrossfade(CSSParserValueList*, RefPtr<CSSValue>&); 259 260 PassRefPtr<CSSValue> parseImageSet(CSSParserValueList*); 261 262 PassRefPtr<CSSValueList> parseFilter(); 263 PassRefPtr<CSSFilterValue> parseBuiltinFilterArguments(CSSParserValueList*, CSSFilterValue::FilterOperationType); 264 PassRefPtr<CSSMixFunctionValue> parseMixFunction(CSSParserValue*); 265 PassRefPtr<CSSArrayFunctionValue> parseCustomFilterArrayFunction(CSSParserValue*); 266 PassRefPtr<CSSValueList> parseCustomFilterTransform(CSSParserValueList*); 267 PassRefPtr<CSSValueList> parseCustomFilterParameters(CSSParserValueList*); 268 PassRefPtr<CSSFilterValue> parseCustomFilterFunctionWithAtRuleReferenceSyntax(CSSParserValue*); 269 PassRefPtr<CSSFilterValue> parseCustomFilterFunctionWithInlineSyntax(CSSParserValue*); 270 PassRefPtr<CSSFilterValue> parseCustomFilterFunction(CSSParserValue*); 271 bool parseFilterRuleSrc(); 272 PassRefPtr<CSSShaderValue> parseFilterRuleSrcUriAndFormat(CSSParserValueList*); 273 274 static bool isBlendMode(CSSValueID); 275 static bool isCompositeOperator(CSSValueID); 276 277 PassRefPtr<CSSValueList> parseTransform(); 278 PassRefPtr<CSSValue> parseTransformValue(CSSParserValue*); 279 bool parseTransformOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, CSSPropertyID& propId3, RefPtr<CSSValue>&, RefPtr<CSSValue>&, RefPtr<CSSValue>&); 280 bool parsePerspectiveOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, RefPtr<CSSValue>&, RefPtr<CSSValue>&); 281 282 bool parseTextEmphasisStyle(bool important); 283 284 bool parseTouchAction(bool important); 285 286 void addTextDecorationProperty(CSSPropertyID, PassRefPtr<CSSValue>, bool important); 287 bool parseTextDecoration(CSSPropertyID propId, bool important); 288 bool parseTextUnderlinePosition(bool important); 289 290 PassRefPtr<CSSValue> parseTextIndent(); 291 292 bool parseLineBoxContain(bool important); 293 bool parseCalculation(CSSParserValue*, ValueRange); 294 295 bool parseFontFeatureTag(CSSValueList*); 296 bool parseFontFeatureSettings(bool important); 297 298 bool parseFlowThread(const String& flowName); 299 bool parseFlowThread(CSSPropertyID, bool important); 300 bool parseRegionThread(CSSPropertyID, bool important); 301 302 bool parseFontVariantLigatures(bool important); 303 304 bool parseGeneratedImage(CSSParserValueList*, RefPtr<CSSValue>&); 305 306 CSSParserSelector* createFloatingSelector(); 307 CSSParserSelector* createFloatingSelectorWithTagName(const QualifiedName&); 308 PassOwnPtr<CSSParserSelector> sinkFloatingSelector(CSSParserSelector*); 309 310 Vector<OwnPtr<CSSParserSelector> >* createFloatingSelectorVector(); 311 PassOwnPtr<Vector<OwnPtr<CSSParserSelector> > > sinkFloatingSelectorVector(Vector<OwnPtr<CSSParserSelector> >*); 312 313 CSSParserValueList* createFloatingValueList(); 314 PassOwnPtr<CSSParserValueList> sinkFloatingValueList(CSSParserValueList*); 315 316 CSSParserFunction* createFloatingFunction(); 317 CSSParserFunction* createFloatingFunction(const CSSParserString& name, PassOwnPtr<CSSParserValueList> args); 318 PassOwnPtr<CSSParserFunction> sinkFloatingFunction(CSSParserFunction*); 319 320 CSSParserValue& sinkFloatingValue(CSSParserValue&); 321 322 MediaQuerySet* createMediaQuerySet(); 323 StyleRuleBase* createImportRule(const CSSParserString&, MediaQuerySet*); 324 StyleKeyframe* createKeyframe(CSSParserValueList*); 325 StyleRuleKeyframes* createKeyframesRule(const String&, PassOwnPtr<Vector<RefPtr<StyleKeyframe> > >, bool isPrefixed); 326 327 typedef Vector<RefPtr<StyleRuleBase> > RuleList; 328 StyleRuleBase* createMediaRule(MediaQuerySet*, RuleList*); 329 RuleList* createRuleList(); 330 RuleList* appendRule(RuleList*, StyleRuleBase*); 331 StyleRuleBase* createStyleRule(Vector<OwnPtr<CSSParserSelector> >* selectors); 332 StyleRuleBase* createFontFaceRule(); 333 StyleRuleBase* createPageRule(PassOwnPtr<CSSParserSelector> pageSelector); 334 StyleRuleBase* createRegionRule(Vector<OwnPtr<CSSParserSelector> >* regionSelector, RuleList* rules); 335 StyleRuleBase* createMarginAtRule(CSSSelector::MarginBoxType); 336 StyleRuleBase* createSupportsRule(bool conditionIsSupported, RuleList*); 337 void markSupportsRuleHeaderStart(); 338 void markSupportsRuleHeaderEnd(); 339 PassRefPtr<CSSRuleSourceData> popSupportsRuleData(); 340 StyleRuleBase* createHostRule(RuleList* rules); 341 StyleRuleBase* createFilterRule(const CSSParserString&); 342 343 void startDeclarationsForMarginBox(); 344 void endDeclarationsForMarginBox(); 345 346 MediaQueryExp* createFloatingMediaQueryExp(const AtomicString&, CSSParserValueList*); 347 PassOwnPtr<MediaQueryExp> sinkFloatingMediaQueryExp(MediaQueryExp*); 348 Vector<OwnPtr<MediaQueryExp> >* createFloatingMediaQueryExpList(); 349 PassOwnPtr<Vector<OwnPtr<MediaQueryExp> > > sinkFloatingMediaQueryExpList(Vector<OwnPtr<MediaQueryExp> >*); 350 MediaQuery* createFloatingMediaQuery(MediaQuery::Restrictor, const AtomicString&, PassOwnPtr<Vector<OwnPtr<MediaQueryExp> > >); 351 MediaQuery* createFloatingMediaQuery(PassOwnPtr<Vector<OwnPtr<MediaQueryExp> > >); 352 MediaQuery* createFloatingNotAllQuery(); 353 PassOwnPtr<MediaQuery> sinkFloatingMediaQuery(MediaQuery*); 354 355 Vector<RefPtr<StyleKeyframe> >* createFloatingKeyframeVector(); 356 PassOwnPtr<Vector<RefPtr<StyleKeyframe> > > sinkFloatingKeyframeVector(Vector<RefPtr<StyleKeyframe> >*); 357 358 void addNamespace(const AtomicString& prefix, const AtomicString& uri); 359 QualifiedName determineNameInNamespace(const AtomicString& prefix, const AtomicString& localName); 360 361 CSSParserSelector* rewriteSpecifiersWithElementName(const AtomicString& namespacePrefix, const AtomicString& elementName, CSSParserSelector*, bool isNamespacePlaceholder = false); 362 CSSParserSelector* rewriteSpecifiersWithElementNameForCustomPseudoElement(const QualifiedName& tag, const AtomicString& elementName, CSSParserSelector* specifiers, bool tagIsForNamespaceRule); 363 CSSParserSelector* rewriteSpecifiersWithElementNameForContentPseudoElement(const QualifiedName& tag, const AtomicString& elementName, CSSParserSelector* specifiers, bool tagIsForNamespaceRule); 364 CSSParserSelector* rewriteSpecifiersWithNamespaceIfNeeded(CSSParserSelector*); 365 CSSParserSelector* rewriteSpecifiers(CSSParserSelector*, CSSParserSelector*); 366 CSSParserSelector* rewriteSpecifiersForShadowDistributed(CSSParserSelector* specifiers, CSSParserSelector* distributedPseudoElementSelector); 367 368 void invalidBlockHit(); 369 370 Vector<OwnPtr<CSSParserSelector> >* reusableSelectorVector() { return &m_reusableSelectorVector; } 371 372 void setReusableRegionSelectorVector(Vector<OwnPtr<CSSParserSelector> >* selectors); 373 Vector<OwnPtr<CSSParserSelector> >* reusableRegionSelectorVector() { return &m_reusableRegionSelectorVector; } 374 375 void clearProperties(); 376 377 PassRefPtr<ImmutableStylePropertySet> createStylePropertySet(); 378 379 CSSParserContext m_context; 380 381 bool m_important; 382 CSSPropertyID m_id; 383 StyleSheetContents* m_styleSheet; 384 RefPtr<StyleRuleBase> m_rule; 385 RefPtr<StyleKeyframe> m_keyframe; 386 RefPtr<MediaQuerySet> m_mediaList; 387 OwnPtr<CSSParserValueList> m_valueList; 388 bool m_supportsCondition; 389 390 typedef Vector<CSSProperty, 256> ParsedPropertyVector; 391 ParsedPropertyVector m_parsedProperties; 392 CSSSelectorList* m_selectorListForParseSelector; 393 394 unsigned m_numParsedPropertiesBeforeMarginBox; 395 396 int m_inParseShorthand; 397 CSSPropertyID m_currentShorthand; 398 bool m_implicitShorthand; 399 400 bool m_hasFontFaceOnlyValues; 401 bool m_hadSyntacticallyValidCSSRule; 402 bool m_logErrors; 403 bool m_ignoreErrors; 404 405 bool m_inFilterRule; 406 407 AtomicString m_defaultNamespace; 408 409 // tokenizer methods and data 410 SourceDataHandler* m_sourceDataHandler; 411 412 void startRule(); 413 void endRule(bool valid); 414 void startRuleHeader(CSSRuleSourceData::Type); 415 void endRuleHeader(); 416 void startSelector(); 417 void endSelector(); 418 void startRuleBody(); 419 void startProperty(); 420 void endProperty(bool isImportantFound, bool isPropertyParsed, ErrorType = NoError); 421 void startEndUnknownRule(); 422 423 void endInvalidRuleHeader(); 424 void reportError(const CSSParserLocation&, ErrorType = GeneralError); 425 void resumeErrorLogging() { m_ignoreErrors = false; } 426 void setLocationLabel(const CSSParserLocation& location) { m_locationLabel = location; } 427 const CSSParserLocation& lastLocationLabel() const { return m_locationLabel; } 428 429 void tokenToLowerCase(const CSSParserString& token); 430 431 void markViewportRuleBodyStart() { m_inViewport = true; } 432 void markViewportRuleBodyEnd() { m_inViewport = false; } 433 StyleRuleBase* createViewportRule(); 434 435 PassRefPtr<CSSPrimitiveValue> createPrimitiveNumericValue(CSSParserValue*); 436 PassRefPtr<CSSPrimitiveValue> createPrimitiveStringValue(CSSParserValue*); 437 PassRefPtr<CSSPrimitiveValue> createPrimitiveVariableNameValue(CSSParserValue*); 438 439 static KURL completeURL(const CSSParserContext&, const String& url); 440 441 CSSParserLocation currentLocation() { return m_tokenizer.currentLocation(); } 442 443 private: 444 enum PropertyType { 445 PropertyExplicit, 446 PropertyImplicit 447 }; 448 449 class ImplicitScope { 450 WTF_MAKE_NONCOPYABLE(ImplicitScope); 451 public: 452 ImplicitScope(WebCore::CSSParser* parser, PropertyType propertyType) 453 : m_parser(parser) 454 { 455 m_parser->m_implicitShorthand = propertyType == CSSParser::PropertyImplicit; 456 } 457 458 ~ImplicitScope() 459 { 460 m_parser->m_implicitShorthand = false; 461 } 462 463 private: 464 WebCore::CSSParser* m_parser; 465 }; 466 467 class StyleDeclarationScope { 468 WTF_MAKE_NONCOPYABLE(StyleDeclarationScope); 469 public: 470 StyleDeclarationScope(CSSParser* parser, const StylePropertySet* declaration) 471 : m_parser(parser) 472 , m_mode(declaration->cssParserMode()) 473 { 474 if (isCSSViewportParsingEnabledForMode(m_mode)) { 475 ASSERT(!m_parser->inViewport()); 476 m_parser->markViewportRuleBodyStart(); 477 } 478 } 479 480 ~StyleDeclarationScope() 481 { 482 if (isCSSViewportParsingEnabledForMode(m_mode)) 483 m_parser->markViewportRuleBodyEnd(); 484 } 485 486 private: 487 CSSParser* m_parser; 488 CSSParserMode m_mode; 489 }; 490 491 inline void ensureLineEndings(); 492 493 void setStyleSheet(StyleSheetContents* styleSheet) { m_styleSheet = styleSheet; } 494 495 bool inQuirksMode() const { return isQuirksModeBehavior(m_context.mode()); } 496 bool inViewport() const { return m_inViewport; } 497 498 KURL completeURL(const String& url) const; 499 500 void recheckAtKeyword(const UChar* str, int len); 501 502 template<unsigned prefixLength, unsigned suffixLength> 503 inline void setupParser(const char (&prefix)[prefixLength], const String& string, const char (&suffix)[suffixLength]) 504 { 505 setupParser(prefix, prefixLength - 1, string, suffix, suffixLength - 1); 506 } 507 void setupParser(const char* prefix, unsigned prefixLength, const String&, const char* suffix, unsigned suffixLength); 508 bool inShorthand() const { return m_inParseShorthand; } 509 510 bool validWidthOrHeight(CSSParserValue*); 511 512 void deleteFontFaceOnlyValues(); 513 514 bool parseValue(MutableStylePropertySet*, CSSPropertyID, const String&, bool important, StyleSheetContents* contextStyleSheet); 515 PassRefPtr<ImmutableStylePropertySet> parseDeclaration(const String&, StyleSheetContents* contextStyleSheet); 516 517 enum SizeParameterType { 518 None, 519 Auto, 520 Length, 521 PageSize, 522 Orientation, 523 }; 524 525 bool parsePage(CSSPropertyID propId, bool important); 526 bool parseSize(CSSPropertyID propId, bool important); 527 SizeParameterType parseSizeParameter(CSSValueList* parsedValues, CSSParserValue* value, SizeParameterType prevParamType); 528 529 bool parseFontFaceSrcURI(CSSValueList*); 530 bool parseFontFaceSrcLocal(CSSValueList*); 531 532 bool parseColor(const String&); 533 534 const String* m_source; 535 TextPosition m_startPosition; 536 CSSRuleSourceData::Type m_ruleHeaderType; 537 unsigned m_ruleHeaderStartOffset; 538 int m_ruleHeaderStartLineNumber; 539 OwnPtr<Vector<unsigned> > m_lineEndings; 540 541 bool m_ruleHasHeader; 542 543 bool m_allowImportRules; 544 bool m_allowNamespaceDeclarations; 545 546 bool parseViewportProperty(CSSPropertyID propId, bool important); 547 bool parseViewportShorthand(CSSPropertyID propId, CSSPropertyID first, CSSPropertyID second, bool important); 548 549 bool m_inViewport; 550 551 CSSParserLocation m_locationLabel; 552 553 bool useLegacyBackgroundSizeShorthandBehavior() const; 554 555 Vector<RefPtr<StyleRuleBase> > m_parsedRules; 556 Vector<RefPtr<StyleKeyframe> > m_parsedKeyframes; 557 Vector<RefPtr<MediaQuerySet> > m_parsedMediaQuerySets; 558 Vector<OwnPtr<RuleList> > m_parsedRuleLists; 559 Vector<CSSParserSelector*> m_floatingSelectors; 560 Vector<Vector<OwnPtr<CSSParserSelector> >*> m_floatingSelectorVectors; 561 Vector<CSSParserValueList*> m_floatingValueLists; 562 Vector<CSSParserFunction*> m_floatingFunctions; 563 564 OwnPtr<MediaQuery> m_floatingMediaQuery; 565 OwnPtr<MediaQueryExp> m_floatingMediaQueryExp; 566 OwnPtr<Vector<OwnPtr<MediaQueryExp> > > m_floatingMediaQueryExpList; 567 568 OwnPtr<Vector<RefPtr<StyleKeyframe> > > m_floatingKeyframeVector; 569 570 Vector<OwnPtr<CSSParserSelector> > m_reusableSelectorVector; 571 Vector<OwnPtr<CSSParserSelector> > m_reusableRegionSelectorVector; 572 573 RefPtr<CSSCalcValue> m_parsedCalculation; 574 575 OwnPtr<RuleSourceDataList> m_supportsRuleDataStack; 576 577 // defines units allowed for a certain property, used in parseUnit 578 enum Units { 579 FUnknown = 0x0000, 580 FInteger = 0x0001, 581 FNumber = 0x0002, // Real Numbers 582 FPercent = 0x0004, 583 FLength = 0x0008, 584 FAngle = 0x0010, 585 FTime = 0x0020, 586 FFrequency = 0x0040, 587 FPositiveInteger = 0x0080, 588 FRelative = 0x0100, 589 FResolution = 0x0200, 590 FNonNeg = 0x0400 591 }; 592 593 friend inline Units operator|(Units a, Units b) 594 { 595 return static_cast<Units>(static_cast<unsigned>(a) | static_cast<unsigned>(b)); 596 } 597 598 enum ReleaseParsedCalcValueCondition { 599 ReleaseParsedCalcValue, 600 DoNotReleaseParsedCalcValue 601 }; 602 603 bool isLoggingErrors(); 604 void logError(const String& message, const CSSParserLocation&); 605 606 bool validCalculationUnit(CSSParserValue*, Units, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue); 607 608 bool shouldAcceptUnitLessValues(CSSParserValue*, Units, CSSParserMode); 609 610 inline bool validUnit(CSSParserValue* value, Units unitflags, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue) { return validUnit(value, unitflags, m_context.mode(), releaseCalc); } 611 bool validUnit(CSSParserValue*, Units, CSSParserMode, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue); 612 613 bool parseBorderImageQuad(Units, RefPtr<CSSPrimitiveValue>&); 614 int colorIntFromValue(CSSParserValue*); 615 double parsedDouble(CSSParserValue*, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue); 616 bool isCalculation(CSSParserValue*); 617 618 UseCounter* m_useCounter; 619 620 CSSTokenizer m_tokenizer; 621 622 friend class TransformOperationInfo; 623 friend class FilterOperationInfo; 624 }; 625 626 CSSPropertyID cssPropertyID(const CSSParserString&); 627 CSSPropertyID cssPropertyID(const String&); 628 CSSValueID cssValueKeywordID(const CSSParserString&); 629 630 class ShorthandScope { 631 WTF_MAKE_FAST_ALLOCATED; 632 public: 633 ShorthandScope(CSSParser* parser, CSSPropertyID propId) : m_parser(parser) 634 { 635 if (!(m_parser->m_inParseShorthand++)) 636 m_parser->m_currentShorthand = propId; 637 } 638 ~ShorthandScope() 639 { 640 if (!(--m_parser->m_inParseShorthand)) 641 m_parser->m_currentShorthand = CSSPropertyInvalid; 642 } 643 644 private: 645 CSSParser* m_parser; 646 }; 647 648 class CSSParser::SourceDataHandler { 649 public: 650 virtual void startRuleHeader(CSSRuleSourceData::Type, unsigned offset) = 0; 651 virtual void endRuleHeader(unsigned offset) = 0; 652 virtual void startSelector(unsigned offset) = 0; 653 virtual void endSelector(unsigned offset) = 0; 654 virtual void startRuleBody(unsigned offset) = 0; 655 virtual void endRuleBody(unsigned offset, bool error) = 0; 656 virtual void startEndUnknownRule() = 0; 657 virtual void startProperty(unsigned offset) = 0; 658 virtual void endProperty(bool isImportant, bool isParsed, unsigned offset, CSSParser::ErrorType) = 0; 659 virtual void startComment(unsigned offset) = 0; 660 virtual void endComment(unsigned offset) = 0; 661 }; 662 663 String quoteCSSString(const String&); 664 String quoteCSSStringIfNeeded(const String&); 665 String quoteCSSURLIfNeeded(const String&); 666 667 bool isValidNthToken(const CSSParserString&); 668 669 inline int cssyylex(void* yylval, CSSParser* parser) 670 { 671 return parser->m_tokenizer.lex(yylval); 672 } 673 674 } // namespace WebCore 675 676 #endif // CSSParser_h 677