Home | History | Annotate | Download | only in parser
      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