Skip to content

Commit 6ab7166

Browse files
committed
WIP
1 parent 49b4877 commit 6ab7166

File tree

8 files changed

+84
-30
lines changed

8 files changed

+84
-30
lines changed

src/AngleSharp.Css.Tests/Rules/CssMediaList.cs

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace AngleSharp.Css.Tests.Rules
1+
namespace AngleSharp.Css.Tests.Rules
22
{
33
using AngleSharp.Css.Dom;
44
using NUnit.Framework;
@@ -187,7 +187,7 @@ public void NoMediaQueryGivenSkip()
187187
Assert.AreEqual(1, sheet.Rules.Length);
188188
Assert.AreEqual(CssRuleType.Media, sheet.Rules[0].Type);
189189
var media = sheet.Rules[0] as ICssMediaRule;
190-
Assert.AreEqual("not all", media.ConditionText);
190+
Assert.AreEqual("", media.ConditionText);
191191
Assert.AreEqual(1, media.Rules.Length);
192192
}
193193

@@ -393,5 +393,53 @@ public void CssMediaListApiWithAppendDeleteAndTextShouldWork()
393393
Assert.AreEqual(media[2], list[1]);
394394
Assert.AreEqual(String.Concat(media[0], ", ", media[2]), list.MediaText);
395395
}
396+
397+
[Test]
398+
public void ReplacesInvalidPartsCommaWithNotAll()
399+
{
400+
var source = @"@media (example, all,), speech {
401+
h1 { color: green }
402+
}";
403+
var sheet = ParseStyleSheet(source);
404+
Assert.AreEqual(1, sheet.Rules.Length);
405+
Assert.IsInstanceOf<CssMediaRule>(sheet.Rules[0]);
406+
var media = (CssMediaRule)sheet.Rules[0];
407+
Assert.AreEqual("not all, speech", media.Media.MediaText);
408+
var list = media.Media;
409+
Assert.AreEqual(2, list.Length);
410+
Assert.AreEqual(1, media.Rules.Length);
411+
}
412+
413+
[Test]
414+
public void ReplacesInvalidPartsAmpersandWithNotAll()
415+
{
416+
var source = @"@media test&, speech {
417+
h1 { color: green }
418+
}";
419+
var sheet = ParseStyleSheet(source);
420+
Assert.AreEqual(1, sheet.Rules.Length);
421+
Assert.IsInstanceOf<CssMediaRule>(sheet.Rules[0]);
422+
var media = (CssMediaRule)sheet.Rules[0];
423+
Assert.AreEqual("not all, speech", media.Media.MediaText);
424+
var list = media.Media;
425+
Assert.AreEqual(2, list.Length);
426+
Assert.AreEqual(1, media.Rules.Length);
427+
}
428+
429+
[Test]
430+
public void ReplacesUnclosedParansWithNotAll()
431+
{
432+
var source = @"@media (example, speech {
433+
h1 { color: green }
434+
}";
435+
var sheet = ParseStyleSheet(source);
436+
Assert.AreEqual(1, sheet.Rules.Length);
437+
Assert.IsInstanceOf<CssMediaRule>(sheet.Rules[0]);
438+
var media = (CssMediaRule)sheet.Rules[0];
439+
Assert.AreEqual("not all", media.Media.MediaText);
440+
var list = media.Media;
441+
Assert.AreEqual(1, list.Length);
442+
Assert.AreEqual(1, media.Rules.Length);
443+
}
396444
}
397445
}

src/AngleSharp.Css.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<copyright>Copyright 2016-2023, AngleSharp</copyright>
1616
<tags>html html5 css css3 dom styling library anglesharp angle</tags>
1717
<dependencies>
18-
<dependency id="AngleSharp" version="[0.17.0,0.18.0)" />
18+
<dependency id="AngleSharp" version="[1.0.0,2.0.0)" />
1919
</dependencies>
2020
</metadata>
2121
</package>

src/AngleSharp.Css/AngleSharp.Css.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
</ItemGroup>
2222

2323
<ItemGroup>
24-
<PackageReference Include="AngleSharp" Version="0.17.0" />
24+
<PackageReference Include="AngleSharp" Version="1.0.0" />
2525
</ItemGroup>
2626

2727
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">

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

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ namespace AngleSharp.Css.Dom
66
using System.Collections;
77
using System.Collections.Generic;
88
using System.IO;
9+
using System.Linq;
10+
using System.Text;
911

1012
/// <summary>
1113
/// Represents a list of media elements.
@@ -17,6 +19,8 @@ sealed class MediaList : IMediaList
1719
private readonly IBrowsingContext _context;
1820
private readonly List<ICssMedium> _media;
1921

22+
private static readonly CssMedium replacementMedium = new CssMedium(CssKeywords.All, inverse: true, exclusive: false);
23+
2024
#endregion
2125

2226
#region ctor
@@ -56,22 +60,15 @@ public String MediaText
5660
public void SetMediaText(String value, Boolean throwOnError)
5761
{
5862
_media.Clear();
59-
var v = String.IsNullOrEmpty(value) ? CssKeywords.All : value;
60-
var media = MediaParser.Parse(v, ValidatorFactory);
63+
var v = String.IsNullOrEmpty(value) ? String.Empty : value;
64+
var media = MediaParser.Parse(v, ValidatorFactory) ?? Enumerable.Repeat<CssMedium>(null, 1);
6165

62-
if (media != null)
63-
{
64-
_media.AddRange(media);
65-
}
66-
else if (throwOnError)
66+
if (throwOnError && media.Contains(null))
6767
{
6868
throw new DomException(DomError.Syntax);
6969
}
7070

71-
if (_media.Count == 0)
72-
{
73-
_media.Add(new CssMedium(CssKeywords.All, inverse: true, exclusive: false));
74-
}
71+
_media.AddRange(media.Select(m => m ?? replacementMedium));
7572
}
7673

7774
public void Add(String newMedium)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ public String Slot
5353

5454
public ITokenList ClassList => _host.ClassList;
5555

56+
public String GivenNamespaceUri => _host.GivenNamespaceUri;
57+
5658
public String ClassName
5759
{
5860
get => _host.ClassName;

src/AngleSharp.Css/Parser/Micro/MediaParser.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,7 @@ public static IEnumerable<CssMedium> ParseMedia(this StringSource source, IFeatu
3737
source.SkipCurrentAndSpaces();
3838
}
3939

40-
var medium = source.ParseMedium(factory);
41-
42-
if (medium == null)
43-
{
44-
return null;
45-
}
46-
47-
media.Add(medium);
40+
media.Add(source.ParseMedium(factory));
4841
current = source.SkipSpacesAndComments();
4942
}
5043

src/AngleSharp.Css/Parser/Micro/MediumParser.cs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ internal static CssMedium Parse(String str, IFeatureValidatorFactory factory)
2323
public static CssMedium ParseMedium(this StringSource source, IFeatureValidatorFactory factory)
2424
{
2525
source.SkipSpacesAndComments();
26-
var ident = source.ParseIdent();
26+
var ident = source.ParseMediumIdent();
2727
var inverse = false;
2828
var exclusive = false;
2929
var type = String.Empty;
@@ -34,13 +34,13 @@ public static CssMedium ParseMedium(this StringSource source, IFeatureValidatorF
3434
{
3535
inverse = true;
3636
source.SkipSpacesAndComments();
37-
ident = source.ParseIdent();
37+
ident = source.ParseMediumIdent();
3838
}
3939
else if (ident.Isi(CssKeywords.Only))
4040
{
4141
exclusive = true;
4242
source.SkipSpacesAndComments();
43-
ident = source.ParseIdent();
43+
ident = source.ParseMediumIdent();
4444
}
4545
}
4646

@@ -49,7 +49,7 @@ public static CssMedium ParseMedium(this StringSource source, IFeatureValidatorF
4949
type = ident;
5050
source.SkipSpacesAndComments();
5151
var position = source.Index;
52-
ident = source.ParseIdent();
52+
ident = source.ParseMediumIdent();
5353

5454
if (ident == null || !ident.Isi(CssKeywords.And))
5555
{
@@ -81,7 +81,7 @@ public static CssMedium ParseMedium(this StringSource source, IFeatureValidatorF
8181
features.Add(feature);
8282
source.SkipCurrentAndSpaces();
8383
var position = source.Index;
84-
ident = source.ParseIdent();
84+
ident = source.ParseMediumIdent();
8585

8686
if (ident == null || !ident.Isi(CssKeywords.And))
8787
{
@@ -96,9 +96,23 @@ public static CssMedium ParseMedium(this StringSource source, IFeatureValidatorF
9696
return new CssMedium(type, inverse, exclusive, features);
9797
}
9898

99+
private static String ParseMediumIdent(this StringSource source)
100+
{
101+
var ident = source.ParseIdent();
102+
var current = source.Current;
103+
104+
while (current == '&' || current == '#' || current == ';' || current == '-')
105+
{
106+
ident = null;
107+
current = source.Next();
108+
}
109+
110+
return ident;
111+
}
112+
99113
private static IMediaFeature ParseFeature(StringSource source)
100114
{
101-
var name = source.ParseIdent();
115+
var name = source.ParseMediumIdent();
102116
var value = default(String);
103117

104118
if (name != null)

src/AngleSharp.Performance.Css/AngleSharp.Performance.Css.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
<ItemGroup>
2323
<PackageReference Include="Alba.CsCss" version="1.0.1.0" />
24-
<PackageReference Include="AngleSharp" Version="0.17.0" />
24+
<PackageReference Include="AngleSharp" Version="1.0.0" />
2525
<PackageReference Include="ExCSS" version="2.0.6" />
2626
</ItemGroup>
2727
</Project>

0 commit comments

Comments
 (0)