1d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// found in the LICENSE file. 4d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 5d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#ifndef MediaQueryParser_h 6d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#define MediaQueryParser_h 7d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 8d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/css/MediaList.h" 9d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/css/MediaQuery.h" 10d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/css/MediaQueryExp.h" 11e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/css/parser/CSSParserValues.h" 126f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "core/css/parser/MediaQueryBlockWatcher.h" 13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/css/parser/MediaQueryToken.h" 14d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "wtf/text/WTFString.h" 15d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 16c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 17d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 18d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class MediaQuerySet; 19d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 20d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class MediaQueryData { 2107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch STACK_ALLOCATED(); 22d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)private: 23d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) MediaQuery::Restrictor m_restrictor; 24d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) String m_mediaType; 25d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) OwnPtrWillBeMember<ExpressionHeapVector> m_expressions; 26d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) String m_mediaFeature; 27d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) CSSParserValueList m_valueList; 28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool m_mediaTypeSet; 29d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 30d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)public: 31d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) MediaQueryData(); 32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void clear(); 33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool addExpression(); 346f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void addParserValue(MediaQueryTokenType, const MediaQueryToken&); 35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void setMediaType(const String&); 36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PassOwnPtrWillBeRawPtr<MediaQuery> takeMediaQuery(); 37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) inline bool currentMediaQueryChanged() const 39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return (m_restrictor != MediaQuery::None || m_mediaTypeSet || m_expressions->size() > 0); 41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) inline void setRestrictor(MediaQuery::Restrictor restrictor) { m_restrictor = restrictor; } 44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) inline void setMediaFeature(const String& str) { m_mediaFeature = str; } 46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}; 47d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class MediaQueryParser { 49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) STACK_ALLOCATED(); 50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)public: 51a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static PassRefPtrWillBeRawPtr<MediaQuerySet> parseMediaQuerySet(const String&); 52f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu static PassRefPtrWillBeRawPtr<MediaQuerySet> parseMediaCondition(MediaQueryTokenIterator, MediaQueryTokenIterator endToken); 53d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)private: 55a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch enum ParserType { 56a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch MediaQuerySetParser, 57a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch MediaConditionParser, 58a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch }; 59d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 60a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch MediaQueryParser(ParserType); 61a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch virtual ~MediaQueryParser(); 62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 63f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu PassRefPtrWillBeRawPtr<MediaQuerySet> parseImpl(MediaQueryTokenIterator, MediaQueryTokenIterator endToken); 64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 656f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void processToken(const MediaQueryToken&); 66d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 676f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void readRestrictor(MediaQueryTokenType, const MediaQueryToken&); 686f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void readMediaType(MediaQueryTokenType, const MediaQueryToken&); 696f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void readAnd(MediaQueryTokenType, const MediaQueryToken&); 706f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void readFeatureStart(MediaQueryTokenType, const MediaQueryToken&); 716f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void readFeature(MediaQueryTokenType, const MediaQueryToken&); 726f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void readFeatureColon(MediaQueryTokenType, const MediaQueryToken&); 736f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void readFeatureValue(MediaQueryTokenType, const MediaQueryToken&); 746f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void readFeatureEnd(MediaQueryTokenType, const MediaQueryToken&); 756f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void skipUntilComma(MediaQueryTokenType, const MediaQueryToken&); 766f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void skipUntilBlockEnd(MediaQueryTokenType, const MediaQueryToken&); 776f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void done(MediaQueryTokenType, const MediaQueryToken&); 78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 796f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch typedef void (MediaQueryParser::*State)(MediaQueryTokenType, const MediaQueryToken&); 80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void setStateAndRestrict(State, MediaQuery::Restrictor); 826f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch void handleBlocks(const MediaQueryToken&); 83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 84d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) State m_state; 8510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ParserType m_parserType; 86d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) MediaQueryData m_mediaQueryData; 87d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RefPtrWillBeMember<MediaQuerySet> m_querySet; 886f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch MediaQueryBlockWatcher m_blockWatcher; 89d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 90d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const static State ReadRestrictor; 91d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const static State ReadMediaType; 92d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const static State ReadAnd; 93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const static State ReadFeatureStart; 94d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const static State ReadFeature; 95d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const static State ReadFeatureColon; 96d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const static State ReadFeatureValue; 97d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const static State ReadFeatureEnd; 98d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const static State SkipUntilComma; 99aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch const static State SkipUntilBlockEnd; 100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const static State Done; 101d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}; 103d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 104c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#endif // MediaQueryParser_h 107