OSDN Git Service

am 3c54ece0: am 5dc34a85: activeDocumentLoader() causes crash in WebCoreFrameBridge.cpp
[android-x86/external-webkit.git] / WebCore / css / CSSParser.h
1 /*
2  * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2004, 2005, 2006, 2008 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 CSSParser_h
24 #define CSSParser_h
25
26 #include "AtomicString.h"
27 #include "Color.h"
28 #include "CSSParserValues.h"
29 #include "CSSSelectorList.h"
30 #include "MediaQuery.h"
31 #include <wtf/HashMap.h>
32 #include <wtf/HashSet.h>
33 #include <wtf/Vector.h>
34
35 namespace WebCore {
36
37     class CSSMutableStyleDeclaration;
38     class CSSPrimitiveValue;
39     class CSSProperty;
40     class CSSRule;
41     class CSSRuleList;
42     class CSSSelector;
43     class CSSStyleRule;
44     class CSSStyleSheet;
45     class CSSValue;
46     class CSSValueList;
47     class CSSVariablesDeclaration;
48     class Document;
49     class MediaList;
50     class MediaQueryExp;
51     class StyleBase;
52     class StyleList;
53     class WebKitCSSKeyframeRule;
54     class WebKitCSSKeyframesRule;
55
56     class CSSParser {
57     public:
58         typedef HashMap<CSSStyleRule*, std::pair<unsigned, unsigned> > StyleRuleRanges;
59
60         CSSParser(bool strictParsing = true);
61         ~CSSParser();
62
63         void parseSheet(CSSStyleSheet*, const String&, int startLineNumber = 0, StyleRuleRanges* ruleRangeMap = 0);
64         PassRefPtr<CSSRule> parseRule(CSSStyleSheet*, const String&);
65         PassRefPtr<CSSRule> parseKeyframeRule(CSSStyleSheet*, const String&);
66         bool parseValue(CSSMutableStyleDeclaration*, int propId, const String&, bool important);
67         static bool parseColor(RGBA32& color, const String&, bool strict = false);
68         bool parseColor(CSSMutableStyleDeclaration*, const String&);
69         bool parseDeclaration(CSSMutableStyleDeclaration*, const String&);
70         bool parseMediaQuery(MediaList*, const String&);
71
72         Document* document() const;
73
74         void addProperty(int propId, PassRefPtr<CSSValue>, bool important);
75         void rollbackLastProperties(int num);
76         bool hasProperties() const { return m_numParsedProperties > 0; }
77
78         bool parseValue(int propId, bool important);
79         bool parseShorthand(int propId, const int* properties, int numProperties, bool important);
80         bool parse4Values(int propId, const int* properties, bool important);
81         bool parseContent(int propId, bool important);
82
83         PassRefPtr<CSSValue> parseAttr(CSSParserValueList* args);
84
85         PassRefPtr<CSSValue> parseBackgroundColor();
86
87         bool parseFillImage(RefPtr<CSSValue>&);
88         PassRefPtr<CSSValue> parseFillPositionXY(bool& xFound, bool& yFound);
89         void parseFillPosition(RefPtr<CSSValue>&, RefPtr<CSSValue>&);
90         void parseFillRepeat(RefPtr<CSSValue>&, RefPtr<CSSValue>&);
91         PassRefPtr<CSSValue> parseFillSize(int propId, bool &allowComma);
92
93         bool parseFillProperty(int propId, int& propId1, int& propId2, RefPtr<CSSValue>&, RefPtr<CSSValue>&);
94         bool parseFillShorthand(int propId, const int* properties, int numProperties, bool important);
95
96         void addFillValue(RefPtr<CSSValue>& lval, PassRefPtr<CSSValue> rval);
97
98         void addAnimationValue(RefPtr<CSSValue>& lval, PassRefPtr<CSSValue> rval);
99
100         PassRefPtr<CSSValue> parseAnimationDelay();
101         PassRefPtr<CSSValue> parseAnimationDirection();
102         PassRefPtr<CSSValue> parseAnimationDuration();
103         PassRefPtr<CSSValue> parseAnimationFillMode();
104         PassRefPtr<CSSValue> parseAnimationIterationCount();
105         PassRefPtr<CSSValue> parseAnimationName();
106         PassRefPtr<CSSValue> parseAnimationPlayState();
107         PassRefPtr<CSSValue> parseAnimationProperty();
108         PassRefPtr<CSSValue> parseAnimationTimingFunction();
109
110         void parseTransformOriginShorthand(RefPtr<CSSValue>&, RefPtr<CSSValue>&, RefPtr<CSSValue>&);
111         bool parseTimingFunctionValue(CSSParserValueList*& args, double& result);
112         bool parseAnimationProperty(int propId, RefPtr<CSSValue>&);
113         bool parseTransitionShorthand(bool important);
114         bool parseAnimationShorthand(bool important);
115
116         bool parseDashboardRegions(int propId, bool important);
117
118         bool parseShape(int propId, bool important);
119
120         bool parseFont(bool important);
121         PassRefPtr<CSSValueList> parseFontFamily();
122
123         bool parseCounter(int propId, int defaultValue, bool important);
124         PassRefPtr<CSSValue> parseCounterContent(CSSParserValueList* args, bool counters);
125
126         bool parseColorParameters(CSSParserValue*, int* colorValues, bool parseAlpha);
127         bool parseHSLParameters(CSSParserValue*, double* colorValues, bool parseAlpha);
128         PassRefPtr<CSSPrimitiveValue> parseColor(CSSParserValue* = 0);
129         bool parseColorFromValue(CSSParserValue*, RGBA32&);
130         void parseSelector(const String&, Document* doc, CSSSelectorList&);
131
132         static bool parseColor(const String&, RGBA32& rgb, bool strict);
133
134         bool parseFontStyle(bool important);
135         bool parseFontVariant(bool important);
136         bool parseFontWeight(bool important);
137         bool parseFontFaceSrc();
138         bool parseFontFaceUnicodeRange();
139
140 #if ENABLE(SVG)
141         bool parseSVGValue(int propId, bool important);
142         PassRefPtr<CSSValue> parseSVGPaint();
143         PassRefPtr<CSSValue> parseSVGColor();
144         PassRefPtr<CSSValue> parseSVGStrokeDasharray();
145 #endif
146
147 #if ENABLE(WCSS)
148         PassRefPtr<CSSValue> parseWCSSInputProperty();
149 #endif
150
151         // CSS3 Parsing Routines (for properties specific to CSS3)
152         bool parseShadow(int propId, bool important);
153         bool parseBorderImage(int propId, bool important, RefPtr<CSSValue>&);
154         bool parseBorderRadius(int propId, bool important);
155
156         bool parseReflect(int propId, bool important);
157
158         // Image generators
159         bool parseCanvas(RefPtr<CSSValue>&);
160         bool parseGradient(RefPtr<CSSValue>&);
161
162         PassRefPtr<CSSValueList> parseTransform();
163         bool parseTransformOrigin(int propId, int& propId1, int& propId2, int& propId3, RefPtr<CSSValue>&, RefPtr<CSSValue>&, RefPtr<CSSValue>&);
164         bool parsePerspectiveOrigin(int propId, int& propId1, int& propId2,  RefPtr<CSSValue>&, RefPtr<CSSValue>&);
165         bool parseVariable(CSSVariablesDeclaration*, const String& variableName, const String& variableValue);
166         void parsePropertyWithResolvedVariables(int propId, bool important, CSSMutableStyleDeclaration*, CSSParserValueList*);
167
168         int yyparse();
169
170         CSSSelector* createFloatingSelector();
171         CSSSelector* sinkFloatingSelector(CSSSelector*);
172
173         CSSParserValueList* createFloatingValueList();
174         CSSParserValueList* sinkFloatingValueList(CSSParserValueList*);
175
176         CSSParserFunction* createFloatingFunction();
177         CSSParserFunction* sinkFloatingFunction(CSSParserFunction*);
178
179         CSSParserValue& sinkFloatingValue(CSSParserValue&);
180
181         MediaList* createMediaList();
182         CSSRule* createCharsetRule(const CSSParserString&);
183         CSSRule* createImportRule(const CSSParserString&, MediaList*);
184         WebKitCSSKeyframeRule* createKeyframeRule(CSSParserValueList*);
185         WebKitCSSKeyframesRule* createKeyframesRule();
186         CSSRule* createMediaRule(MediaList*, CSSRuleList*);
187         CSSRuleList* createRuleList();
188         CSSRule* createStyleRule(Vector<CSSSelector*>* selectors);
189         CSSRule* createFontFaceRule();
190         CSSRule* createVariablesRule(MediaList*, bool variablesKeyword);
191         CSSRule* createPageRule(CSSSelector* pageSelector);
192         CSSRule* createMarginAtRule(CSSSelector::MarginBoxType marginBox);
193         void startDeclarationsForMarginBox();
194         void endDeclarationsForMarginBox();
195
196         MediaQueryExp* createFloatingMediaQueryExp(const AtomicString&, CSSParserValueList*);
197         MediaQueryExp* sinkFloatingMediaQueryExp(MediaQueryExp*);
198         Vector<MediaQueryExp*>* createFloatingMediaQueryExpList();
199         Vector<MediaQueryExp*>* sinkFloatingMediaQueryExpList(Vector<MediaQueryExp*>*);
200         MediaQuery* createFloatingMediaQuery(MediaQuery::Restrictor, const String&, Vector<MediaQueryExp*>*);
201         MediaQuery* createFloatingMediaQuery(Vector<MediaQueryExp*>*);
202         MediaQuery* sinkFloatingMediaQuery(MediaQuery*);
203
204         void addNamespace(const AtomicString& prefix, const AtomicString& uri);
205
206         bool addVariable(const CSSParserString&, CSSParserValueList*);
207         bool addVariableDeclarationBlock(const CSSParserString&);
208         bool checkForVariables(CSSParserValueList*);
209         void addUnresolvedProperty(int propId, bool important);
210         void invalidBlockHit();
211
212         Vector<CSSSelector*>* reusableSelectorVector() { return &m_reusableSelectorVector; }
213
214         void updateLastSelectorLineAndPosition();
215
216         void clearProperties();
217
218         bool m_strict;
219         bool m_important;
220         int m_id;
221         CSSStyleSheet* m_styleSheet;
222         RefPtr<CSSRule> m_rule;
223         RefPtr<CSSRule> m_keyframe;
224         MediaQuery* m_mediaQuery;
225         CSSParserValueList* m_valueList;
226         CSSProperty** m_parsedProperties;
227         CSSSelectorList* m_selectorListForParseSelector;
228         unsigned m_numParsedProperties;
229         unsigned m_maxParsedProperties;
230         unsigned m_numParsedPropertiesBeforeMarginBox;
231
232         int m_inParseShorthand;
233         int m_currentShorthand;
234         bool m_implicitShorthand;
235
236         bool m_hasFontFaceOnlyValues;
237         bool m_hadSyntacticallyValidCSSRule;
238
239         Vector<String> m_variableNames;
240         Vector<RefPtr<CSSValue> > m_variableValues;
241
242         AtomicString m_defaultNamespace;
243
244         // tokenizer methods and data
245         unsigned m_ruleBodyStartOffset;
246         unsigned m_ruleBodyEndOffset;
247         StyleRuleRanges* m_ruleRanges;
248         void markRuleBodyStart();
249         void markRuleBodyEnd();
250         void resetRuleBodyMarks() { m_ruleBodyStartOffset = m_ruleBodyEndOffset = 0; }
251         int lex(void* yylval);
252         int token() { return yyTok; }
253         UChar* text(int* length);
254         void countLines();
255         int lex();
256
257     private:
258         void recheckAtKeyword(const UChar* str, int len);
259
260         void setupParser(const char* prefix, const String&, const char* suffix);
261
262         bool inShorthand() const { return m_inParseShorthand; }
263
264         void checkForOrphanedUnits();
265
266         void clearVariables();
267
268         void deleteFontFaceOnlyValues();
269
270         enum SizeParameterType {
271             None,
272             Auto,
273             Length,
274             PageSize,
275             Orientation,
276         };
277
278         bool parsePage(int propId, bool important);
279         bool parseSize(int propId, bool important);
280         SizeParameterType parseSizeParameter(CSSValueList* parsedValues, CSSParserValue* value, SizeParameterType prevParamType);
281
282         UChar* m_data;
283         UChar* yytext;
284         UChar* yy_c_buf_p;
285         UChar yy_hold_char;
286         int yy_last_accepting_state;
287         UChar* yy_last_accepting_cpos;
288         int yyleng;
289         int yyTok;
290         int yy_start;
291         int m_lineNumber;
292         int m_lastSelectorLineNumber;
293
294         bool m_allowImportRules;
295         bool m_allowVariablesRules;
296         bool m_allowNamespaceDeclarations;
297
298         Vector<RefPtr<StyleBase> > m_parsedStyleObjects;
299         Vector<RefPtr<CSSRuleList> > m_parsedRuleLists;
300         HashSet<CSSSelector*> m_floatingSelectors;
301         HashSet<CSSParserValueList*> m_floatingValueLists;
302         HashSet<CSSParserFunction*> m_floatingFunctions;
303
304         MediaQuery* m_floatingMediaQuery;
305         MediaQueryExp* m_floatingMediaQueryExp;
306         Vector<MediaQueryExp*>* m_floatingMediaQueryExpList;
307
308         Vector<CSSSelector*> m_reusableSelectorVector;
309
310         // defines units allowed for a certain property, used in parseUnit
311         enum Units {
312             FUnknown   = 0x0000,
313             FInteger   = 0x0001,
314             FNumber    = 0x0002,  // Real Numbers
315             FPercent   = 0x0004,
316             FLength    = 0x0008,
317             FAngle     = 0x0010,
318             FTime      = 0x0020,
319             FFrequency = 0x0040,
320             FRelative  = 0x0100,
321             FNonNeg    = 0x0200
322         };
323
324         friend inline Units operator|(Units a, Units b)
325         {
326             return static_cast<Units>(static_cast<unsigned>(a) | static_cast<unsigned>(b));
327         }
328
329         static bool validUnit(CSSParserValue*, Units, bool strict);
330
331         friend class TransformOperationInfo;
332     };
333
334     int cssPropertyID(const CSSParserString&);
335     int cssPropertyID(const String&);
336     int cssValueKeywordID(const CSSParserString&);
337
338     class ShorthandScope : public FastAllocBase {
339     public:
340         ShorthandScope(CSSParser* parser, int propId) : m_parser(parser)
341         {
342             if (!(m_parser->m_inParseShorthand++))
343                 m_parser->m_currentShorthand = propId;
344         }
345         ~ShorthandScope()
346         {
347             if (!(--m_parser->m_inParseShorthand))
348                 m_parser->m_currentShorthand = 0;
349         }
350
351     private:
352         CSSParser* m_parser;
353     };
354
355     String quoteCSSString(const String&);
356     String quoteCSSStringIfNeeded(const String&);
357     String quoteCSSURLIfNeeded(const String&);
358
359 } // namespace WebCore
360
361 #endif // CSSParser_h