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

Unified Diff: third_party/WebKit/Source/core/css/parser/CSSParserImpl.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, 10 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
index b20276bc7eb9d07bb82c8f1c47831f4795250f26..aadb57ef5750a22a4e7efc319bb3b6875907e9a7 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
@@ -4,6 +4,7 @@
#include "core/css/parser/CSSParserImpl.h"
+#include "core/css/CSSCustomIdentValue.h"
#include "core/css/CSSCustomPropertyDeclaration.h"
#include "core/css/CSSKeyframesRule.h"
#include "core/css/CSSStyleSheet.h"
@@ -75,6 +76,8 @@ static inline void filterProperties(bool important, const WillBeHeapVector<CSSPr
if (seenCustomProperties.contains(name))
continue;
seenCustomProperties.add(name);
+ } else if (property.id() == CSSPropertyApplyAtRule) {
+ // TODO(timloh): Do we need to do anything here?
} else {
if (seenProperties.get(propertyIDIndex))
continue;
@@ -224,6 +227,28 @@ CSSSelectorList CSSParserImpl::parsePageSelector(CSSParserTokenRange range, Styl
return selectorList;
}
+PassRefPtrWillBeRawPtr<ImmutableStylePropertySet> CSSParserImpl::parseCustomPropertySet(CSSParserTokenRange range)
+{
+ range.consumeWhitespace();
+ if (range.peek().type() != LeftBraceToken)
+ return nullptr;
+ CSSParserTokenRange block = range.consumeBlock();
+ range.consumeWhitespace();
+ if (!range.atEnd())
+ return nullptr;
+ CSSParserImpl parser(strictCSSParserContext());
+ parser.consumeDeclarationList(block, StyleRule::Style);
+
+ // Drop nested @apply rules. Seems nicer to do this here instead of making
+ // a different StyleRule type
+ for (size_t i = parser.m_parsedProperties.size(); i--; ) {
+ if (parser.m_parsedProperties[i].id() == CSSPropertyApplyAtRule)
+ parser.m_parsedProperties.remove(i);
+ }
+
+ return createStylePropertySet(parser.m_parsedProperties, HTMLStandardMode);
+}
+
PassOwnPtr<Vector<double>> CSSParserImpl::parseKeyframeKeyList(const String& keyList)
{
return consumeKeyframeKeyList(CSSTokenizer::Scope(keyList).tokenRange());
@@ -349,14 +374,18 @@ PassRefPtrWillBeRawPtr<StyleRuleBase> CSSParserImpl::consumeAtRule(CSSParserToke
return consumeImportRule(prelude);
if (allowedRules <= AllowNamespaceRules && id == CSSAtRuleNamespace)
return consumeNamespaceRule(prelude);
+ if (allowedRules == ApplyRules && id == CSSAtRuleApply) {
+ consumeApplyRule(prelude);
+ return nullptr; // consumeApplyRule just updates m_parsedProperties
+ }
return nullptr; // Parse error, unrecognised at-rule without block
}
CSSParserTokenRange block = range.consumeBlock();
if (allowedRules == KeyframeRules)
return nullptr; // Parse error, no at-rules supported inside @keyframes
- if (allowedRules == NoRules)
- return nullptr; // Parse error, no at-rules supported inside declaration lists
+ if (allowedRules == NoRules || allowedRules == ApplyRules)
+ return nullptr; // Parse error, no at-rules with blocks supported inside declaration lists
ASSERT(allowedRules <= RegularRules);
@@ -602,6 +631,19 @@ PassRefPtrWillBeRawPtr<StyleRulePage> CSSParserImpl::consumePageRule(CSSParserTo
return StyleRulePage::create(std::move(selectorList), createStylePropertySet(m_parsedProperties, m_context.mode()));
}
+void CSSParserImpl::consumeApplyRule(CSSParserTokenRange prelude)
+{
+ ASSERT(RuntimeEnabledFeatures::cssApplyAtRulesEnabled());
+
+ prelude.consumeWhitespace();
+ const CSSParserToken& ident = prelude.consumeIncludingWhitespace();
+ if (!prelude.atEnd() || !CSSVariableParser::isValidVariableName(ident))
+ return; // Parse error, expected a single custom property name
+ m_parsedProperties.append(CSSProperty(
+ CSSPropertyApplyAtRule,
+ CSSCustomIdentValue::create(ident.value())));
+}
+
PassRefPtrWillBeRawPtr<StyleRuleKeyframe> CSSParserImpl::consumeKeyframeStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
{
OwnPtr<Vector<double>> keyList = consumeKeyframeKeyList(prelude);
@@ -684,7 +726,8 @@ void CSSParserImpl::consumeDeclarationList(CSSParserTokenRange range, StyleRule:
break;
}
case AtKeywordToken: {
- RefPtrWillBeRawPtr<StyleRuleBase> rule = consumeAtRule(range, NoRules);
+ AllowedRulesType allowedRules = ruleType == StyleRule::Style && RuntimeEnabledFeatures::cssApplyAtRulesEnabled() ? ApplyRules : NoRules;
+ RefPtrWillBeRawPtr<StyleRuleBase> rule = consumeAtRule(range, allowedRules);
ASSERT_UNUSED(rule, !rule);
break;
}

Powered by Google App Engine
This is Rietveld 408576698