From f4ffb1ec1620677ed88bcf5b48fc1eda1aaafdc2 Mon Sep 17 00:00:00 2001 From: erixreyes Date: Sat, 5 Jul 2025 05:39:25 +0800 Subject: [PATCH] Issue #2124 - Adjust overflow parser to handle two values --- layout/style/nsCSSParser.cpp | 46 ++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index e8078eaf9d..e1b01a4543 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -15847,25 +15847,41 @@ CSSParserImpl::ParseOutline() bool CSSParserImpl::ParseOverflow() { - nsCSSValue overflow; - if (!ParseSingleTokenVariant(overflow, VARIANT_HK, - nsCSSProps::kOverflowKTable)) { + nsCSSValue overflowX, overflowY; + // Parse the first value + if (!ParseSingleTokenVariant(overflowX, VARIANT_HK, nsCSSProps::kOverflowKTable)) { return false; } - nsCSSValue overflowX(overflow); - nsCSSValue overflowY(overflow); - if (eCSSUnit_Enumerated == overflow.GetUnit()) - switch(overflow.GetIntValue()) { - case NS_STYLE_OVERFLOW_SCROLLBARS_HORIZONTAL: - overflowX.SetIntValue(NS_STYLE_OVERFLOW_SCROLL, eCSSUnit_Enumerated); - overflowY.SetIntValue(NS_STYLE_OVERFLOW_HIDDEN, eCSSUnit_Enumerated); - break; - case NS_STYLE_OVERFLOW_SCROLLBARS_VERTICAL: - overflowX.SetIntValue(NS_STYLE_OVERFLOW_HIDDEN, eCSSUnit_Enumerated); - overflowY.SetIntValue(NS_STYLE_OVERFLOW_SCROLL, eCSSUnit_Enumerated); - break; + // Try to parse a second value (optional) + bool haveSecond = ParseSingleTokenVariant(overflowY, VARIANT_HK, nsCSSProps::kOverflowKTable); + if (!haveSecond) { + overflowY = overflowX; + } + + // Handle legacy scrollbars keywords for each axis + auto fix_legacy = [](nsCSSValue& v, bool isX) { + if (v.GetUnit() == eCSSUnit_Enumerated) { + switch (v.GetIntValue()) { + case NS_STYLE_OVERFLOW_SCROLLBARS_HORIZONTAL: + if (isX) { + v.SetIntValue(NS_STYLE_OVERFLOW_SCROLL, eCSSUnit_Enumerated); + } else { + v.SetIntValue(NS_STYLE_OVERFLOW_HIDDEN, eCSSUnit_Enumerated); + } + break; + case NS_STYLE_OVERFLOW_SCROLLBARS_VERTICAL: + if (isX) { + v.SetIntValue(NS_STYLE_OVERFLOW_HIDDEN, eCSSUnit_Enumerated); + } else { + v.SetIntValue(NS_STYLE_OVERFLOW_SCROLL, eCSSUnit_Enumerated); + } + break; + } } + }; + fix_legacy(overflowX, true); + fix_legacy(overflowY, false); AppendValue(eCSSProperty_overflow_x, overflowX); AppendValue(eCSSProperty_overflow_y, overflowY); return true;