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