Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Side by Side Diff: third_party/WebKit/Source/core/css/CSSVariableData.cpp

Issue 2901213005: Ensure string data is kept alive as long as there are CSSVariableData tokens pointing to it (Closed)
Patch Set: comment Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698