Skip to content

Commit 6a1027d

Browse files
committed
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.
1 parent 366abd1 commit 6a1027d

2 files changed

Lines changed: 64 additions & 0 deletions

File tree

src/AngleSharp.Css.Tests/Declarations/CssPaddingProperty.cs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
namespace AngleSharp.Css.Tests.Declarations
22
{
3+
using AngleSharp.Css.Dom;
4+
using AngleSharp.Dom;
35
using NUnit.Framework;
46
using static CssConstructionFunctions;
57

@@ -139,5 +141,62 @@ public void CssPaddingShouldBeRecombinedCorrectly()
139141
var actual = result.CssText;
140142
Assert.AreEqual(expected, actual);
141143
}
144+
145+
[Test]
146+
public void CssPaddingImportantShouldNotBeOverriddenByNonImportant()
147+
{
148+
var snippet = "padding: 20px !important; font-size: 20px; padding: 0";
149+
var style = ParseDeclarations(snippet);
150+
var padding = style.GetPropertyValue("padding");
151+
Assert.AreEqual("20px", padding);
152+
var paddingProp = style.GetProperty("padding");
153+
Assert.IsNotNull(paddingProp);
154+
Assert.IsTrue(paddingProp.IsImportant);
155+
var fontSize = style.GetPropertyValue("font-size");
156+
Assert.AreEqual("20px", fontSize);
157+
}
158+
159+
[Test]
160+
public void CssPaddingImportantShouldBeOverriddenByImportant()
161+
{
162+
var snippet = "padding: 20px !important; padding: 0 !important";
163+
var style = ParseDeclarations(snippet);
164+
var padding = style.GetPropertyValue("padding");
165+
Assert.AreEqual("0", padding);
166+
var paddingProp = style.GetProperty("padding");
167+
Assert.IsNotNull(paddingProp);
168+
Assert.IsTrue(paddingProp.IsImportant);
169+
}
170+
171+
[Test]
172+
public void CssPaddingNonImportantShouldBeOverriddenByNonImportant()
173+
{
174+
var snippet = "padding: 20px; padding: 0";
175+
var style = ParseDeclarations(snippet);
176+
var padding = style.GetPropertyValue("padding");
177+
Assert.AreEqual("0", padding);
178+
}
179+
180+
[Test]
181+
public void CssPaddingNonImportantShouldBeOverriddenByImportant()
182+
{
183+
var snippet = "padding: 20px; padding: 0 !important";
184+
var style = ParseDeclarations(snippet);
185+
var padding = style.GetPropertyValue("padding");
186+
Assert.AreEqual("0", padding);
187+
var paddingProp = style.GetProperty("padding");
188+
Assert.IsNotNull(paddingProp);
189+
Assert.IsTrue(paddingProp.IsImportant);
190+
}
191+
192+
[Test]
193+
public void CssInlineStyleImportantPaddingShouldTakePrecedence()
194+
{
195+
var html = "<p style=\"padding: 20px !important; font-size: 20px; padding: 0;\">Test</p>";
196+
var dom = ParseDocument(html);
197+
var p = dom.QuerySelector("p");
198+
var style = p.GetStyle();
199+
Assert.AreEqual("padding: 20px !important; font-size: 20px", style.CssText);
200+
}
142201
}
143202
}

src/AngleSharp.Css/Dom/Internal/CssStyleDeclaration.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,11 @@ private void SetLonghand(ICssProperty property)
424424

425425
if (declaration.Name.Is(property.Name))
426426
{
427+
if (declaration.IsImportant && !property.IsImportant)
428+
{
429+
return;
430+
}
431+
427432
_declarations[i] = property;
428433
return;
429434
}

0 commit comments

Comments
 (0)