Skip to content

Commit

Permalink
Fixed invalid selector handling AngleSharp#98
Browse files Browse the repository at this point in the history
  • Loading branch information
FlorianRappl committed Jan 5, 2022
1 parent 60b4a59 commit 8b8482a
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 4 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
Released on Wednesday, January 5 2022.

- Fixed issue with `text-shadow` missing the color part (#97)
- Fixed support for `IsToleratingInvalidSelectors` parser option (#98)
- Added `Color.UseHex` to change color output format (#96)

# 0.16.2
Expand Down
33 changes: 33 additions & 0 deletions src/AngleSharp.Css.Tests/Parsing/PseudoElements.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
namespace AngleSharp.Css.Tests.Parsing
{
using AngleSharp.Css.Dom;
using AngleSharp.Css.Parser;
using AngleSharp.Html.Parser;
using NUnit.Framework;
using System.Linq;

[TestFixture]
public class PseudoElements
{
[Test]
public void VendorPrefixedPseudoElementShouldBeAvailable_Issue98()
{
var html = @"<html><head><style>
p::-webkit-scrollbar-thumb {
background: #888
}
</style></head><body><p>test</p></body></html>";
var parser = new HtmlParser(new HtmlParserOptions(), BrowsingContext.New(new Configuration().WithCss(new CssParserOptions
{
IsIncludingUnknownDeclarations = true,
IsIncludingUnknownRules = true,
IsToleratingInvalidSelectors = true,
})));
var document = parser.ParseDocument(html);
var stylesheet = document.StyleSheets.OfType<ICssStyleSheet>().First();
var rule = stylesheet.Rules.OfType<ICssStyleRule>().First();
var selectorText = rule.SelectorText;
Assert.AreEqual("p::-webkit-scrollbar-thumb", selectorText);
}
}
}
2 changes: 1 addition & 1 deletion src/AngleSharp.Css.Tests/Styling/CssCases.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ private static ICssStyleSheet ParseSheet(String text)
{
IsIncludingUnknownDeclarations = true,
IsIncludingUnknownRules = true,
IsToleratingInvalidSelectors = true
IsToleratingInvalidSelectors = false,
});
}

Expand Down
2 changes: 1 addition & 1 deletion src/AngleSharp.Css/Dom/Internal/Rules/CssPageRule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ internal CssPageRule(ICssStyleSheet owner)
public String SelectorText
{
get => _selector?.Text;
set { _selector = ParseSelector(value); ; }
set { _selector = ParseSelector(value); }
}

public ISelector Selector => _selector;
Expand Down
33 changes: 32 additions & 1 deletion src/AngleSharp.Css/Dom/Internal/Rules/CssStyleRule.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
namespace AngleSharp.Css.Dom
{
using AngleSharp.Css;
using AngleSharp.Dom;
using System;
using System.Diagnostics;
using System.IO;
Expand Down Expand Up @@ -45,6 +47,11 @@ public String SelectorText

#region Methods

internal void SetInvalidSelector(String selectorText)
{
_selector = new InvalidSelector(selectorText);
}

protected override void ReplaceWith(ICssRule rule)
{
var newRule = (ICssStyleRule)rule;
Expand All @@ -59,5 +66,29 @@ public override void ToCss(TextWriter writer, IStyleFormatter formatter)
}

#endregion
}

#region Selector

class InvalidSelector : ISelector
{
private readonly String _text;

public InvalidSelector(String text)
{
_text = text;
}

public String Text => _text;

public Priority Specificity => Priority.Zero;

public void Accept(ISelectorVisitor visitor)
{
}

public Boolean Match(IElement element, IElement scope) => false;
}

#endregion
}
}
9 changes: 8 additions & 1 deletion src/AngleSharp.Css/Parser/CssBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,14 @@ private CssSupportsRule CreateSupports(CssSupportsRule rule, CssToken current)
public CssStyleRule CreateStyle(CssStyleRule rule, CssToken current)
{
CollectTrivia(ref current);
rule.SelectorText = GetArgument(ref current);
var selectorText = GetArgument(ref current);

rule.SelectorText = selectorText;

if (rule.Selector is null && _options.IsToleratingInvalidSelectors)
{
rule.SetInvalidSelector(selectorText);
}

if (current.Type != CssTokenType.CurlyBracketOpen)
{
Expand Down

0 comments on commit 8b8482a

Please sign in to comment.