ce7989c8f46cf1baf0c0a3f55b6c88d04d622bab
[WebKit-https.git] / Source / WebCore / css / parser / CSSParserToken.h
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Copyright (C) 2016 Apple Inc. All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 //    * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 //    * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 //    * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 #ifndef CSSParserToken_h
31 #define CSSParserToken_h
32
33 #include "CSSPrimitiveValue.h"
34 #include <wtf/text/StringView.h>
35
36 namespace WebCore {
37
38 enum CSSParserTokenType {
39     IdentToken = 0,
40     FunctionToken,
41     AtKeywordToken,
42     HashToken,
43     UrlToken,
44     BadUrlToken,
45     DelimiterToken,
46     NumberToken,
47     PercentageToken,
48     DimensionToken,
49     IncludeMatchToken,
50     DashMatchToken,
51     PrefixMatchToken,
52     SuffixMatchToken,
53     SubstringMatchToken,
54     ColumnToken,
55     UnicodeRangeToken,
56     WhitespaceToken,
57     CDOToken,
58     CDCToken,
59     ColonToken,
60     SemicolonToken,
61     CommaToken,
62     LeftParenthesisToken,
63     RightParenthesisToken,
64     LeftBracketToken,
65     RightBracketToken,
66     LeftBraceToken,
67     RightBraceToken,
68     StringToken,
69     BadStringToken,
70     EOFToken,
71     CommentToken,
72 };
73
74 enum NumericSign {
75     NoSign,
76     PlusSign,
77     MinusSign,
78 };
79
80 enum NumericValueType {
81     IntegerValueType,
82     NumberValueType,
83 };
84
85 enum HashTokenType {
86     HashTokenId,
87     HashTokenUnrestricted,
88 };
89
90 class CSSParserToken {
91     WTF_MAKE_FAST_ALLOCATED;
92 public:
93     enum BlockType {
94         NotBlock,
95         BlockStart,
96         BlockEnd,
97     };
98
99     CSSParserToken(CSSParserTokenType, BlockType = NotBlock);
100     CSSParserToken(CSSParserTokenType, StringView, BlockType = NotBlock);
101
102     CSSParserToken(CSSParserTokenType, UChar); // for DelimiterToken
103     CSSParserToken(CSSParserTokenType, double, NumericValueType, NumericSign); // for NumberToken
104     CSSParserToken(CSSParserTokenType, UChar32, UChar32); // for UnicodeRangeToken
105
106     CSSParserToken(HashTokenType, StringView);
107
108     bool operator==(const CSSParserToken& other) const;
109     bool operator!=(const CSSParserToken& other) const { return !(*this == other); }
110
111     // Converts NumberToken to DimensionToken.
112     void convertToDimensionWithUnit(StringView);
113
114     // Converts NumberToken to PercentageToken.
115     void convertToPercentage();
116
117     CSSParserTokenType type() const { return static_cast<CSSParserTokenType>(m_type); }
118     StringView value() const
119     {
120         if (m_valueIs8Bit)
121             return StringView(reinterpret_cast<const LChar*>(m_valueDataCharRaw), m_valueLength);
122         return StringView(reinterpret_cast<const UChar*>(m_valueDataCharRaw), m_valueLength);
123     }
124
125     UChar delimiter() const;
126     NumericSign numericSign() const;
127     NumericValueType numericValueType() const;
128     double numericValue() const;
129     HashTokenType getHashTokenType() const { ASSERT(m_type == HashToken); return m_hashTokenType; }
130     BlockType getBlockType() const { return static_cast<BlockType>(m_blockType); }
131     CSSPrimitiveValue::UnitTypes unitType() const { return static_cast<CSSPrimitiveValue::UnitTypes>(m_unit); }
132     UChar32 unicodeRangeStart() const { ASSERT(m_type == UnicodeRangeToken); return m_unicodeRange.start; }
133     UChar32 unicodeRangeEnd() const { ASSERT(m_type == UnicodeRangeToken); return m_unicodeRange.end; }
134     CSSValueID id() const;
135     CSSValueID functionId() const;
136
137     bool hasStringBacking() const;
138
139     CSSPropertyID parseAsCSSPropertyID() const;
140
141     void serialize(StringBuilder&) const;
142
143     CSSParserToken copyWithUpdatedString(const StringView&) const;
144
145 private:
146     void initValueFromStringView(StringView string)
147     {
148         m_valueLength = string.length();
149         m_valueIs8Bit = string.is8Bit();
150         m_valueDataCharRaw = m_valueIs8Bit ? static_cast<const void*>(string.characters8()) : static_cast<const void*>(string.characters16());
151     }
152     unsigned m_type : 6; // CSSParserTokenType
153     unsigned m_blockType : 2; // BlockType
154     unsigned m_numericValueType : 1; // NumericValueType
155     unsigned m_numericSign : 2; // NumericSign
156     unsigned m_unit : 7; // CSSPrimitiveValue::UnitTypes
157
158     bool valueDataCharRawEqual(const CSSParserToken& other) const;
159
160     // m_value... is an unpacked StringView so that we can pack it
161     // tightly with the rest of this object for a smaller object size.
162     bool m_valueIs8Bit : 1;
163     unsigned m_valueLength;
164     const void* m_valueDataCharRaw; // Either LChar* or UChar*.
165
166     union {
167         UChar m_delimiter;
168         HashTokenType m_hashTokenType;
169         double m_numericValue;
170         mutable int m_id;
171
172         struct {
173             UChar32 start;
174             UChar32 end;
175         } m_unicodeRange;
176     };
177 };
178
179 } // namespace WebCore
180
181 #endif // CSSSParserToken_h