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

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

Issue 1645433002: Basic implementation of @apply (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix expted.txt for failing test Created 4 years, 9 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/resolver/CSSVariableResolver.h" 5 #include "core/css/resolver/CSSVariableResolver.h"
6 6
7 #include "core/CSSPropertyNames.h" 7 #include "core/CSSPropertyNames.h"
8 #include "core/CSSValueKeywords.h" 8 #include "core/CSSValueKeywords.h"
9 #include "core/StyleBuilderFunctions.h" 9 #include "core/StyleBuilderFunctions.h"
10 #include "core/StylePropertyShorthand.h" 10 #include "core/StylePropertyShorthand.h"
11 #include "core/css/CSSValuePool.h" 11 #include "core/css/CSSValuePool.h"
12 #include "core/css/CSSVariableData.h" 12 #include "core/css/CSSVariableData.h"
13 #include "core/css/CSSVariableReferenceValue.h" 13 #include "core/css/CSSVariableReferenceValue.h"
14 #include "core/css/parser/CSSParserToken.h" 14 #include "core/css/parser/CSSParserToken.h"
15 #include "core/css/parser/CSSParserTokenRange.h" 15 #include "core/css/parser/CSSParserTokenRange.h"
16 #include "core/css/parser/CSSParserValues.h" 16 #include "core/css/parser/CSSParserValues.h"
17 #include "core/css/parser/CSSPropertyParser.h" 17 #include "core/css/parser/CSSPropertyParser.h"
18 #include "core/css/parser/CSSVariableParser.h"
18 #include "core/css/resolver/StyleBuilder.h" 19 #include "core/css/resolver/StyleBuilder.h"
19 #include "core/css/resolver/StyleResolverState.h" 20 #include "core/css/resolver/StyleResolverState.h"
20 #include "core/style/StyleVariableData.h" 21 #include "core/style/StyleVariableData.h"
21 #include "wtf/Vector.h" 22 #include "wtf/Vector.h"
22 23
23 namespace blink { 24 namespace blink {
24 25
25 bool CSSVariableResolver::resolveFallback(CSSParserTokenRange range, Vector<CSSP arserToken>& result) 26 bool CSSVariableResolver::resolveFallback(CSSParserTokenRange range, Vector<CSSP arserToken>& result)
26 { 27 {
27 if (range.atEnd()) 28 if (range.atEnd())
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 CSSVariableData* variableData = valueForCustomProperty(variableName); 81 CSSVariableData* variableData = valueForCustomProperty(variableName);
81 if (!variableData) 82 if (!variableData)
82 return resolveFallback(range, result); 83 return resolveFallback(range, result);
83 84
84 result.appendVector(variableData->tokens()); 85 result.appendVector(variableData->tokens());
85 Vector<CSSParserToken> trash; 86 Vector<CSSParserToken> trash;
86 resolveFallback(range, trash); 87 resolveFallback(range, trash);
87 return true; 88 return true;
88 } 89 }
89 90
91 void CSSVariableResolver::resolveApplyAtRule(CSSParserTokenRange& range,
92 Vector<CSSParserToken>& result)
93 {
94 ASSERT(range.peek().type() == AtKeywordToken && range.peek().valueEqualsIgno ringASCIICase("apply"));
95 CSSParserTokenRange originalRange = range;
96
97 range.consumeIncludingWhitespace();
98 const CSSParserToken& variableName = range.consumeIncludingWhitespace();
99 if (!CSSVariableParser::isValidVariableName(variableName)
100 || !(range.atEnd() || range.peek().type() == SemicolonToken || range.pee k().type() == RightBraceToken)) {
101 range = originalRange;
102 result.append(range.consume());
103 return;
104 }
105 if (range.peek().type() == SemicolonToken)
106 range.consume();
107
108 CSSVariableData* variableData = valueForCustomProperty(variableName.value()) ;
109 if (!variableData)
110 return; // Invalid custom property
111
112 CSSParserTokenRange rule = variableData->tokenRange();
113 rule.consumeWhitespace();
114 if (rule.peek().type() != LeftBraceToken)
115 return;
116 CSSParserTokenRange ruleContents = rule.consumeBlock();
117 rule.consumeWhitespace();
118 if (!rule.atEnd())
119 return;
120
121 result.appendRange(ruleContents.begin(), ruleContents.end());
122 }
123
90 bool CSSVariableResolver::resolveTokenRange(CSSParserTokenRange range, 124 bool CSSVariableResolver::resolveTokenRange(CSSParserTokenRange range,
91 Vector<CSSParserToken>& result) 125 Vector<CSSParserToken>& result)
92 { 126 {
93 bool success = true; 127 bool success = true;
94 while (!range.atEnd()) { 128 while (!range.atEnd()) {
95 if (range.peek().functionId() == CSSValueVar) { 129 if (range.peek().functionId() == CSSValueVar) {
96 success &= resolveVariableReference(range.consumeBlock(), result); 130 success &= resolveVariableReference(range.consumeBlock(), result);
131 } else if (range.peek().type() == AtKeywordToken && range.peek().valueEq ualsIgnoringASCIICase("apply")
132 && RuntimeEnabledFeatures::cssApplyAtRulesEnabled()) {
133 resolveApplyAtRule(range, result);
97 } else { 134 } else {
98 result.append(range.consume()); 135 result.append(range.consume());
99 } 136 }
100 } 137 }
101 return success; 138 return success;
102 } 139 }
103 140
104 PassRefPtrWillBeRawPtr<CSSValue> CSSVariableResolver::resolveVariableReferences( StyleVariableData* styleVariableData, CSSPropertyID id, const CSSVariableReferen ceValue& value) 141 PassRefPtrWillBeRawPtr<CSSValue> CSSVariableResolver::resolveVariableReferences( StyleVariableData* styleVariableData, CSSPropertyID id, const CSSVariableReferen ceValue& value)
105 { 142 {
106 ASSERT(!isShorthandProperty(id)); 143 ASSERT(!isShorthandProperty(id));
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 variable.value = resolver.resolveCustomProperty(variable.key, *varia ble.value); 196 variable.value = resolver.resolveCustomProperty(variable.key, *varia ble.value);
160 } 197 }
161 } 198 }
162 199
163 CSSVariableResolver::CSSVariableResolver(StyleVariableData* styleVariableData) 200 CSSVariableResolver::CSSVariableResolver(StyleVariableData* styleVariableData)
164 : m_styleVariableData(styleVariableData) 201 : m_styleVariableData(styleVariableData)
165 { 202 {
166 } 203 }
167 204
168 } // namespace blink 205 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698