--- a/layout/style/nsCSSParser.cpp
+++ b/layout/style/nsCSSParser.cpp
@@ -239,16 +239,18 @@ public:
nsIURI* aURL,
uint32_t aLineNumber);
bool ParseKeyframeSelectorString(const nsSubstring& aSelectorString,
nsIURI* aURL, // for error reporting
uint32_t aLineNumber, // for error reporting
InfallibleTArray<float>& aSelectorList);
+ bool SupportsVariableDeclaration(const nsAString& aProperty, bool aExpectEOF);
+
bool EvaluateSupportsDeclaration(const nsAString& aProperty,
const nsAString& aValue,
nsIURI* aDocURL,
nsIURI* aBaseURL,
nsIPrincipal* aDocPrincipal);
bool EvaluateSupportsCondition(const nsAString& aCondition,
nsIURI* aDocURL,
@@ -2375,16 +2377,47 @@ CSSParserImpl::ParseKeyframeSelectorStri
} else {
aSelectorList.Clear();
}
return success;
}
bool
+CSSParserImpl::SupportsVariableDeclaration(const nsAString& aProperty,
+ bool aExpectEOF)
+{
+ MOZ_ASSERT(Substring(aProperty, 0, CSS_CUSTOM_NAME_PREFIX_LENGTH)
+ .EqualsLiteral("--"));
+
+ const CSSVariableRegistrations* registrations = GetVariableRegistrations();
+ const nsDependentSubstring varName =
+ Substring(aProperty, CSS_CUSTOM_NAME_PREFIX_LENGTH);
+
+ bool ok = false;
+
+ CSSVariableRegistration* registration;
+ if (registrations && registrations->mData.Get(varName, ®istration)) {
+ nsCSSValue value;
+ mozilla::CSSValueType type;
+ ok = ParseTypedValue(registration->mSyntax,
+ /* aAllowVariableReferences = */ true,
+ value, type);
+ } else {
+ CSSVariableDeclarations::Type variableType;
+ nsString variableValue;
+ ok = ParseVariableDeclaration(&variableType, true, variableValue);
+ }
+
+ return ok && (aExpectEOF
+ ? !GetToken(true)
+ : ParsePriority() != ePriority_Error);
+}
+
+bool
CSSParserImpl::EvaluateSupportsDeclaration(const nsAString& aProperty,
const nsAString& aValue,
nsIURI* aDocURL,
nsIURI* aBaseURL,
nsIPrincipal* aDocPrincipal)
{
nsCSSPropertyID propID = LookupEnabledProperty(aProperty);
if (propID == eCSSProperty_UNKNOWN) {
@@ -2394,24 +2427,17 @@ CSSParserImpl::EvaluateSupportsDeclarati
nsCSSScanner scanner(aValue, 0);
css::ErrorReporter reporter(scanner, mSheet, mChildLoader, aDocURL);
InitScanner(scanner, reporter, aDocURL, aBaseURL, aDocPrincipal);
nsAutoSuppressErrors suppressErrors(this);
bool parsedOK;
if (propID == eCSSPropertyExtra_variable) {
- MOZ_ASSERT(Substring(aProperty, 0,
- CSS_CUSTOM_NAME_PREFIX_LENGTH).EqualsLiteral("--"));
- const nsDependentSubstring varName =
- Substring(aProperty, CSS_CUSTOM_NAME_PREFIX_LENGTH); // remove '--'
- CSSVariableDeclarations::Type variableType;
- nsString variableValue;
- parsedOK = ParseVariableDeclaration(&variableType, true, variableValue) &&
- !GetToken(true);
+ parsedOK = SupportsVariableDeclaration(aProperty, true);
} else {
parsedOK = ParseProperty(propID) && !GetToken(true);
mTempData.ClearProperty(propID);
mTempData.AssertInitialState();
}
CLEAR_ERROR();
@@ -4896,21 +4922,19 @@ CSSParserImpl::ParseSupportsConditionInP
aConditionMet = false;
SkipUntil(')');
UngetToken();
} else if (propID == eCSSPropertyExtra_variable) {
if (ExpectSymbol(')', false)) {
UngetToken();
return false;
}
- CSSVariableDeclarations::Type variableType;
- nsString variableValue;
- aConditionMet =
- ParseVariableDeclaration(&variableType, true, variableValue) &&
- ParsePriority() != ePriority_Error;
+
+ aConditionMet = SupportsVariableDeclaration(propertyName, false);
+
if (!aConditionMet) {
SkipUntil(')');
UngetToken();
}
} else {
if (ExpectSymbol(')', true)) {
UngetToken();
return false;