diff --git a/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs b/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs index 87b5e323..7d366d01 100644 --- a/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs +++ b/src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs @@ -527,6 +527,139 @@ public void CssGridAreaSingleValueLegal() Assert.AreEqual("2 / auto / auto / auto", property.Value); } + [Test] + public void CssGridAreaTextValueLegal1() + { + var source = "#nav-header {grid-area: aaa; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: aaa / aaa / aaa / aaa }"; + Assert.AreEqual(expected, text); + } + + + [Test] + public void CssGridAreaTextValueLegal2() + { + var source = "#nav-header {grid-area: aaa / bbb; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: aaa / bbb / aaa / bbb }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaTextValueLegal3() + { + var source = "#nav-header {grid-area: 1 / 2; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: 1 / 2 / auto / auto }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaTextValueLegal4() + { + var source = "#nav-header {grid-area: aaa / 2; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: aaa / 2 / aaa / auto }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaTextValueLegal5() + { + var source = "#nav-header {grid-area: aaa / bbb / ccc; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: aaa / bbb / ccc / bbb }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaTextValueLegal6() + { + var source = "#nav-header {grid-area: aaa / bbb / ccc; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: aaa / bbb / ccc / bbb }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaTextValueLegal7() + { + var source = "#nav-header {grid-area: 1; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: 1 / auto / auto / auto }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaTextValueLegal8() + { + var source = "#nav-header {grid-area: 2 / aaa; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: 2 / aaa / auto / aaa }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaTextValueIllegal1() + { + var source = "#nav-header {grid-area: 2a / 3%; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaTextValueIllegal2() + { + var source = "#nav-header {grid-area: 2a; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaTextValueTrim1() + { + var source = "#nav-header {grid-area: 9999999; }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: 10000 / auto / auto / auto }"; + Assert.AreEqual(expected, text); + } + + [Test] + public void CssGridAreaTextValueTrim2() + { + var source = "#nav-header {grid-area: 9999999 / 8888888 }"; + var css = ParseStyleSheet(source); + var text = css.Rules[0].CssText; + + var expected = "#nav-header { grid-area: 10000 / 10000 / auto / auto }"; + Assert.AreEqual(expected, text); + } + [Test] public void CssGridAutoFlowAndRepeatLegal() { diff --git a/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs b/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs index eca5c752..59b875b7 100644 --- a/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs +++ b/src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs @@ -2,6 +2,7 @@ namespace AngleSharp.Css.Declarations { using AngleSharp.Css.Converters; using AngleSharp.Css.Dom; + using AngleSharp.Css.Parser; using AngleSharp.Css.Values; using AngleSharp.Text; using System; @@ -9,6 +10,8 @@ namespace AngleSharp.Css.Declarations static class GridAreaDeclaration { + private const int MaximumGridSize = 10000; + public static readonly String Name = PropertyNames.GridArea; public static readonly String[] Longhands = new[] @@ -42,7 +45,7 @@ public ICssValue[] Split(ICssValue value) { return new[] { - tuple.Items[0], + GetItem(tuple, 0), GetItem(tuple, 1), GetItem(tuple, 2), GetItem(tuple, 3), @@ -56,21 +59,45 @@ private static ICssValue GetItem(CssTupleValue tuple, Int32 index) { if (tuple.Items.Length > index) { + if (int.TryParse(tuple.Items[index].CssText, out int value)) + { + if (value > MaximumGridSize) + { + return new Constant(MaximumGridSize.ToString(), null); + } + } return tuple.Items[index]; } - return GetItemSimple(tuple, index / 2); + return GetItemSimple(tuple, index); } private static ICssValue GetItemSimple(CssTupleValue tuple, Int32 index) { - if (tuple.Items.Length > index) + var val = UnitParser.ParseUnit(new StringSource(tuple.Items[0].CssText)); + if (index <= 2) { - var nested = tuple.Items[index] as CssTupleValue; - - if (nested != null && nested.Items.Length == 3 && nested.Items[0] == null && nested.Items[1] == null) + if (tuple.Items.Length <= index) + { + + if (!int.TryParse(tuple.Items[0].CssText, out int _)) + { + return tuple.Items[0]; + } + } + } + else if (index == 3) + { + if (tuple.Items.Length > 1) + { + if (!int.TryParse(tuple.Items[1].CssText, out int _)) + { + return tuple.Items[1]; + } + } + else if (!int.TryParse(tuple.Items[0].CssText, out int _)) { - return nested.Items[2]; + return tuple.Items[0]; } }