diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h')
-rw-r--r-- | chromium/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h | 410 |
1 files changed, 410 insertions, 0 deletions
diff --git a/chromium/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h b/chromium/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h new file mode 100644 index 00000000000..1fc76568cee --- /dev/null +++ b/chromium/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h @@ -0,0 +1,410 @@ +/* + * Copyright (C) 2003 Lars Knoll (knoll@kde.org) + * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved. + * Copyright (C) 2008 Eric Seidel <eric@webkit.org> + * Copyright (C) 2009 - 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef CSSPropertyParser_h +#define CSSPropertyParser_h + +// FIXME: Way too many. +#include "core/CSSPropertyNames.h" +#include "core/CSSValueKeywords.h" +#include "core/css/CSSCalculationValue.h" +#include "core/css/CSSFilterValue.h" +#include "core/css/CSSGradientValue.h" +#include "core/css/CSSGridTemplateAreasValue.h" +#include "core/css/CSSParserMode.h" +#include "core/css/CSSParserValues.h" +#include "core/css/CSSProperty.h" +#include "core/css/CSSPropertySourceData.h" +#include "core/css/CSSSelector.h" +#include "platform/graphics/Color.h" +#include "wtf/OwnPtr.h" +#include "wtf/Vector.h" + +namespace WebCore { + +// FIXME: Many of these may not be used. +class CSSArrayFunctionValue; +class CSSBorderImageSliceValue; +class CSSPrimitiveValue; +class CSSSelectorList; +class CSSValue; +class CSSValueList; +class CSSBasicShape; +class CSSBasicShapeInset; +class CSSGridLineNamesValue; +class Document; +class Element; +class ImmutableStylePropertySet; +class StyleKeyframe; +class StylePropertyShorthand; +class StyleKeyframe; +class UseCounter; + +// Inputs: PropertyID, isImportant bool, CSSParserValueList. +// Outputs: Vector of CSSProperties + +class CSSPropertyParser { + STACK_ALLOCATED(); +public: + CSSPropertyParser(OwnPtr<CSSParserValueList>&, + const CSSParserContext&, bool inViewport, bool savedImportant, + WillBeHeapVector<CSSProperty, 256>&, CSSRuleSourceData::Type); + ~CSSPropertyParser(); + + // FIXME: Should this be on a separate ColorParser object? + template<typename StringType> + static bool fastParseColor(RGBA32&, const StringType&, bool strict); + + bool parseValue(CSSPropertyID, bool important); + + static bool isSystemColor(int id); + +private: + bool inShorthand() const { return m_inParseShorthand; } + bool inQuirksMode() const { return isQuirksModeBehavior(m_context.mode()); } + + bool inViewport() const { return m_inViewport; } + bool parseViewportProperty(CSSPropertyID propId, bool important); + bool parseViewportShorthand(CSSPropertyID propId, CSSPropertyID first, CSSPropertyID second, bool important); + + KURL completeURL(const String& url) const; + + void addPropertyWithPrefixingVariant(CSSPropertyID, PassRefPtrWillBeRawPtr<CSSValue>, bool important, bool implicit = false); + void addProperty(CSSPropertyID, PassRefPtrWillBeRawPtr<CSSValue>, bool important, bool implicit = false); + void rollbackLastProperties(int num); + bool hasProperties() const { return !m_parsedProperties.isEmpty(); } + void addExpandedPropertyForValue(CSSPropertyID propId, PassRefPtrWillBeRawPtr<CSSValue>, bool); + + PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseValidPrimitive(CSSValueID ident, CSSParserValue*); + + bool parseShorthand(CSSPropertyID, const StylePropertyShorthand&, bool important); + bool parse4Values(CSSPropertyID, const CSSPropertyID* properties, bool important); + bool parseContent(CSSPropertyID, bool important); + bool parseQuotes(CSSPropertyID, bool important); + + PassRefPtrWillBeRawPtr<CSSValue> parseAttr(CSSParserValueList* args); + + PassRefPtrWillBeRawPtr<CSSValue> parseBackgroundColor(); + + bool parseFillImage(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&); + + enum FillPositionFlag { InvalidFillPosition = 0, AmbiguousFillPosition = 1, XFillPosition = 2, YFillPosition = 4 }; + enum FillPositionParsingMode { ResolveValuesAsPercent = 0, ResolveValuesAsKeyword = 1 }; + PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseFillPositionComponent(CSSParserValueList*, unsigned& cumulativeFlags, FillPositionFlag& individualFlag, FillPositionParsingMode = ResolveValuesAsPercent); + PassRefPtrWillBeRawPtr<CSSValue> parseFillPositionX(CSSParserValueList*); + PassRefPtrWillBeRawPtr<CSSValue> parseFillPositionY(CSSParserValueList*); + void parse2ValuesFillPosition(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&); + bool isPotentialPositionValue(CSSParserValue*); + void parseFillPosition(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&); + void parse3ValuesFillPosition(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&, PassRefPtrWillBeRawPtr<CSSPrimitiveValue>, PassRefPtrWillBeRawPtr<CSSPrimitiveValue>); + void parse4ValuesFillPosition(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&, PassRefPtrWillBeRawPtr<CSSPrimitiveValue>, PassRefPtrWillBeRawPtr<CSSPrimitiveValue>); + + void parseFillRepeat(RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&); + PassRefPtrWillBeRawPtr<CSSValue> parseFillSize(CSSPropertyID, bool &allowComma); + + bool parseFillProperty(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&); + bool parseFillShorthand(CSSPropertyID, const CSSPropertyID* properties, int numProperties, bool important); + + void addFillValue(RefPtrWillBeRawPtr<CSSValue>& lval, PassRefPtrWillBeRawPtr<CSSValue> rval); + + void addAnimationValue(RefPtrWillBeRawPtr<CSSValue>& lval, PassRefPtrWillBeRawPtr<CSSValue> rval); + + PassRefPtrWillBeRawPtr<CSSValue> parseAnimationDelay(); + PassRefPtrWillBeRawPtr<CSSValue> parseAnimationDirection(); + PassRefPtrWillBeRawPtr<CSSValue> parseAnimationDuration(); + PassRefPtrWillBeRawPtr<CSSValue> parseAnimationFillMode(); + PassRefPtrWillBeRawPtr<CSSValue> parseAnimationIterationCount(); + PassRefPtrWillBeRawPtr<CSSValue> parseAnimationName(); + PassRefPtrWillBeRawPtr<CSSValue> parseAnimationPlayState(); + PassRefPtrWillBeRawPtr<CSSValue> parseAnimationProperty(); + PassRefPtrWillBeRawPtr<CSSValue> parseAnimationTimingFunction(); + + bool parseWebkitTransformOriginShorthand(RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&); + bool parseCubicBezierTimingFunctionValue(CSSParserValueList*& args, double& result); + PassRefPtrWillBeRawPtr<CSSValue> parseAnimationProperty(CSSPropertyID); + PassRefPtrWillBeRawPtr<CSSValueList> parseAnimationPropertyList(CSSPropertyID); + bool parseTransitionShorthand(CSSPropertyID, bool important); + bool parseAnimationShorthand(CSSPropertyID, bool important); + + PassRefPtrWillBeRawPtr<CSSValue> parseColumnWidth(); + PassRefPtrWillBeRawPtr<CSSValue> parseColumnCount(); + bool parseColumnsShorthand(bool important); + + PassRefPtrWillBeRawPtr<CSSValue> parseGridPosition(); + bool parseIntegerOrCustomIdentFromGridPosition(RefPtrWillBeRawPtr<CSSPrimitiveValue>& numericValue, RefPtrWillBeRawPtr<CSSPrimitiveValue>& gridLineName); + bool parseGridItemPositionShorthand(CSSPropertyID, bool important); + bool parseGridTemplateRowsAndAreas(PassRefPtrWillBeRawPtr<CSSValue>, bool important); + bool parseGridTemplateShorthand(bool important); + bool parseGridShorthand(bool important); + bool parseGridAreaShorthand(bool important); + bool parseSingleGridAreaLonghand(RefPtrWillBeRawPtr<CSSValue>&); + PassRefPtrWillBeRawPtr<CSSValue> parseGridTrackList(bool important); + bool parseGridTrackRepeatFunction(CSSValueList&); + PassRefPtrWillBeRawPtr<CSSValue> parseGridTrackSize(CSSParserValueList& inputList); + PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseGridBreadth(CSSParserValue*); + bool parseGridTemplateAreasRow(NamedGridAreaMap&, const size_t, size_t&); + PassRefPtrWillBeRawPtr<CSSValue> parseGridTemplateAreas(); + void parseGridLineNames(CSSParserValueList&, CSSValueList&, CSSGridLineNamesValue* = 0); + + bool parseClipShape(CSSPropertyID, bool important); + + bool parseItemPositionOverflowPosition(CSSPropertyID, bool important); + + PassRefPtrWillBeRawPtr<CSSValue> parseShapeProperty(CSSPropertyID propId); + PassRefPtrWillBeRawPtr<CSSValue> parseBasicShapeAndOrBox(); + PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseBasicShape(); + PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseShapeRadius(CSSParserValue*); + + PassRefPtrWillBeRawPtr<CSSBasicShape> parseBasicShapeCircle(CSSParserValueList* args); + PassRefPtrWillBeRawPtr<CSSBasicShape> parseBasicShapeEllipse(CSSParserValueList* args); + PassRefPtrWillBeRawPtr<CSSBasicShape> parseBasicShapePolygon(CSSParserValueList* args); + PassRefPtrWillBeRawPtr<CSSBasicShape> parseBasicShapeInset(CSSParserValueList* args); + + bool parseFont(bool important); + PassRefPtrWillBeRawPtr<CSSValueList> parseFontFamily(); + + bool parseCounter(CSSPropertyID, int defaultValue, bool important); + PassRefPtrWillBeRawPtr<CSSValue> parseCounterContent(CSSParserValueList* args, bool counters); + + bool parseColorParameters(CSSParserValue*, int* colorValues, bool parseAlpha); + bool parseHSLParameters(CSSParserValue*, double* colorValues, bool parseAlpha); + PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseColor(CSSParserValue* = 0); + bool parseColorFromValue(CSSParserValue*, RGBA32&); + + bool parseLineHeight(bool important); + bool parseFontSize(bool important); + bool parseFontVariant(bool important); + bool parseFontWeight(bool important); + bool parseFontFaceSrc(); + bool parseFontFaceUnicodeRange(); + + bool parseSVGValue(CSSPropertyID propId, bool important); + PassRefPtrWillBeRawPtr<CSSValue> parseSVGPaint(); + PassRefPtrWillBeRawPtr<CSSValue> parseSVGStrokeDasharray(); + + PassRefPtrWillBeRawPtr<CSSValue> parsePaintOrder() const; + + // CSS3 Parsing Routines (for properties specific to CSS3) + PassRefPtrWillBeRawPtr<CSSValueList> parseShadow(CSSParserValueList*, CSSPropertyID); + bool parseBorderImageShorthand(CSSPropertyID, bool important); + PassRefPtrWillBeRawPtr<CSSValue> parseBorderImage(CSSPropertyID); + bool parseBorderImageRepeat(RefPtrWillBeRawPtr<CSSValue>&); + bool parseBorderImageSlice(CSSPropertyID, RefPtrWillBeRawPtr<CSSBorderImageSliceValue>&); + bool parseBorderImageWidth(RefPtrWillBeRawPtr<CSSPrimitiveValue>&); + bool parseBorderImageOutset(RefPtrWillBeRawPtr<CSSPrimitiveValue>&); + bool parseBorderRadius(CSSPropertyID, bool important); + + bool parseAspectRatio(bool important); + + bool parseReflect(CSSPropertyID, bool important); + + bool parseFlex(CSSParserValueList* args, bool important); + + bool parseObjectPosition(bool important); + + // Image generators + bool parseCanvas(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&); + + bool parseDeprecatedGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&); + bool parseDeprecatedLinearGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, CSSGradientRepeat repeating); + bool parseDeprecatedRadialGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, CSSGradientRepeat repeating); + bool parseLinearGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, CSSGradientRepeat repeating); + bool parseRadialGradient(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&, CSSGradientRepeat repeating); + bool parseGradientColorStops(CSSParserValueList*, CSSGradientValue*, bool expectComma); + + bool parseCrossfade(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&); + + PassRefPtrWillBeRawPtr<CSSValue> parseImageSet(CSSParserValueList*); + + bool parseWillChange(bool important); + + PassRefPtrWillBeRawPtr<CSSValueList> parseFilter(); + PassRefPtrWillBeRawPtr<CSSFilterValue> parseBuiltinFilterArguments(CSSParserValueList*, CSSFilterValue::FilterOperationType); + + PassRefPtrWillBeRawPtr<CSSValueList> parseTransformOrigin(); + PassRefPtrWillBeRawPtr<CSSValueList> parseTransform(CSSPropertyID); + PassRefPtrWillBeRawPtr<CSSValue> parseTransformValue(CSSPropertyID, CSSParserValue*); + bool parseWebkitTransformOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, CSSPropertyID& propId3, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&); + bool parseWebkitPerspectiveOrigin(CSSPropertyID propId, CSSPropertyID& propId1, CSSPropertyID& propId2, RefPtrWillBeRawPtr<CSSValue>&, RefPtrWillBeRawPtr<CSSValue>&); + + bool parseTextEmphasisStyle(bool important); + + bool parseTouchAction(bool important); + + void addTextDecorationProperty(CSSPropertyID, PassRefPtrWillBeRawPtr<CSSValue>, bool important); + bool parseTextDecoration(CSSPropertyID propId, bool important); + bool parseTextUnderlinePosition(bool important); + + PassRefPtrWillBeRawPtr<CSSValue> parseTextIndent(); + + bool parseLineBoxContain(bool important); + bool parseCalculation(CSSParserValue*, ValueRange); + + bool parseFontFeatureTag(CSSValueList*); + bool parseFontFeatureSettings(bool important); + + bool parseFontVariantLigatures(bool important); + + bool parseGeneratedImage(CSSParserValueList*, RefPtrWillBeRawPtr<CSSValue>&); + + PassRefPtrWillBeRawPtr<CSSPrimitiveValue> createPrimitiveNumericValue(CSSParserValue*); + PassRefPtrWillBeRawPtr<CSSPrimitiveValue> createPrimitiveStringValue(CSSParserValue*); + + PassRefPtrWillBeRawPtr<CSSValue> createCSSImageValueWithReferrer(const String& rawValue, const KURL&); + + bool validWidthOrHeight(CSSParserValue*); + + PassRefPtrWillBeRawPtr<CSSBasicShape> parseInsetRoundedCorners(PassRefPtrWillBeRawPtr<CSSBasicShapeInset>, CSSParserValueList*); + + enum SizeParameterType { + None, + Auto, + Length, + PageSize, + Orientation, + }; + + bool parsePage(CSSPropertyID propId, bool important); + bool parseSize(CSSPropertyID propId, bool important); + SizeParameterType parseSizeParameter(CSSValueList* parsedValues, CSSParserValue*, SizeParameterType prevParamType); + + bool parseFontFaceSrcURI(CSSValueList*); + bool parseFontFaceSrcLocal(CSSValueList*); + + enum PropertyType { + PropertyExplicit, + PropertyImplicit + }; + + class ImplicitScope { + STACK_ALLOCATED(); + WTF_MAKE_NONCOPYABLE(ImplicitScope); + public: + ImplicitScope(CSSPropertyParser* parser, PropertyType propertyType) + : m_parser(parser) + { + m_parser->m_implicitShorthand = propertyType == CSSPropertyParser::PropertyImplicit; + } + + ~ImplicitScope() + { + m_parser->m_implicitShorthand = false; + } + + private: + CSSPropertyParser* m_parser; + }; + + class ShorthandScope { + STACK_ALLOCATED(); + public: + ShorthandScope(CSSPropertyParser* parser, CSSPropertyID propId) : m_parser(parser) + { + if (!(m_parser->m_inParseShorthand++)) + m_parser->m_currentShorthand = propId; + } + ~ShorthandScope() + { + if (!(--m_parser->m_inParseShorthand)) + m_parser->m_currentShorthand = CSSPropertyInvalid; + } + + private: + CSSPropertyParser* m_parser; + }; + + enum ReleaseParsedCalcValueCondition { + ReleaseParsedCalcValue, + DoNotReleaseParsedCalcValue + }; + + enum Units { + FUnknown = 0x0000, + FInteger = 0x0001, + FNumber = 0x0002, // Real Numbers + FPercent = 0x0004, + FLength = 0x0008, + FAngle = 0x0010, + FTime = 0x0020, + FFrequency = 0x0040, + FPositiveInteger = 0x0080, + FRelative = 0x0100, + FResolution = 0x0200, + FNonNeg = 0x0400 + }; + + friend inline Units operator|(Units a, Units b) + { + return static_cast<Units>(static_cast<unsigned>(a) | static_cast<unsigned>(b)); + } + + bool validCalculationUnit(CSSParserValue*, Units, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue); + + bool shouldAcceptUnitLessValues(CSSParserValue*, Units, CSSParserMode); + + inline bool validUnit(CSSParserValue* value, Units unitflags, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue) { return validUnit(value, unitflags, m_context.mode(), releaseCalc); } + bool validUnit(CSSParserValue*, Units, CSSParserMode, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue); + + bool parseBorderImageQuad(Units, RefPtrWillBeRawPtr<CSSPrimitiveValue>&); + int colorIntFromValue(CSSParserValue*); + double parsedDouble(CSSParserValue*, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue); + bool isCalculation(CSSParserValue*); + +private: + // Inputs: + // FIXME: This should not be an OwnPtr&, many callers will need to be changed. + const OwnPtr<CSSParserValueList>& m_valueList; + const CSSParserContext& m_context; + const bool m_inViewport; + const bool m_important; // FIXME: This is only used by font-face-src and unicode-range and undoubtably wrong! + + // Outputs: + WillBeHeapVector<CSSProperty, 256>& m_parsedProperties; + CSSRuleSourceData::Type m_ruleType; + + // Locals during parsing: + int m_inParseShorthand; + CSSPropertyID m_currentShorthand; + bool m_implicitShorthand; + RefPtrWillBeMember<CSSCalcValue> m_parsedCalculation; + + // FIXME: There is probably a small set of APIs we could expose for these + // classes w/o needing to make them friends. + friend class ShadowParseContext; + friend class BorderImageParseContext; + friend class BorderImageSliceParseContext; + friend class BorderImageQuadParseContext; + friend class TransformOperationInfo; + friend bool parseDeprecatedGradientColorStop(CSSPropertyParser*, CSSParserValue*, CSSGradientColorStop&); + friend PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseGradientColorOrKeyword(CSSPropertyParser*, CSSParserValue*); +}; + +CSSPropertyID cssPropertyID(const CSSParserString&); +CSSPropertyID cssPropertyID(const String&); +CSSValueID cssValueKeywordID(const CSSParserString&); + +bool isKeywordPropertyID(CSSPropertyID); +bool isValidKeywordPropertyAndValue(CSSPropertyID, CSSValueID, const CSSParserContext&); + +} // namespace WebCore + +#endif // CSSPropertyParser_h |