Index: third_party/WebKit/Source/core/css/resolver/CSSVariableResolver.cpp |
diff --git a/third_party/WebKit/Source/core/css/resolver/CSSVariableResolver.cpp b/third_party/WebKit/Source/core/css/resolver/CSSVariableResolver.cpp |
index 8b5e6824eddfb07be9af8585fee4ff737b1cc1ac..a33b5723a3a890aed41304a79099bc2eab247146 100644 |
--- a/third_party/WebKit/Source/core/css/resolver/CSSVariableResolver.cpp |
+++ b/third_party/WebKit/Source/core/css/resolver/CSSVariableResolver.cpp |
@@ -27,16 +27,18 @@ |
namespace blink { |
-bool CSSVariableResolver::ResolveFallback(CSSParserTokenRange range, |
- bool disallow_animation_tainted, |
- Vector<CSSParserToken>& result, |
- bool& result_is_animation_tainted) { |
+bool CSSVariableResolver::ResolveFallback( |
+ CSSParserTokenRange range, |
+ bool disallow_animation_tainted, |
+ Vector<CSSParserToken>& result, |
+ Vector<String>& result_backing_strings, |
+ bool& result_is_animation_tainted) { |
if (range.AtEnd()) |
return false; |
DCHECK_EQ(range.Peek().GetType(), kCommaToken); |
range.Consume(); |
return ResolveTokenRange(range, disallow_animation_tainted, result, |
- result_is_animation_tainted); |
+ result_backing_strings, result_is_animation_tainted); |
} |
CSSVariableData* CSSVariableResolver::ValueForCustomProperty( |
@@ -96,22 +98,19 @@ PassRefPtr<CSSVariableData> CSSVariableResolver::ResolveCustomProperty( |
bool disallow_animation_tainted = false; |
bool is_animation_tainted = variable_data.IsAnimationTainted(); |
Vector<CSSParserToken> tokens; |
+ Vector<String> backing_strings; |
+ backing_strings.AppendVector(variable_data.BackingStrings()); |
variables_seen_.insert(name); |
bool success = |
ResolveTokenRange(variable_data.Tokens(), disallow_animation_tainted, |
- tokens, is_animation_tainted); |
+ tokens, backing_strings, is_animation_tainted); |
variables_seen_.erase(name); |
- // The old variable data holds onto the backing string the new resolved |
- // CSSVariableData relies on. Ensure it will live beyond us overwriting the |
- // RefPtr in StyleInheritedVariables. |
- DCHECK_GT(variable_data.RefCount(), 1); |
- |
if (!success || !cycle_start_points_.IsEmpty()) { |
cycle_start_points_.erase(name); |
return nullptr; |
} |
- return CSSVariableData::CreateResolved(tokens, variable_data, |
+ return CSSVariableData::CreateResolved(tokens, std::move(backing_strings), |
is_animation_tainted); |
} |
@@ -119,6 +118,7 @@ bool CSSVariableResolver::ResolveVariableReference( |
CSSParserTokenRange range, |
bool disallow_animation_tainted, |
Vector<CSSParserToken>& result, |
+ Vector<String>& result_backing_strings, |
bool& result_is_animation_tainted) { |
range.ConsumeWhitespace(); |
DCHECK_EQ(range.Peek().GetType(), kIdentToken); |
@@ -132,21 +132,26 @@ bool CSSVariableResolver::ResolveVariableReference( |
// TODO(alancutter): Append the registered initial custom property value if |
// we are disallowing an animation tainted value. |
return ResolveFallback(range, disallow_animation_tainted, result, |
- result_is_animation_tainted); |
+ result_backing_strings, result_is_animation_tainted); |
} |
result.AppendVector(variable_data->Tokens()); |
+ // TODO(alancutter): Avoid adding backing strings multiple times in a row. |
+ result_backing_strings.AppendVector(variable_data->BackingStrings()); |
result_is_animation_tainted |= variable_data->IsAnimationTainted(); |
Vector<CSSParserToken> trash; |
+ Vector<String> trash_backing_strings; |
bool trash_is_animation_tainted; |
ResolveFallback(range, disallow_animation_tainted, trash, |
- trash_is_animation_tainted); |
+ trash_backing_strings, trash_is_animation_tainted); |
return true; |
} |
-void CSSVariableResolver::ResolveApplyAtRule(CSSParserTokenRange& range, |
- Vector<CSSParserToken>& result) { |
+void CSSVariableResolver::ResolveApplyAtRule( |
+ CSSParserTokenRange& range, |
+ Vector<CSSParserToken>& result, |
+ Vector<String>& result_backing_strings) { |
DCHECK(range.Peek().GetType() == kAtKeywordToken && |
EqualIgnoringASCIICase(range.Peek().Value(), "apply")); |
range.ConsumeIncludingWhitespace(); |
@@ -170,22 +175,25 @@ void CSSVariableResolver::ResolveApplyAtRule(CSSParserTokenRange& range, |
return; |
result.AppendRange(rule_contents.begin(), rule_contents.end()); |
+ result_backing_strings.AppendVector(variable_data->BackingStrings()); |
} |
-bool CSSVariableResolver::ResolveTokenRange(CSSParserTokenRange range, |
- bool disallow_animation_tainted, |
- Vector<CSSParserToken>& result, |
- bool& result_is_animation_tainted) { |
+bool CSSVariableResolver::ResolveTokenRange( |
+ CSSParserTokenRange range, |
+ bool disallow_animation_tainted, |
+ Vector<CSSParserToken>& result, |
+ Vector<String>& result_backing_strings, |
+ bool& result_is_animation_tainted) { |
bool success = true; |
while (!range.AtEnd()) { |
if (range.Peek().FunctionId() == CSSValueVar) { |
- success &= ResolveVariableReference(range.ConsumeBlock(), |
- disallow_animation_tainted, result, |
- result_is_animation_tainted); |
+ success &= ResolveVariableReference( |
+ range.ConsumeBlock(), disallow_animation_tainted, result, |
+ result_backing_strings, result_is_animation_tainted); |
} else if (range.Peek().GetType() == kAtKeywordToken && |
EqualIgnoringASCIICase(range.Peek().Value(), "apply") && |
RuntimeEnabledFeatures::cssApplyAtRulesEnabled()) { |
- ResolveApplyAtRule(range, result); |
+ ResolveApplyAtRule(range, result, result_backing_strings); |
} else { |
result.push_back(range.Consume()); |
} |
@@ -223,10 +231,11 @@ const CSSValue* CSSVariableResolver::ResolveVariableReferences( |
bool disallow_animation_tainted) { |
CSSVariableResolver resolver(state); |
Vector<CSSParserToken> tokens; |
+ Vector<String> backing_strings; |
bool is_animation_tainted = false; |
if (!resolver.ResolveTokenRange(value.VariableDataValue()->Tokens(), |
disallow_animation_tainted, tokens, |
- is_animation_tainted)) |
+ backing_strings, is_animation_tainted)) |
return CSSUnsetValue::Create(); |
const CSSValue* result = |
CSSPropertyParser::ParseSingleValue(id, tokens, value.ParserContext()); |
@@ -254,11 +263,12 @@ const CSSValue* CSSVariableResolver::ResolvePendingSubstitutions( |
CSSVariableResolver resolver(state); |
Vector<CSSParserToken> tokens; |
+ Vector<String> backing_strings; |
bool is_animation_tainted = false; |
if (resolver.ResolveTokenRange( |
shorthand_value->VariableDataValue()->Tokens(), |
- disallow_animation_tainted, tokens, is_animation_tainted)) { |
- |
+ disallow_animation_tainted, tokens, backing_strings, |
+ is_animation_tainted)) { |
HeapVector<CSSProperty, 256> parsed_properties; |
if (CSSPropertyParser::ParseValue( |