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