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 MediaQueryToken_h
6#define MediaQueryToken_h
7
8#include "core/css/CSSPrimitiveValue.h"
9#include "wtf/text/WTFString.h"
10
11namespace blink {
12
13enum MediaQueryTokenType {
14    IdentToken = 0,
15    FunctionToken,
16    DelimiterToken,
17    NumberToken,
18    PercentageToken,
19    DimensionToken,
20    WhitespaceToken,
21    ColonToken,
22    SemicolonToken,
23    CommaToken,
24    LeftParenthesisToken,
25    RightParenthesisToken,
26    LeftBracketToken,
27    RightBracketToken,
28    LeftBraceToken,
29    RightBraceToken,
30    StringToken,
31    BadStringToken,
32    EOFToken,
33    CommentToken,
34};
35
36enum NumericValueType {
37    IntegerValueType,
38    NumberValueType,
39};
40
41class MediaQueryToken {
42public:
43    enum BlockType {
44        NotBlock,
45        BlockStart,
46        BlockEnd,
47    };
48
49    MediaQueryToken(MediaQueryTokenType, BlockType = NotBlock);
50    MediaQueryToken(MediaQueryTokenType, String value, BlockType = NotBlock);
51
52    MediaQueryToken(MediaQueryTokenType, UChar); // for DelimiterToken
53    MediaQueryToken(MediaQueryTokenType, double, NumericValueType); // for NumberToken
54
55    // Converts NumberToken to DimensionToken.
56    void convertToDimensionWithUnit(String);
57
58    // Converts NumberToken to PercentageToken.
59    void convertToPercentage();
60
61    MediaQueryTokenType type() const { return m_type; }
62    String value() const { return m_value; }
63    String textForUnitTests() const;
64
65    UChar delimiter() const;
66    NumericValueType numericValueType() const;
67    double numericValue() const;
68    BlockType blockType() const { return m_blockType; }
69    CSSPrimitiveValue::UnitType unitType() const { return m_unit; }
70
71private:
72    MediaQueryTokenType m_type;
73    String m_value;
74
75    UChar m_delimiter; // Could be rolled into m_value?
76
77    NumericValueType m_numericValueType;
78    double m_numericValue;
79    CSSPrimitiveValue::UnitType m_unit;
80
81    BlockType m_blockType;
82};
83
84typedef Vector<MediaQueryToken>::iterator MediaQueryTokenIterator;
85
86} // namespace
87
88#endif // MediaQueryToken_h
89