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