From 6a1027dce7bd293ad322022efcdb2dd89183fc16 Mon Sep 17 00:00:00 2001 From: Jason Finch Date: Fri, 27 Mar 2026 12:21:11 +1000 Subject: [PATCH] Fix !important declarations being overridden by non-important duplicates In SetLonghand, a later non-important declaration for the same property would unconditionally replace an earlier !important one. Now the existing declaration is preserved when it is !important and the incoming one is not. Fixes the issue where parsing style="padding: 20px !important; padding: 0" would incorrectly yield "padding: 0" instead of keeping the important value. --- .../Declarations/CssPaddingProperty.cs | 59 +++++++++++++++++++ .../Dom/Internal/CssStyleDeclaration.cs | 5 ++ 2 files changed, 64 insertions(+) diff --git a/src/AngleSharp.Css.Tests/Declarations/CssPaddingProperty.cs b/src/AngleSharp.Css.Tests/Declarations/CssPaddingProperty.cs index 70d7794d..2560c54c 100644 --- a/src/AngleSharp.Css.Tests/Declarations/CssPaddingProperty.cs +++ b/src/AngleSharp.Css.Tests/Declarations/CssPaddingProperty.cs @@ -1,5 +1,7 @@ namespace AngleSharp.Css.Tests.Declarations { + using AngleSharp.Css.Dom; + using AngleSharp.Dom; using NUnit.Framework; using static CssConstructionFunctions; @@ -139,5 +141,62 @@ public void CssPaddingShouldBeRecombinedCorrectly() var actual = result.CssText; Assert.AreEqual(expected, actual); } + + [Test] + public void CssPaddingImportantShouldNotBeOverriddenByNonImportant() + { + var snippet = "padding: 20px !important; font-size: 20px; padding: 0"; + var style = ParseDeclarations(snippet); + var padding = style.GetPropertyValue("padding"); + Assert.AreEqual("20px", padding); + var paddingProp = style.GetProperty("padding"); + Assert.IsNotNull(paddingProp); + Assert.IsTrue(paddingProp.IsImportant); + var fontSize = style.GetPropertyValue("font-size"); + Assert.AreEqual("20px", fontSize); + } + + [Test] + public void CssPaddingImportantShouldBeOverriddenByImportant() + { + var snippet = "padding: 20px !important; padding: 0 !important"; + var style = ParseDeclarations(snippet); + var padding = style.GetPropertyValue("padding"); + Assert.AreEqual("0", padding); + var paddingProp = style.GetProperty("padding"); + Assert.IsNotNull(paddingProp); + Assert.IsTrue(paddingProp.IsImportant); + } + + [Test] + public void CssPaddingNonImportantShouldBeOverriddenByNonImportant() + { + var snippet = "padding: 20px; padding: 0"; + var style = ParseDeclarations(snippet); + var padding = style.GetPropertyValue("padding"); + Assert.AreEqual("0", padding); + } + + [Test] + public void CssPaddingNonImportantShouldBeOverriddenByImportant() + { + var snippet = "padding: 20px; padding: 0 !important"; + var style = ParseDeclarations(snippet); + var padding = style.GetPropertyValue("padding"); + Assert.AreEqual("0", padding); + var paddingProp = style.GetProperty("padding"); + Assert.IsNotNull(paddingProp); + Assert.IsTrue(paddingProp.IsImportant); + } + + [Test] + public void CssInlineStyleImportantPaddingShouldTakePrecedence() + { + var html = "

Test

"; + var dom = ParseDocument(html); + var p = dom.QuerySelector("p"); + var style = p.GetStyle(); + Assert.AreEqual("padding: 20px !important; font-size: 20px", style.CssText); + } } } diff --git a/src/AngleSharp.Css/Dom/Internal/CssStyleDeclaration.cs b/src/AngleSharp.Css/Dom/Internal/CssStyleDeclaration.cs index 11f937ee..7661ac1e 100644 --- a/src/AngleSharp.Css/Dom/Internal/CssStyleDeclaration.cs +++ b/src/AngleSharp.Css/Dom/Internal/CssStyleDeclaration.cs @@ -424,6 +424,11 @@ private void SetLonghand(ICssProperty property) if (declaration.Name.Is(property.Name)) { + if (declaration.IsImportant && !property.IsImportant) + { + return; + } + _declarations[i] = property; return; }