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

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

Issue 2310823002: Skeleton implementation of CSS Properties and Values API (Closed)
Patch Set: fix stylevardata copy ctor Created 4 years, 3 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/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 4a00f6156fe49356acf0347e8e3a529d59c0fc28..cee2426bda3e5a155e78144841cff46de775a2b8 100644
--- a/third_party/WebKit/Source/core/css/resolver/CSSVariableResolver.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/CSSVariableResolver.cpp
@@ -12,10 +12,12 @@
#include "core/css/CSSUnsetValue.h"
#include "core/css/CSSVariableData.h"
#include "core/css/CSSVariableReferenceValue.h"
+#include "core/css/PropertyRegistry.h"
#include "core/css/parser/CSSParserToken.h"
#include "core/css/parser/CSSParserTokenRange.h"
#include "core/css/parser/CSSPropertyParser.h"
#include "core/css/resolver/StyleBuilder.h"
+#include "core/css/resolver/StyleBuilderConverter.h"
#include "core/css/resolver/StyleResolverState.h"
#include "core/style/StyleVariableData.h"
#include "wtf/Vector.h"
@@ -33,6 +35,8 @@ bool CSSVariableResolver::resolveFallback(CSSParserTokenRange range, Vector<CSSP
CSSVariableData* CSSVariableResolver::valueForCustomProperty(AtomicString name)
{
+ // TODO(timloh): Registered properties shouldn't return nullptr in failure
+ // cases (aside from cycles?), but instead return the initial/inherited value.
if (m_variablesSeen.contains(name)) {
m_cycleStartPoints.add(name);
return nullptr;
@@ -46,6 +50,25 @@ CSSVariableData* CSSVariableResolver::valueForCustomProperty(AtomicString name)
if (!variableData->needsVariableResolution())
return variableData;
RefPtr<CSSVariableData> newVariableData = resolveCustomProperty(name, *variableData);
+
+ DCHECK(m_registry || !RuntimeEnabledFeatures::cssVariables2Enabled());
+ if (m_registry) {
+ const PropertyRegistry::Registration* registration = m_registry->registration(name);
+ if (registration) {
+ const CSSValue* parsedValue = nullptr;
+ if (newVariableData) {
+ parsedValue = newVariableData->parseForSyntax(registration->syntax());
+ if (parsedValue)
+ parsedValue = &StyleBuilderConverter::convertRegisteredPropertyValue(m_styleResolverState, *parsedValue);
+ else
+ newVariableData = nullptr;
+ }
+ m_styleVariableData->setVariable(name, newVariableData);
+ m_styleVariableData->setRegisteredInheritedProperty(name, parsedValue);
+ return newVariableData.get();
+ }
+ }
+
m_styleVariableData->setVariable(name, newVariableData);
return newVariableData.get();
}
@@ -134,7 +157,7 @@ const CSSValue* CSSVariableResolver::resolveVariableReferences(const StyleResolv
{
ASSERT(!isShorthandProperty(id));
- CSSVariableResolver resolver(state.style()->variables());
+ CSSVariableResolver resolver(state);
Vector<CSSParserToken> tokens;
if (!resolver.resolveTokenRange(value.variableDataValue()->tokens(), tokens))
return CSSUnsetValue::create();
@@ -155,7 +178,7 @@ const CSSValue* CSSVariableResolver::resolvePendingSubstitutions(StyleResolverSt
CSSVariableReferenceValue* shorthandValue = pendingValue.shorthandValue();
CSSPropertyID shorthandPropertyId = pendingValue.shorthandPropertyId();
- CSSVariableResolver resolver(state.style()->variables());
+ CSSVariableResolver resolver(state);
Vector<CSSParserToken> tokens;
if (resolver.resolveTokenRange(shorthandValue->variableDataValue()->tokens(), tokens)) {
@@ -180,21 +203,24 @@ const CSSValue* CSSVariableResolver::resolvePendingSubstitutions(StyleResolverSt
}
-void CSSVariableResolver::resolveVariableDefinitions(StyleVariableData* variables)
+void CSSVariableResolver::resolveVariableDefinitions(const StyleResolverState& state)
{
+ StyleVariableData* variables = state.style()->variables();
if (!variables)
return;
- CSSVariableResolver resolver(variables);
- for (auto& variable : variables->m_data) {
- if (variable.value && variable.value->needsVariableResolution())
- variable.value = resolver.resolveCustomProperty(variable.key, *variable.value);
- }
+ CSSVariableResolver resolver(state);
+ for (auto& variable : variables->m_data)
+ resolver.valueForCustomProperty(variable.key);
}
-CSSVariableResolver::CSSVariableResolver(StyleVariableData* styleVariableData)
- : m_styleVariableData(styleVariableData)
+CSSVariableResolver::CSSVariableResolver(const StyleResolverState& state)
+ : m_styleResolverState(state)
+ , m_styleVariableData(state.style()->variables())
+ , m_registry(state.document().propertyRegistry())
{
}
+DEFINE_TRACE(CSSVariableResolver) { visitor->trace(m_registry); }
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698