OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/css/parser/CSSParserToken.h" | 5 #include "core/css/parser/CSSParserToken.h" |
6 | 6 |
7 #include "core/css/CSSMarkup.h" | 7 #include "core/css/CSSMarkup.h" |
8 #include "core/css/CSSPrimitiveValueUnitTrie.h" | 8 #include "core/css/CSSPrimitiveValueUnitTrie.h" |
9 #include "core/css/parser/CSSPropertyParser.h" | 9 #include "core/css/parser/CSSPropertyParser.h" |
10 #include "wtf/HashMap.h" | 10 #include "wtf/HashMap.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 | 21 |
22 // Just a helper used for Delimiter tokens. | 22 // Just a helper used for Delimiter tokens. |
23 CSSParserToken::CSSParserToken(CSSParserTokenType type, UChar c) | 23 CSSParserToken::CSSParserToken(CSSParserTokenType type, UChar c) |
24 : m_type(type) | 24 : m_type(type) |
25 , m_blockType(NotBlock) | 25 , m_blockType(NotBlock) |
26 , m_delimiter(c) | 26 , m_delimiter(c) |
27 { | 27 { |
28 ASSERT(m_type == DelimiterToken); | 28 ASSERT(m_type == DelimiterToken); |
29 } | 29 } |
30 | 30 |
31 CSSParserToken::CSSParserToken(CSSParserTokenType type, CSSParserString value, B
lockType blockType) | 31 CSSParserToken::CSSParserToken(CSSParserTokenType type, StringView value, BlockT
ype blockType) |
32 : m_type(type) | 32 : m_type(type) |
33 , m_blockType(blockType) | 33 , m_blockType(blockType) |
34 { | 34 { |
35 initValueFromCSSParserString(value); | 35 initValueFromStringView(value); |
36 m_id = -1; | 36 m_id = -1; |
37 } | 37 } |
38 | 38 |
39 CSSParserToken::CSSParserToken(CSSParserTokenType type, double numericValue, Num
ericValueType numericValueType, NumericSign sign) | 39 CSSParserToken::CSSParserToken(CSSParserTokenType type, double numericValue, Num
ericValueType numericValueType, NumericSign sign) |
40 : m_type(type) | 40 : m_type(type) |
41 , m_blockType(NotBlock) | 41 , m_blockType(NotBlock) |
42 , m_numericValueType(numericValueType) | 42 , m_numericValueType(numericValueType) |
43 , m_numericSign(sign) | 43 , m_numericSign(sign) |
44 , m_unit(static_cast<unsigned>(CSSPrimitiveValue::UnitType::Number)) | 44 , m_unit(static_cast<unsigned>(CSSPrimitiveValue::UnitType::Number)) |
45 , m_numericValue(numericValue) | 45 , m_numericValue(numericValue) |
46 { | 46 { |
47 ASSERT(type == NumberToken); | 47 ASSERT(type == NumberToken); |
48 } | 48 } |
49 | 49 |
50 CSSParserToken::CSSParserToken(CSSParserTokenType type, UChar32 start, UChar32 e
nd) | 50 CSSParserToken::CSSParserToken(CSSParserTokenType type, UChar32 start, UChar32 e
nd) |
51 : m_type(UnicodeRangeToken) | 51 : m_type(UnicodeRangeToken) |
52 , m_blockType(NotBlock) | 52 , m_blockType(NotBlock) |
53 { | 53 { |
54 ASSERT_UNUSED(type, type == UnicodeRangeToken); | 54 ASSERT_UNUSED(type, type == UnicodeRangeToken); |
55 m_unicodeRange.start = start; | 55 m_unicodeRange.start = start; |
56 m_unicodeRange.end = end; | 56 m_unicodeRange.end = end; |
57 } | 57 } |
58 | 58 |
59 CSSParserToken::CSSParserToken(HashTokenType type, CSSParserString value) | 59 CSSParserToken::CSSParserToken(HashTokenType type, StringView value) |
60 : m_type(HashToken) | 60 : m_type(HashToken) |
61 , m_blockType(NotBlock) | 61 , m_blockType(NotBlock) |
62 , m_hashTokenType(type) | 62 , m_hashTokenType(type) |
63 { | 63 { |
64 initValueFromCSSParserString(value); | 64 initValueFromStringView(value); |
65 } | 65 } |
66 | 66 |
67 void CSSParserToken::convertToDimensionWithUnit(CSSParserString unit) | 67 void CSSParserToken::convertToDimensionWithUnit(StringView unit) |
68 { | 68 { |
69 ASSERT(m_type == NumberToken); | 69 ASSERT(m_type == NumberToken); |
70 m_type = DimensionToken; | 70 m_type = DimensionToken; |
71 initValueFromCSSParserString(unit); | 71 initValueFromStringView(unit); |
72 | 72 |
73 if (unit.is8Bit()) | 73 if (unit.is8Bit()) |
74 m_unit = static_cast<unsigned>(lookupCSSPrimitiveValueUnit(unit.characte
rs8(), unit.length())); | 74 m_unit = static_cast<unsigned>(lookupCSSPrimitiveValueUnit(unit.characte
rs8(), unit.length())); |
75 else | 75 else |
76 m_unit = static_cast<unsigned>(lookupCSSPrimitiveValueUnit(unit.characte
rs16(), unit.length())); | 76 m_unit = static_cast<unsigned>(lookupCSSPrimitiveValueUnit(unit.characte
rs16(), unit.length())); |
77 } | 77 } |
78 | 78 |
79 void CSSParserToken::convertToPercentage() | 79 void CSSParserToken::convertToPercentage() |
80 { | 80 { |
81 ASSERT(m_type == NumberToken); | 81 ASSERT(m_type == NumberToken); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 CSSParserTokenType tokenType = type(); | 138 CSSParserTokenType tokenType = type(); |
139 return tokenType == IdentToken | 139 return tokenType == IdentToken |
140 || tokenType == FunctionToken | 140 || tokenType == FunctionToken |
141 || tokenType == AtKeywordToken | 141 || tokenType == AtKeywordToken |
142 || tokenType == HashToken | 142 || tokenType == HashToken |
143 || tokenType == UrlToken | 143 || tokenType == UrlToken |
144 || tokenType == DimensionToken | 144 || tokenType == DimensionToken |
145 || tokenType == StringToken; | 145 || tokenType == StringToken; |
146 } | 146 } |
147 | 147 |
148 CSSParserToken CSSParserToken::copyWithUpdatedString(const CSSParserString& pars
erString) const | 148 CSSParserToken CSSParserToken::copyWithUpdatedString(const StringView& string) c
onst |
149 { | 149 { |
150 CSSParserToken copy(*this); | 150 CSSParserToken copy(*this); |
151 copy.initValueFromCSSParserString(parserString); | 151 copy.initValueFromStringView(string); |
152 return copy; | 152 return copy; |
153 } | 153 } |
154 | 154 |
155 bool CSSParserToken::valueDataCharRawEqual(const CSSParserToken& other) const | 155 bool CSSParserToken::valueDataCharRawEqual(const CSSParserToken& other) const |
156 { | 156 { |
157 if (m_valueLength != other.m_valueLength) | 157 if (m_valueLength != other.m_valueLength) |
158 return false; | 158 return false; |
159 | 159 |
160 if (m_valueDataCharRaw == other.m_valueDataCharRaw && m_valueIs8Bit == other
.m_valueIs8Bit) | 160 if (m_valueDataCharRaw == other.m_valueDataCharRaw && m_valueIs8Bit == other
.m_valueIs8Bit) |
161 return true; | 161 return true; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 return true; | 200 return true; |
201 } | 201 } |
202 } | 202 } |
203 | 203 |
204 void CSSParserToken::serialize(StringBuilder& builder) const | 204 void CSSParserToken::serialize(StringBuilder& builder) const |
205 { | 205 { |
206 // This is currently only used for @supports CSSOM. To keep our implementati
on | 206 // This is currently only used for @supports CSSOM. To keep our implementati
on |
207 // simple we handle some of the edge cases incorrectly (see comments below). | 207 // simple we handle some of the edge cases incorrectly (see comments below). |
208 switch (type()) { | 208 switch (type()) { |
209 case IdentToken: | 209 case IdentToken: |
210 serializeIdentifier(value(), builder); | 210 serializeIdentifier(value().toString(), builder); |
211 break; | 211 break; |
212 case FunctionToken: | 212 case FunctionToken: |
213 serializeIdentifier(value(), builder); | 213 serializeIdentifier(value().toString(), builder); |
214 return builder.append('('); | 214 return builder.append('('); |
215 case AtKeywordToken: | 215 case AtKeywordToken: |
216 builder.append('@'); | 216 builder.append('@'); |
217 serializeIdentifier(value(), builder); | 217 serializeIdentifier(value().toString(), builder); |
218 break; | 218 break; |
219 case HashToken: | 219 case HashToken: |
220 // This will always serialize as a hash-token with 'id' type instead of | 220 // This will always serialize as a hash-token with 'id' type instead of |
221 // preserving the type of the input. | 221 // preserving the type of the input. |
222 builder.append('#'); | 222 builder.append('#'); |
223 serializeIdentifier(value(), builder); | 223 serializeIdentifier(value().toString(), builder); |
224 break; | 224 break; |
225 case UrlToken: | 225 case UrlToken: |
226 builder.append("url("); | 226 builder.append("url("); |
227 serializeIdentifier(value(), builder); | 227 serializeIdentifier(value().toString(), builder); |
228 return builder.append(")"); | 228 return builder.append(")"); |
229 case DelimiterToken: | 229 case DelimiterToken: |
230 if (delimiter() == '\\') | 230 if (delimiter() == '\\') |
231 return builder.append("\\\n"); | 231 return builder.append("\\\n"); |
232 return builder.append(delimiter()); | 232 return builder.append(delimiter()); |
233 case NumberToken: | 233 case NumberToken: |
234 // These won't properly preserve the NumericValueType flag | 234 // These won't properly preserve the NumericValueType flag |
235 return builder.appendNumber(numericValue()); | 235 return builder.appendNumber(numericValue()); |
236 case PercentageToken: | 236 case PercentageToken: |
237 builder.appendNumber(numericValue()); | 237 builder.appendNumber(numericValue()); |
238 return builder.append('%'); | 238 return builder.append('%'); |
239 case DimensionToken: | 239 case DimensionToken: |
240 // This will incorrectly serialize e.g. 4e3e2 as 4000e2 | 240 // This will incorrectly serialize e.g. 4e3e2 as 4000e2 |
241 builder.appendNumber(numericValue()); | 241 builder.appendNumber(numericValue()); |
242 serializeIdentifier(value(), builder); | 242 serializeIdentifier(value().toString(), builder); |
243 break; | 243 break; |
244 case UnicodeRangeToken: | 244 case UnicodeRangeToken: |
245 return builder.append(String::format("U+%X-%X", unicodeRangeStart(), uni
codeRangeEnd())); | 245 return builder.append(String::format("U+%X-%X", unicodeRangeStart(), uni
codeRangeEnd())); |
246 case StringToken: | 246 case StringToken: |
247 return serializeString(value(), builder); | 247 return serializeString(value().toString(), builder); |
248 | 248 |
249 case IncludeMatchToken: | 249 case IncludeMatchToken: |
250 return builder.append("~="); | 250 return builder.append("~="); |
251 case DashMatchToken: | 251 case DashMatchToken: |
252 return builder.append("|="); | 252 return builder.append("|="); |
253 case PrefixMatchToken: | 253 case PrefixMatchToken: |
254 return builder.append("^="); | 254 return builder.append("^="); |
255 case SuffixMatchToken: | 255 case SuffixMatchToken: |
256 return builder.append("$="); | 256 return builder.append("$="); |
257 case SubstringMatchToken: | 257 case SubstringMatchToken: |
(...skipping 30 matching lines...) Expand all Loading... |
288 return builder.append('}'); | 288 return builder.append('}'); |
289 | 289 |
290 case EOFToken: | 290 case EOFToken: |
291 case CommentToken: | 291 case CommentToken: |
292 ASSERT_NOT_REACHED(); | 292 ASSERT_NOT_REACHED(); |
293 return; | 293 return; |
294 } | 294 } |
295 } | 295 } |
296 | 296 |
297 } // namespace blink | 297 } // namespace blink |
OLD | NEW |