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 107