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 108