Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / css / parser / MediaQueryParser.h
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef MediaQueryParser_h
6 #define MediaQueryParser_h
7
8 #include "core/css/CSSParserValues.h"
9 #include "core/css/MediaList.h"
10 #include "core/css/MediaQuery.h"
11 #include "core/css/MediaQueryExp.h"
12 #include "core/css/parser/MediaQueryBlockWatcher.h"
13 #include "core/css/parser/MediaQueryToken.h"
14 #include "wtf/Vector.h"
15 #include "wtf/text/WTFString.h"
16
17 namespace WebCore {
18
19 class MediaQuerySet;
20
21 class MediaQueryData {
22     STACK_ALLOCATED();
23 private:
24     MediaQuery::Restrictor m_restrictor;
25     String m_mediaType;
26     OwnPtrWillBeMember<ExpressionHeapVector> m_expressions;
27     String m_mediaFeature;
28     CSSParserValueList m_valueList;
29     bool m_mediaTypeSet;
30
31 public:
32     MediaQueryData();
33     void clear();
34     bool addExpression();
35     void addParserValue(MediaQueryTokenType, const MediaQueryToken&);
36     void setMediaType(const String&);
37     PassOwnPtrWillBeRawPtr<MediaQuery> takeMediaQuery();
38
39     inline bool currentMediaQueryChanged() const
40     {
41         return (m_restrictor != MediaQuery::None || m_mediaTypeSet || m_expressions->size() > 0);
42     }
43
44     inline void setRestrictor(MediaQuery::Restrictor restrictor) { m_restrictor = restrictor; }
45
46     inline void setMediaFeature(const String& str) { m_mediaFeature = str; }
47 };
48
49 class MediaQueryParser {
50     STACK_ALLOCATED();
51 public:
52     static PassRefPtrWillBeRawPtr<MediaQuerySet> parseMediaQuerySet(const String&);
53     static PassRefPtrWillBeRawPtr<MediaQuerySet> parseMediaCondition(MediaQueryTokenIterator, MediaQueryTokenIterator endToken);
54
55 private:
56     enum ParserType {
57         MediaQuerySetParser,
58         MediaConditionParser,
59     };
60
61     MediaQueryParser(ParserType);
62     virtual ~MediaQueryParser();
63
64     PassRefPtrWillBeRawPtr<MediaQuerySet> parseImpl(MediaQueryTokenIterator, MediaQueryTokenIterator endToken);
65
66     void processToken(const MediaQueryToken&);
67
68     void readRestrictor(MediaQueryTokenType, const MediaQueryToken&);
69     void readMediaType(MediaQueryTokenType, const MediaQueryToken&);
70     void readAnd(MediaQueryTokenType, const MediaQueryToken&);
71     void readFeatureStart(MediaQueryTokenType, const MediaQueryToken&);
72     void readFeature(MediaQueryTokenType, const MediaQueryToken&);
73     void readFeatureColon(MediaQueryTokenType, const MediaQueryToken&);
74     void readFeatureValue(MediaQueryTokenType, const MediaQueryToken&);
75     void readFeatureEnd(MediaQueryTokenType, const MediaQueryToken&);
76     void skipUntilComma(MediaQueryTokenType, const MediaQueryToken&);
77     void skipUntilBlockEnd(MediaQueryTokenType, const MediaQueryToken&);
78     void done(MediaQueryTokenType, const MediaQueryToken&);
79
80     typedef void (MediaQueryParser::*State)(MediaQueryTokenType, const MediaQueryToken&);
81
82     void setStateAndRestrict(State, MediaQuery::Restrictor);
83     void handleBlocks(const MediaQueryToken&);
84
85     State m_state;
86     ParserType m_parserType;
87     MediaQueryData m_mediaQueryData;
88     RefPtrWillBeMember<MediaQuerySet> m_querySet;
89     MediaQueryBlockWatcher m_blockWatcher;
90
91     const static State ReadRestrictor;
92     const static State ReadMediaType;
93     const static State ReadAnd;
94     const static State ReadFeatureStart;
95     const static State ReadFeature;
96     const static State ReadFeatureColon;
97     const static State ReadFeatureValue;
98     const static State ReadFeatureEnd;
99     const static State SkipUntilComma;
100     const static State SkipUntilBlockEnd;
101     const static State Done;
102
103 };
104
105 } // namespace WebCore
106
107 #endif // MediaQueryParser_h