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 |