From 7899850a19d288ff74844066050bfbb672ac1ca0 Mon Sep 17 00:00:00 2001 From: erixreyes Date: Sat, 19 Jul 2025 12:32:43 +0800 Subject: [PATCH] Issue #2489: color-mix function parsing --- layout/style/nsCSSParser.cpp | 56 ++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index 56fb2c39d3..d27763d03c 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -7444,6 +7444,62 @@ CSSParserImpl::ParseColor(nsCSSValue& aValue) } break; case eCSSToken_Function: { + // check for color-mix function + if (mToken.mIdent.LowerCaseEqualsLiteral("color-mix")) { + // parse color-mix function + RefPtr colorMix = new mozilla::css::ColorMixValue( + mozilla::css::ColorMixColorSpace::sRGB, nsCSSValue(), nsCSSValue()); + + if (!GetToken(true)) { + SkipUntil(')'); + return CSSParseResult::Error; + } + + if (mToken.mType != eCSSToken_Ident || !mToken.mIdent.LowerCaseEqualsLiteral("in")) { + SkipUntil(')'); + return CSSParseResult::Error; + } + + if (!GetToken(true) || mToken.mType != eCSSToken_Ident || !mToken.mIdent.LowerCaseEqualsLiteral("srgb")) { + SkipUntil(')'); + return CSSParseResult::Error; + } + + colorMix->mColorSpace = mozilla::css::ColorMixColorSpace::sRGB; + + if (!ExpectSymbol(',', true)) { + SkipUntil(')'); + return CSSParseResult::Error; + } + + nsCSSValue color1; + if (ParseColor(color1) != CSSParseResult::Ok) { + SkipUntil(')'); + return CSSParseResult::Error; + } + colorMix->mColor1 = color1; + + if (!ExpectSymbol(',', true)) { + SkipUntil(')'); + return CSSParseResult::Error; + } + + nsCSSValue color2; + if (ParseColor(color2) != CSSParseResult::Ok) { + SkipUntil(')'); + return CSSParseResult::Error; + } + colorMix->mColor2 = color2; + + if (!ExpectSymbol(')', true)) { + SkipUntil(')'); + return CSSParseResult::Error; + } + + aValue.SetColorMixValue(colorMix.forget()); + return CSSParseResult::Ok; + } + bool isRGB; bool isHSL; if ((isRGB = mToken.mIdent.LowerCaseEqualsLiteral("rgb")) ||