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.
5 #ifndef MediaQueryParser_h
6 #define MediaQueryParser_h
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"
21 class MediaQueryData {
24 MediaQuery::Restrictor m_restrictor;
26 OwnPtrWillBeMember<ExpressionHeapVector> m_expressions;
27 String m_mediaFeature;
28 CSSParserValueList m_valueList;
35 void addParserValue(MediaQueryTokenType, const MediaQueryToken&);
36 void setMediaType(const String&);
37 PassOwnPtrWillBeRawPtr<MediaQuery> takeMediaQuery();
39 inline bool currentMediaQueryChanged() const
41 return (m_restrictor != MediaQuery::None || m_mediaTypeSet || m_expressions->size() > 0);
44 inline void setRestrictor(MediaQuery::Restrictor restrictor) { m_restrictor = restrictor; }
46 inline void setMediaFeature(const String& str) { m_mediaFeature = str; }
49 class MediaQueryParser {
52 static PassRefPtrWillBeRawPtr<MediaQuerySet> parseMediaQuerySet(const String&);
53 static PassRefPtrWillBeRawPtr<MediaQuerySet> parseMediaCondition(MediaQueryTokenIterator, MediaQueryTokenIterator endToken);
61 MediaQueryParser(ParserType);
62 virtual ~MediaQueryParser();
64 PassRefPtrWillBeRawPtr<MediaQuerySet> parseImpl(MediaQueryTokenIterator, MediaQueryTokenIterator endToken);
66 void processToken(const MediaQueryToken&);
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&);
80 typedef void (MediaQueryParser::*State)(MediaQueryTokenType, const MediaQueryToken&);
82 void setStateAndRestrict(State, MediaQuery::Restrictor);
83 void handleBlocks(const MediaQueryToken&);
86 ParserType m_parserType;
87 MediaQueryData m_mediaQueryData;
88 RefPtrWillBeMember<MediaQuerySet> m_querySet;
89 MediaQueryBlockWatcher m_blockWatcher;
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;
105 } // namespace WebCore
107 #endif // MediaQueryParser_h