Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 133 additions & 0 deletions src/AngleSharp.Css.Tests/Declarations/CssGridProperty.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
{
Expand Down
41 changes: 34 additions & 7 deletions src/AngleSharp.Css/Declarations/GridAreaDeclaration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@ 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;
using static ValueConverters;

static class GridAreaDeclaration
{
private const int MaximumGridSize = 10000;

public static readonly String Name = PropertyNames.GridArea;

public static readonly String[] Longhands = new[]
Expand Down Expand Up @@ -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),
Expand All @@ -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<Object>(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];
}
}

Expand Down