• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved.
4  * Copyright (C) 2008 Eric Seidel <eric@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 
inShorthand()75     bool inShorthand() const { return m_inParseShorthand; }
inQuirksMode()76     bool inQuirksMode() const { return isQuirksModeBehavior(m_context.mode()); }
77 
inViewport()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:
ImplicitScope(CSSPropertyParser * parser)286         ImplicitScope(CSSPropertyParser* parser)
287             : m_parser(parser)
288         {
289             m_parser->m_implicitShorthand = true;
290         }
291 
~ImplicitScope()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:
ShorthandScope(CSSPropertyParser * parser,CSSPropertyID propId)304         ShorthandScope(CSSPropertyParser* parser, CSSPropertyID propId) : m_parser(parser)
305         {
306             if (!(m_parser->m_inParseShorthand++))
307                 m_parser->m_currentShorthand = propId;
308         }
~ShorthandScope()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