OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 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 #include "config.h" |
| 6 #include "core/css/CSSVariableData.h" |
| 7 |
| 8 #include "core/css/parser/CSSParserTokenRange.h" |
| 9 |
| 10 namespace blink { |
| 11 |
| 12 template<typename CharacterType> void CSSVariableData::consumeAndUpdateTokens(co
nst CSSParserTokenRange& range) |
| 13 { |
| 14 CSSParserTokenRange localRange = range; |
| 15 String baseString = localRange.scope()->string(); |
| 16 const CharacterType* stringStart = baseString.getCharacters<CharacterType>()
; |
| 17 const CharacterType* stringEnd = stringStart + baseString.length(); |
| 18 |
| 19 const CharacterType* maxOffset = nullptr; |
| 20 const CharacterType* minOffset = nullptr; |
| 21 |
| 22 bool lastTokenWasExclamation = false; |
| 23 unsigned exclamationOffset = 0; |
| 24 |
| 25 while (!localRange.atEnd()) { |
| 26 CSSParserToken token = localRange.consume(); |
| 27 const CharacterType* tokenLocation = static_cast<const CharacterType*>(t
oken.m_valueDataCharRaw); |
| 28 if (tokenLocation > stringStart && tokenLocation < stringEnd) { |
| 29 if (!minOffset) |
| 30 minOffset = tokenLocation; |
| 31 maxOffset = tokenLocation + token.m_valueLength; |
| 32 } else { |
| 33 String escapedString(tokenLocation, token.m_valueLength); |
| 34 m_stringPool.append(escapedString); |
| 35 token.m_valueDataCharRaw = escapedString.getCharacters<CharacterType
>(); |
| 36 } |
| 37 if (token.type() == DelimiterToken && token.delimiter() == '!') { |
| 38 lastTokenWasExclamation = true; |
| 39 exclamationOffset = m_tokens.size(); |
| 40 } else if (lastTokenWasExclamation) { |
| 41 if (token.type() == IdentToken && token.valueEqualsIgnoringCase("imp
ortant")) { |
| 42 m_important = true; |
| 43 m_tokens.remove(exclamationOffset, m_tokens.size() - exclamation
Offset); |
| 44 lastTokenWasExclamation = false; |
| 45 continue; |
| 46 } |
| 47 if (token.type() != WhitespaceToken) |
| 48 lastTokenWasExclamation = false; |
| 49 } |
| 50 m_tokens.append(token); |
| 51 } |
| 52 if (minOffset) { |
| 53 m_string = String(minOffset, maxOffset - minOffset); |
| 54 const CharacterType* newStringStart = m_string.getCharacters<CharacterTy
pe>(); |
| 55 for (CSSParserToken& token : m_tokens) { |
| 56 const CharacterType* tokenLocation = static_cast<const CharacterType
*>(token.m_valueDataCharRaw); |
| 57 if (tokenLocation > stringStart && tokenLocation < stringEnd) |
| 58 token.m_valueDataCharRaw = newStringStart + (tokenLocation - min
Offset); |
| 59 } |
| 60 } |
| 61 } |
| 62 |
| 63 CSSVariableData::CSSVariableData(const CSSParserTokenRange& range, bool needsVar
iableResolution) |
| 64 : m_needsVariableResolution(needsVariableResolution) |
| 65 { |
| 66 if (range.scope()->string().is8Bit()) |
| 67 consumeAndUpdateTokens<LChar>(range); |
| 68 else |
| 69 consumeAndUpdateTokens<UChar>(range); |
| 70 } |
| 71 |
| 72 } // namespace blink |
OLD | NEW |