Upstream version 9.38.198.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/MediaList.h"
9 #include "core/css/MediaQuery.h"
10 #include "core/css/MediaQueryExp.h"
11 #include "core/css/parser/CSSParserValues.h"
12 #include "core/css/parser/MediaQueryBlockWatcher.h"
13 #include "core/css/parser/MediaQueryToken.h"
14 #include "wtf/text/WTFString.h"
15
16 namespace blink {
17
18 class MediaQuerySet;
19
20 class MediaQueryData {
21     STACK_ALLOCATED();
22 private:
23     MediaQuery::Restrictor m_restrictor;
24     String m_mediaType;
25     OwnPtrWillBeMember<ExpressionHeapVector> m_expressions;
26     String m_mediaFeature;
27     CSSParserValueList m_valueList;
28     bool m_mediaTypeSet;
29
30 public:
31     MediaQueryData();
32     void clear();
33     bool addExpression();
34     void addParserValue(MediaQueryTokenType, const MediaQueryToken&);
35     void setMediaType(const String&);
36     PassOwnPtrWillBeRawPtr<MediaQuery> takeMediaQuery();
37
38     inline bool currentMediaQueryChanged() const
39     {
40         return (m_restrictor != MediaQuery::None || m_mediaTypeSet || m_expressions->size() > 0);
41     }
42
43     inline void setRestrictor(MediaQuery::Restrictor restrictor) { m_restrictor = restrictor; }
44
45     inline void setMediaFeature(const String& str) { m_mediaFeature = str; }
46 };
47
48 class MediaQueryParser {
49     STACK_ALLOCATED();
50 public:
51     static PassRefPtrWillBeRawPtr<MediaQuerySet> parseMediaQuerySet(const String&);
52     static PassRefPtrWillBeRawPtr<MediaQuerySet> parseMediaCondition(MediaQueryTokenIterator, MediaQueryTokenIterator endToken);
53
54 private:
55     enum ParserType {
56         MediaQuerySetParser,
57         MediaConditionParser,
58     };
59
60     MediaQueryParser(ParserType);
61     virtual ~MediaQueryParser();
62
63     PassRefPtrWillBeRawPtr<MediaQuerySet> parseImpl(MediaQueryTokenIterator, MediaQueryTokenIterator endToken);
64
65     void processToken(const MediaQueryToken&);
66
67     void readRestrictor(MediaQueryTokenType, const MediaQueryToken&);
68     void readMediaType(MediaQueryTokenType, const MediaQueryToken&);
69     void readAnd(MediaQueryTokenType, const MediaQueryToken&);
70     void readFeatureStart(MediaQueryTokenType, const MediaQueryToken&);
71     void readFeature(MediaQueryTokenType, const MediaQueryToken&);
72     void readFeatureColon(MediaQueryTokenType, const MediaQueryToken&);
73     void readFeatureValue(MediaQueryTokenType, const MediaQueryToken&);
74     void readFeatureEnd(MediaQueryTokenType, const MediaQueryToken&);
75     void skipUntilComma(MediaQueryTokenType, const MediaQueryToken&);
76     void skipUntilBlockEnd(MediaQueryTokenType, const MediaQueryToken&);
77     void done(MediaQueryTokenType, const MediaQueryToken&);
78
79     typedef void (MediaQueryParser::*State)(MediaQueryTokenType, const MediaQueryToken&);
80
81     void setStateAndRestrict(State, MediaQuery::Restrictor);
82     void handleBlocks(const MediaQueryToken&);
83
84     State m_state;
85     ParserType m_parserType;
86     MediaQueryData m_mediaQueryData;
87     RefPtrWillBeMember<MediaQuerySet> m_querySet;
88     MediaQueryBlockWatcher m_blockWatcher;
89
90     const static State ReadRestrictor;
91     const static State ReadMediaType;
92     const static State ReadAnd;
93     const static State ReadFeatureStart;
94     const static State ReadFeature;
95     const static State ReadFeatureColon;
96     const static State ReadFeatureValue;
97     const static State ReadFeatureEnd;
98     const static State SkipUntilComma;
99     const static State SkipUntilBlockEnd;
100     const static State Done;
101
102 };
103
104 } // namespace blink
105
106 #endif // MediaQueryParser_h