OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 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/CSSVariableData.h" | 5 #include "core/css/CSSVariableData.h" |
6 | 6 |
7 #include "core/css/parser/CSSParser.h" | 7 #include "core/css/parser/CSSParser.h" |
8 #include "core/css/parser/CSSParserTokenRange.h" | 8 #include "core/css/parser/CSSParserTokenRange.h" |
9 #include "wtf/text/StringBuilder.h" | 9 #include "wtf/text/StringBuilder.h" |
| 10 #include "wtf/text/StringView.h" |
10 | 11 |
11 namespace blink { | 12 namespace blink { |
12 | 13 |
13 StylePropertySet* CSSVariableData::propertySet() | 14 StylePropertySet* CSSVariableData::propertySet() |
14 { | 15 { |
15 ASSERT(!m_needsVariableResolution); | 16 ASSERT(!m_needsVariableResolution); |
16 if (!m_cachedPropertySet) { | 17 if (!m_cachedPropertySet) { |
17 m_propertySet = CSSParser::parseCustomPropertySet(m_tokens); | 18 m_propertySet = CSSParser::parseCustomPropertySet(m_tokens); |
18 m_cachedPropertySet = true; | 19 m_cachedPropertySet = true; |
19 } | 20 } |
20 return m_propertySet.get(); | 21 return m_propertySet.get(); |
21 } | 22 } |
22 | 23 |
23 template<typename CharacterType> void CSSVariableData::updateTokens(const CSSPar
serTokenRange& range) | 24 template<typename CharacterType> void CSSVariableData::updateTokens(const CSSPar
serTokenRange& range) |
24 { | 25 { |
25 const CharacterType* currentOffset = m_backingString.getCharacters<Character
Type>(); | 26 const CharacterType* currentOffset = m_backingString.getCharacters<Character
Type>(); |
26 for (const CSSParserToken& token : range) { | 27 for (const CSSParserToken& token : range) { |
27 if (token.hasStringBacking()) { | 28 if (token.hasStringBacking()) { |
28 unsigned length = token.value().length(); | 29 unsigned length = token.value().length(); |
29 CSSParserString parserString; | 30 StringView string(currentOffset, length); |
30 parserString.init(currentOffset, length); | 31 m_tokens.append(token.copyWithUpdatedString(string)); |
31 m_tokens.append(token.copyWithUpdatedString(parserString)); | |
32 currentOffset += length; | 32 currentOffset += length; |
33 } else { | 33 } else { |
34 m_tokens.append(token); | 34 m_tokens.append(token); |
35 } | 35 } |
36 } | 36 } |
37 ASSERT(currentOffset == m_backingString.getCharacters<CharacterType>() + m_b
ackingString.length()); | 37 ASSERT(currentOffset == m_backingString.getCharacters<CharacterType>() + m_b
ackingString.length()); |
38 } | 38 } |
39 | 39 |
40 bool CSSVariableData::operator==(const CSSVariableData& other) const | 40 bool CSSVariableData::operator==(const CSSVariableData& other) const |
41 { | 41 { |
42 return tokens() == other.tokens(); | 42 return tokens() == other.tokens(); |
43 } | 43 } |
44 | 44 |
45 void CSSVariableData::consumeAndUpdateTokens(const CSSParserTokenRange& range) | 45 void CSSVariableData::consumeAndUpdateTokens(const CSSParserTokenRange& range) |
46 { | 46 { |
47 StringBuilder stringBuilder; | 47 StringBuilder stringBuilder; |
48 CSSParserTokenRange localRange = range; | 48 CSSParserTokenRange localRange = range; |
49 | 49 |
50 while (!localRange.atEnd()) { | 50 while (!localRange.atEnd()) { |
51 CSSParserToken token = localRange.consume(); | 51 CSSParserToken token = localRange.consume(); |
52 if (token.hasStringBacking()) { | 52 if (token.hasStringBacking()) |
53 CSSParserString value = token.value(); | 53 stringBuilder.append(token.value()); |
54 if (value.is8Bit()) | |
55 stringBuilder.append(value.characters8(), value.length()); | |
56 else | |
57 stringBuilder.append(value.characters16(), value.length()); | |
58 } | |
59 } | 54 } |
60 m_backingString = stringBuilder.toString(); | 55 m_backingString = stringBuilder.toString(); |
61 if (m_backingString.is8Bit()) | 56 if (m_backingString.is8Bit()) |
62 updateTokens<LChar>(range); | 57 updateTokens<LChar>(range); |
63 else | 58 else |
64 updateTokens<UChar>(range); | 59 updateTokens<UChar>(range); |
65 } | 60 } |
66 | 61 |
67 CSSVariableData::CSSVariableData(const CSSParserTokenRange& range, bool needsVar
iableResolution) | 62 CSSVariableData::CSSVariableData(const CSSParserTokenRange& range, bool needsVar
iableResolution) |
68 : m_needsVariableResolution(needsVariableResolution) | 63 : m_needsVariableResolution(needsVariableResolution) |
69 , m_cachedPropertySet(false) | 64 , m_cachedPropertySet(false) |
70 { | 65 { |
71 ASSERT(!range.atEnd()); | 66 ASSERT(!range.atEnd()); |
72 consumeAndUpdateTokens(range); | 67 consumeAndUpdateTokens(range); |
73 } | 68 } |
74 | 69 |
75 } // namespace blink | 70 } // namespace blink |
OLD | NEW |