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/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