Skip to content

Commit cffec67

Browse files
committed
Added checks for invalid render dimensions
1 parent 7898ccf commit cffec67

File tree

2 files changed

+56
-4
lines changed

2 files changed

+56
-4
lines changed

src/AngleSharp.Css.Tests/Values/UnitConversion.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System;
2+
13
namespace AngleSharp.Css.Tests.Values
24
{
35
using AngleSharp.Css.Values;
@@ -37,6 +39,24 @@ public void LengthParseCorrectVwValue()
3739
Assert.AreEqual(Length.Unit.Vw, v.Type);
3840
}
3941

42+
[Test]
43+
public void LengthToPixelsPercentThrowsOnInvalidRenderDimensions()
44+
{
45+
var l = new Length(50, Length.Unit.Percent);
46+
var renderDevice = new DefaultRenderDevice();
47+
Assert.Throws<ArgumentException>(() => l.ToPixel(renderDevice));
48+
Assert.Throws<ArgumentException>(() => l.ToPixel(null));
49+
}
50+
51+
[Test]
52+
public void LengthToPixelsEmThrowsOnInvalidRenderDimensions()
53+
{
54+
var l = new Length(50, Length.Unit.Em);
55+
var renderDevice = new DefaultRenderDevice();
56+
Assert.Throws<ArgumentException>(() => l.ToPixel(renderDevice));
57+
Assert.Throws<ArgumentException>(() => l.ToPixel(null));
58+
}
59+
4060
[Test]
4161
public void LengthToPixelsCorrectPercentWidth()
4262
{

src/AngleSharp.Css/Values/Primitives/Length.cs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -292,24 +292,32 @@ public Double ToPixel(IRenderDimensions renderDimensions, Boolean isWidth = true
292292
case Unit.Px: // 1 px = 1/96 in
293293
return _value;
294294
case Unit.Percent:
295+
CheckForValidRenderDimensions(renderDimensions, isWidth);
295296
return _value * 0.01 * (isWidth ? renderDimensions.RenderWidth : renderDimensions.RenderHeight);
296297
case Unit.Em:
298+
CheckForValidRenderDimensionsForFont(renderDimensions);
297299
return _value * renderDimensions.FontSize;
298300
case Unit.Rem:
299301
// here we dont actually know the root font size but currently the only IRenderDimensions used is
300302
// the IRenderDevice meaning its all the root font size
303+
CheckForValidRenderDimensionsForFont(renderDimensions);
301304
return _value * renderDimensions.FontSize;
302305
case Unit.Vh:
306+
CheckForValidRenderDimensions(renderDimensions, false);
303307
return _value * 0.01 * renderDimensions.RenderHeight;
304308
case Unit.Vw:
309+
CheckForValidRenderDimensions(renderDimensions, true);
305310
return _value * 0.01 * renderDimensions.RenderWidth;
306311
case Unit.Vmax:
312+
CheckForValidRenderDimensions(renderDimensions, true);
313+
CheckForValidRenderDimensions(renderDimensions, false);
307314
return _value * 0.01 * Math.Max(renderDimensions.RenderHeight, renderDimensions.RenderWidth);
308315
case Unit.Vmin:
316+
CheckForValidRenderDimensions(renderDimensions, true);
317+
CheckForValidRenderDimensions(renderDimensions, false);
309318
return _value * 0.01 * Math.Min(renderDimensions.RenderHeight, renderDimensions.RenderWidth);
310-
//todo implement other units and handle if dimensions is null
311319
default:
312-
throw new InvalidOperationException("A relative unit cannot be converted.");
320+
throw new InvalidOperationException("Unsupported Unit cant be converted.");
313321
}
314322
}
315323

@@ -340,24 +348,48 @@ public Double To(Unit unit, IRenderDimensions renderDimensions, Boolean isWidth
340348
case Unit.Px: // 1 px = 1/96 in
341349
return value;
342350
case Unit.Percent:
351+
CheckForValidRenderDimensions(renderDimensions, isWidth);
343352
return value / (isWidth ? renderDimensions.RenderWidth : renderDimensions.RenderHeight) * 100;
344353
case Unit.Em:
354+
CheckForValidRenderDimensionsForFont(renderDimensions);
345355
return value / renderDimensions.FontSize;
346356
case Unit.Rem:
347357
// here we dont actually know the root font size but currently the only IRenderDimensions used is
348358
// the IRenderDevice meaning its all the root font size
359+
CheckForValidRenderDimensionsForFont(renderDimensions);
349360
return value / renderDimensions.FontSize;
350361
case Unit.Vh:
362+
CheckForValidRenderDimensions(renderDimensions, false);
351363
return value / (0.01 * renderDimensions.RenderHeight);
352364
case Unit.Vw:
365+
CheckForValidRenderDimensions(renderDimensions, true);
353366
return value / ( 0.01 * renderDimensions.RenderWidth);
354367
case Unit.Vmax:
368+
CheckForValidRenderDimensions(renderDimensions, true);
369+
CheckForValidRenderDimensions(renderDimensions, false);
355370
return value / ( 0.01 * Math.Max(renderDimensions.RenderHeight, renderDimensions.RenderWidth));
356371
case Unit.Vmin:
372+
CheckForValidRenderDimensions(renderDimensions, true);
373+
CheckForValidRenderDimensions(renderDimensions, false);
357374
return value / ( 0.01 * Math.Min(renderDimensions.RenderHeight, renderDimensions.RenderWidth));
358-
//todo implement other units and handle if dimensions is null
359375
default:
360-
throw new InvalidOperationException("An absolute unit cannot be converted to a relative one.");
376+
throw new InvalidOperationException("Unsupported Unit cant be converted.");
377+
}
378+
}
379+
380+
private void CheckForValidRenderDimensions(IRenderDimensions renderDimensions, bool isWidth)
381+
{
382+
if (renderDimensions == null || (isWidth ? renderDimensions.RenderWidth : renderDimensions.RenderHeight) > 0)
383+
{
384+
throw new ArgumentException("A non null render device with a font size is required to calculate em or rem units.");
385+
}
386+
}
387+
388+
private void CheckForValidRenderDimensionsForFont(IRenderDimensions renderDimensions)
389+
{
390+
if (renderDimensions == null || renderDimensions.FontSize > 0)
391+
{
392+
throw new ArgumentException("A non null render device with a font size is required to calculate em or rem units.");
361393
}
362394
}
363395

0 commit comments

Comments
 (0)