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/CSSSyntaxDescriptor.h" | 7 #include "core/css/CSSSyntaxDescriptor.h" |
8 #include "core/css/parser/CSSParser.h" | 8 #include "core/css/parser/CSSParser.h" |
9 #include "core/css/parser/CSSParserTokenRange.h" | 9 #include "core/css/parser/CSSParserTokenRange.h" |
10 #include "platform/wtf/text/StringBuilder.h" | 10 #include "platform/wtf/text/StringBuilder.h" |
11 #include "platform/wtf/text/StringView.h" | 11 #include "platform/wtf/text/StringView.h" |
12 | 12 |
13 namespace blink { | 13 namespace blink { |
14 | 14 |
15 StylePropertySet* CSSVariableData::PropertySet() { | 15 StylePropertySet* CSSVariableData::PropertySet() { |
16 DCHECK(!needs_variable_resolution_); | 16 DCHECK(!needs_variable_resolution_); |
17 if (!cached_property_set_) { | 17 if (!cached_property_set_) { |
18 property_set_ = CSSParser::ParseCustomPropertySet(tokens_); | 18 property_set_ = CSSParser::ParseCustomPropertySet(tokens_); |
19 cached_property_set_ = true; | 19 cached_property_set_ = true; |
20 } | 20 } |
21 return property_set_.Get(); | 21 return property_set_.Get(); |
22 } | 22 } |
23 | 23 |
24 template <typename CharacterType> | 24 template <typename CharacterType> |
25 void CSSVariableData::UpdateTokens(const CSSParserTokenRange& range) { | 25 static void UpdateTokens(const CSSParserTokenRange& range, |
| 26 const String& backing_string, |
| 27 Vector<CSSParserToken>& result) { |
26 const CharacterType* current_offset = | 28 const CharacterType* current_offset = |
27 backing_string_.GetCharacters<CharacterType>(); | 29 backing_string.GetCharacters<CharacterType>(); |
28 for (const CSSParserToken& token : range) { | 30 for (const CSSParserToken& token : range) { |
29 if (token.HasStringBacking()) { | 31 if (token.HasStringBacking()) { |
30 unsigned length = token.Value().length(); | 32 unsigned length = token.Value().length(); |
31 StringView string(current_offset, length); | 33 StringView string(current_offset, length); |
32 tokens_.push_back(token.CopyWithUpdatedString(string)); | 34 result.push_back(token.CopyWithUpdatedString(string)); |
33 current_offset += length; | 35 current_offset += length; |
34 } else { | 36 } else { |
35 tokens_.push_back(token); | 37 result.push_back(token); |
36 } | 38 } |
37 } | 39 } |
38 DCHECK(current_offset == backing_string_.GetCharacters<CharacterType>() + | 40 DCHECK(current_offset == backing_string.GetCharacters<CharacterType>() + |
39 backing_string_.length()); | 41 backing_string.length()); |
40 } | 42 } |
41 | 43 |
42 bool CSSVariableData::operator==(const CSSVariableData& other) const { | 44 bool CSSVariableData::operator==(const CSSVariableData& other) const { |
43 return Tokens() == other.Tokens(); | 45 return Tokens() == other.Tokens(); |
44 } | 46 } |
45 | 47 |
46 void CSSVariableData::ConsumeAndUpdateTokens(const CSSParserTokenRange& range) { | 48 void CSSVariableData::ConsumeAndUpdateTokens(const CSSParserTokenRange& range) { |
| 49 DCHECK_EQ(tokens_.size(), 0u); |
| 50 DCHECK_EQ(backing_strings_.size(), 0u); |
47 StringBuilder string_builder; | 51 StringBuilder string_builder; |
48 CSSParserTokenRange local_range = range; | 52 CSSParserTokenRange local_range = range; |
49 | 53 |
50 while (!local_range.AtEnd()) { | 54 while (!local_range.AtEnd()) { |
51 CSSParserToken token = local_range.Consume(); | 55 CSSParserToken token = local_range.Consume(); |
52 if (token.HasStringBacking()) | 56 if (token.HasStringBacking()) |
53 string_builder.Append(token.Value()); | 57 string_builder.Append(token.Value()); |
54 } | 58 } |
55 backing_string_ = string_builder.ToString(); | 59 String backing_string = string_builder.ToString(); |
56 if (backing_string_.Is8Bit()) | 60 backing_strings_.push_back(backing_string); |
57 UpdateTokens<LChar>(range); | 61 if (backing_string.Is8Bit()) |
| 62 UpdateTokens<LChar>(range, backing_string, tokens_); |
58 else | 63 else |
59 UpdateTokens<UChar>(range); | 64 UpdateTokens<UChar>(range, backing_string, tokens_); |
60 } | 65 } |
61 | 66 |
62 CSSVariableData::CSSVariableData(const CSSParserTokenRange& range, | 67 CSSVariableData::CSSVariableData(const CSSParserTokenRange& range, |
63 bool is_animation_tainted, | 68 bool is_animation_tainted, |
64 bool needs_variable_resolution) | 69 bool needs_variable_resolution) |
65 : is_animation_tainted_(is_animation_tainted), | 70 : is_animation_tainted_(is_animation_tainted), |
66 needs_variable_resolution_(needs_variable_resolution), | 71 needs_variable_resolution_(needs_variable_resolution), |
67 cached_property_set_(false) { | 72 cached_property_set_(false) { |
68 DCHECK(!range.AtEnd()); | 73 DCHECK(!range.AtEnd()); |
69 ConsumeAndUpdateTokens(range); | 74 ConsumeAndUpdateTokens(range); |
70 } | 75 } |
71 | 76 |
72 const CSSValue* CSSVariableData::ParseForSyntax( | 77 const CSSValue* CSSVariableData::ParseForSyntax( |
73 const CSSSyntaxDescriptor& syntax) const { | 78 const CSSSyntaxDescriptor& syntax) const { |
74 DCHECK(!NeedsVariableResolution()); | 79 DCHECK(!NeedsVariableResolution()); |
75 // TODO(timloh): This probably needs a proper parser context for | 80 // TODO(timloh): This probably needs a proper parser context for |
76 // relative URL resolution. | 81 // relative URL resolution. |
77 return syntax.Parse(TokenRange(), StrictCSSParserContext(), | 82 return syntax.Parse(TokenRange(), StrictCSSParserContext(), |
78 is_animation_tainted_); | 83 is_animation_tainted_); |
79 } | 84 } |
80 | 85 |
81 } // namespace blink | 86 } // namespace blink |
OLD | NEW |