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

Unified Diff: Source/core/css/parser/CSSParserImpl.cpp

Issue 1192983003: CSS Custom Properties (Variables) (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: ToT-ed again... Created 5 years, 5 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: Source/core/css/parser/CSSParserImpl.cpp
diff --git a/Source/core/css/parser/CSSParserImpl.cpp b/Source/core/css/parser/CSSParserImpl.cpp
index fd6f9a5b3447bb453287c9adda70a57d0e32e7ba..d1aa0b9cd9b53ed92c9a7080bfa949f7960b8226 100644
--- a/Source/core/css/parser/CSSParserImpl.cpp
+++ b/Source/core/css/parser/CSSParserImpl.cpp
@@ -5,6 +5,7 @@
#include "config.h"
#include "core/css/parser/CSSParserImpl.h"
+#include "core/css/CSSCustomVariableValue.h"
#include "core/css/CSSKeyframesRule.h"
#include "core/css/CSSStyleSheet.h"
#include "core/css/StylePropertySet.h"
@@ -19,6 +20,7 @@
#include "core/css/parser/CSSSelectorParser.h"
#include "core/css/parser/CSSSupportsParser.h"
#include "core/css/parser/CSSTokenizer.h"
+#include "core/css/parser/CSSVariableParser.h"
#include "core/css/parser/MediaQueryParser.h"
#include "core/dom/Document.h"
#include "core/dom/Element.h"
@@ -28,17 +30,18 @@
namespace blink {
-CSSParserImpl::CSSParserImpl(const CSSParserContext& context, StyleSheetContents* styleSheet)
+CSSParserImpl::CSSParserImpl(const CSSParserContext& context, const String& baseString, StyleSheetContents* styleSheet)
: m_context(context)
, m_defaultNamespace(starAtom)
, m_styleSheet(styleSheet)
, m_observerWrapper(nullptr)
+, m_baseString(baseString)
{
}
bool CSSParserImpl::parseValue(MutableStylePropertySet* declaration, CSSPropertyID unresolvedProperty, const String& string, bool important, const CSSParserContext& context)
{
- CSSParserImpl parser(context);
+ CSSParserImpl parser(context, string);
StyleRule::Type ruleType = StyleRule::Style;
if (declaration->cssParserMode() == CSSViewportRuleMode)
ruleType = StyleRule::Viewport;
@@ -57,7 +60,7 @@ static inline void filterProperties(bool important, const WillBeHeapVector<CSSPr
if (property.isImportant() != important)
continue;
const unsigned propertyIDIndex = property.id() - firstCSSProperty;
- if (seenProperties.get(propertyIDIndex))
+ if (seenProperties.get(propertyIDIndex) && property.id() != CSSPropertyVariable)
continue;
seenProperties.set(propertyIDIndex);
output[--unusedEntries] = property;
@@ -84,7 +87,7 @@ PassRefPtrWillBeRawPtr<ImmutableStylePropertySet> CSSParserImpl::parseInlineStyl
CSSParserContext context = CSSParserContext(document.elementSheet().contents()->parserContext(), UseCounter::getFrom(&document));
CSSParserMode mode = element->isHTMLElement() && !document.inQuirksMode() ? HTMLStandardMode : HTMLQuirksMode;
context.setMode(mode);
- CSSParserImpl parser(context, document.elementSheet().contents());
+ CSSParserImpl parser(context, string, document.elementSheet().contents());
CSSTokenizer::Scope scope(string);
parser.consumeDeclarationList(scope.tokenRange(), StyleRule::Style);
return createStylePropertySet(parser.m_parsedProperties, mode);
@@ -92,7 +95,7 @@ PassRefPtrWillBeRawPtr<ImmutableStylePropertySet> CSSParserImpl::parseInlineStyl
bool CSSParserImpl::parseDeclarationList(MutableStylePropertySet* declaration, const String& string, const CSSParserContext& context)
{
- CSSParserImpl parser(context);
+ CSSParserImpl parser(context, string);
StyleRule::Type ruleType = StyleRule::Style;
if (declaration->cssParserMode() == CSSViewportRuleMode)
ruleType = StyleRule::Viewport;
@@ -113,7 +116,7 @@ bool CSSParserImpl::parseDeclarationList(MutableStylePropertySet* declaration, c
PassRefPtrWillBeRawPtr<StyleRuleBase> CSSParserImpl::parseRule(const String& string, const CSSParserContext& context, StyleSheetContents* styleSheet, AllowedRulesType allowedRules)
{
- CSSParserImpl parser(context, styleSheet);
+ CSSParserImpl parser(context, string, styleSheet);
CSSTokenizer::Scope scope(string);
CSSParserTokenRange range = scope.tokenRange();
range.consumeWhitespace();
@@ -144,7 +147,7 @@ void CSSParserImpl::parseStyleSheet(const String& string, const CSSParserContext
TRACE_EVENT_END0("blink,blink_style", "CSSParserImpl::parseStyleSheet.tokenize");
TRACE_EVENT_BEGIN0("blink,blink_style", "CSSParserImpl::parseStyleSheet.parse");
- CSSParserImpl parser(context, styleSheet);
+ CSSParserImpl parser(context, string, styleSheet);
bool firstRuleValid = parser.consumeRuleList(scope.tokenRange(), TopLevelRuleList, [&styleSheet](PassRefPtrWillBeRawPtr<StyleRuleBase> rule) {
if (rule->isCharsetRule())
return;
@@ -175,7 +178,7 @@ bool CSSParserImpl::supportsDeclaration(CSSParserTokenRange& range)
void CSSParserImpl::parseDeclarationListForInspector(const String& declaration, const CSSParserContext& context, CSSParserObserver& observer)
{
- CSSParserImpl parser(context);
+ CSSParserImpl parser(context, declaration);
CSSParserObserverWrapper wrapper(observer);
parser.m_observerWrapper = &wrapper;
CSSTokenizer::Scope scope(declaration, wrapper);
@@ -186,7 +189,7 @@ void CSSParserImpl::parseDeclarationListForInspector(const String& declaration,
void CSSParserImpl::parseStyleSheetForInspector(const String& string, const CSSParserContext& context, StyleSheetContents* styleSheet, CSSParserObserver& observer)
{
- CSSParserImpl parser(context, styleSheet);
+ CSSParserImpl parser(context, string, styleSheet);
CSSParserObserverWrapper wrapper(observer);
parser.m_observerWrapper = &wrapper;
CSSTokenizer::Scope scope(string, wrapper);
@@ -668,7 +671,8 @@ void CSSParserImpl::consumeDeclaration(CSSParserTokenRange range, StyleRule::Typ
CSSParserTokenRange rangeCopy = range; // For inspector callbacks
ASSERT(range.peek().type() == IdentToken);
- CSSPropertyID unresolvedProperty = range.consumeIncludingWhitespace().parseAsUnresolvedCSSPropertyID();
+ CSSParserToken token = range.consumeIncludingWhitespace();
+ CSSPropertyID unresolvedProperty = token.parseAsUnresolvedCSSPropertyID();
if (range.consume().type() != ColonToken)
return; // Parse error
@@ -677,6 +681,14 @@ void CSSParserImpl::consumeDeclaration(CSSParserTokenRange range, StyleRule::Typ
const CSSParserToken* last = range.end() - 1;
while (last->type() == WhitespaceToken)
--last;
+
+ if (unresolvedProperty == CSSPropertyVariable) {
+ ASSERT(RuntimeEnabledFeatures::cssVariablesEnabled());
+ AtomicString variableName = token.value();
+ m_styleSheet->parserSetUsesVariables(true);
+ consumeVariableDeclarationValue(range.makeSubRange(&range.peek(), declarationValueEnd), variableName);
+ return;
+ }
if (last->type() == IdentToken && last->valueEqualsIgnoringCase("important")) {
--last;
while (last->type() == WhitespaceToken)
@@ -697,6 +709,7 @@ void CSSParserImpl::consumeDeclaration(CSSParserTokenRange range, StyleRule::Typ
m_observerWrapper->observer().observeProperty(
m_observerWrapper->startOffset(rangeCopy), m_observerWrapper->endOffset(rangeCopy),
important, m_parsedProperties.size() != propertiesCount);
+ consumeDeclarationValue(range.makeSubRange(&range.peek(), declarationValueEnd), unresolvedProperty, important, ruleType);
Timothy Loh 2015/07/23 08:11:46 What's this line for?
return;
}
@@ -706,14 +719,47 @@ void CSSParserImpl::consumeDeclaration(CSSParserTokenRange range, StyleRule::Typ
consumeDeclarationValue(range.makeSubRange(&range.peek(), declarationValueEnd), unresolvedProperty, important, ruleType);
}
+void CSSParserImpl::consumeVariableDeclarationValue(CSSParserTokenRange range, const AtomicString& variableName)
+{
+ bool important;
+ switch (CSSVariableParser::parseVariableDefinition(range, important)) {
+ case CSSVariableParser::Invalid:
+ return;
+ case CSSVariableParser::Variable:
+ m_parsedProperties.append(CSSProperty(CSSPropertyVariable,
+ CSSCustomVariableValue::create(variableName, CSSVariableData::create(range, m_baseString, false)), important));
+ return;
+ case CSSVariableParser::VariableWithReferences:
+ m_parsedProperties.append(CSSProperty(CSSPropertyVariable,
+ CSSCustomVariableValue::create(variableName, CSSVariableData::create(range, m_baseString, true)), important));
+ return;
+ case CSSVariableParser::Initial:
+ m_parsedProperties.append(CSSProperty(CSSPropertyVariable,
+ CSSCustomVariableValue::create(variableName, CSSValueInitial), important));
+ return;
+ case CSSVariableParser::Inherit:
+ m_parsedProperties.append(CSSProperty(CSSPropertyVariable,
+ CSSCustomVariableValue::create(variableName, CSSValueInherit), important));
+ return;
+ case CSSVariableParser::Unset:
+ m_parsedProperties.append(CSSProperty(CSSPropertyVariable,
+ CSSCustomVariableValue::create(variableName, CSSValueUnset), important));
+ return;
+ }
+}
+
void CSSParserImpl::consumeDeclarationValue(CSSParserTokenRange range, CSSPropertyID unresolvedProperty, bool important, StyleRule::Type ruleType)
{
- bool usesRemUnits;
- CSSParserValueList valueList(range, usesRemUnits);
+ bool usesRemUnits, usesVariables;
+ CSSParserValueList valueList(range, m_baseString, usesRemUnits, usesVariables);
if (!valueList.size())
return; // Parser error
- if (usesRemUnits && m_styleSheet)
- m_styleSheet->parserSetUsesRemUnits(true);
+ if (m_styleSheet) {
+ if (usesRemUnits)
+ m_styleSheet->parserSetUsesRemUnits(true);
+ if (usesVariables)
+ m_styleSheet->parserSetUsesVariables(true);
+ }
CSSPropertyParser::parseValue(unresolvedProperty, important, &valueList, m_context, m_parsedProperties, ruleType);
}

Powered by Google App Engine
This is Rietveld 408576698