mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 11:48:06 +01:00
[SVGPreview]Handle comments properly (#28863)
* [SVGPreview] Handle comments properly * f: spelling * f: add tolerance to the bitmap eq test * f: remove bitmap eq testing, since it doesn't work on CI for some reason * f: parsing issue
This commit is contained in:
1
.github/actions/spell-check/expect.txt
vendored
1
.github/actions/spell-check/expect.txt
vendored
@@ -136,6 +136,7 @@ BITMAPFILEHEADER
|
|||||||
bitmapimage
|
bitmapimage
|
||||||
BITMAPINFO
|
BITMAPINFO
|
||||||
BITMAPINFOHEADER
|
BITMAPINFOHEADER
|
||||||
|
Bitmaps
|
||||||
bitmask
|
bitmask
|
||||||
BITSPIXEL
|
BITSPIXEL
|
||||||
bla
|
bla
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 27.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
|
||||||
|
<!-- Generator: Adobe Illustrator 27.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg viewBox="0 0 100 100"
|
||||||
|
xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="50"
|
||||||
|
cy="50"
|
||||||
|
fill="rgba(0, 0, 255, 1)"
|
||||||
|
r="50">
|
||||||
|
<script>alert("valid-message")</script>
|
||||||
|
</circle>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<!-- Generator: Adobe Illustrator 27.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
After Width: | Height: | Size: 552 B |
@@ -4,14 +4,12 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.Drawing.Imaging;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Runtime.InteropServices.ComTypes;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Common.ComInterlop;
|
|
||||||
using Microsoft.PowerToys.STATestExtension;
|
using Microsoft.PowerToys.STATestExtension;
|
||||||
using Microsoft.PowerToys.ThumbnailHandler.Svg;
|
using Microsoft.PowerToys.ThumbnailHandler.Svg;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
using Moq;
|
|
||||||
|
|
||||||
namespace SvgThumbnailProviderUnitTests
|
namespace SvgThumbnailProviderUnitTests
|
||||||
{
|
{
|
||||||
@@ -211,5 +209,17 @@ namespace SvgThumbnailProviderUnitTests
|
|||||||
|
|
||||||
Assert.IsTrue(bitmap != null);
|
Assert.IsTrue(bitmap != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void SvgCommentsAreHandledCorrectly()
|
||||||
|
{
|
||||||
|
var filePath = "HelperFiles/WithComments.svg";
|
||||||
|
|
||||||
|
SvgThumbnailProvider svgThumbnailProvider = new SvgThumbnailProvider(filePath);
|
||||||
|
|
||||||
|
Bitmap bitmap = svgThumbnailProvider.GetThumbnail(8);
|
||||||
|
|
||||||
|
Assert.IsTrue(bitmap != null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,15 +38,19 @@
|
|||||||
<ProjectReference Include="..\SvgThumbnailProvider\SvgThumbnailProvider.csproj" />
|
<ProjectReference Include="..\SvgThumbnailProvider\SvgThumbnailProvider.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="..\STATestClassAttribute.cs" Link="STATestClassAttribute.cs" />
|
<Compile Include="..\STATestClassAttribute.cs"
|
||||||
<Compile Include="..\STATestMethodAttribute.cs" Link="STATestMethodAttribute.cs" />
|
Link="STATestClassAttribute.cs" />
|
||||||
|
<Compile Include="..\STATestMethodAttribute.cs"
|
||||||
|
Link="STATestMethodAttribute.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="HelperFiles\file1.svg">
|
<Content Include="HelperFiles\*.svg">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="HelperFiles\file2.svg">
|
<Content Include="HelperFiles\*.bmp">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
@@ -119,7 +119,7 @@ namespace Common.Utilities
|
|||||||
|
|
||||||
while ((index = s.IndexOf('<', index)) != -1)
|
while ((index = s.IndexOf('<', index)) != -1)
|
||||||
{
|
{
|
||||||
if (index < s.Length - 1 && s[index + 1] != '?')
|
if (index < s.Length - 1 && s[index + 1] != '?' && s[index + 1] != '!')
|
||||||
{
|
{
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
@@ -130,11 +130,11 @@ namespace Common.Utilities
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int FindFirstXmlCloseTagIndex(string s)
|
private static int FindFirstXmlCloseTagIndex(string s, int openTagIndex)
|
||||||
{
|
{
|
||||||
int index = 1;
|
int index = 1;
|
||||||
|
|
||||||
while ((index = s.IndexOf('>', index)) != -1)
|
while ((index = s.IndexOf('>', openTagIndex)) != -1)
|
||||||
{
|
{
|
||||||
if (index > 0 && s[index - 1] != '?')
|
if (index > 0 && s[index - 1] != '?')
|
||||||
{
|
{
|
||||||
@@ -160,7 +160,7 @@ namespace Common.Utilities
|
|||||||
return stringSvgData;
|
return stringSvgData;
|
||||||
}
|
}
|
||||||
|
|
||||||
int firstXmlCloseTagIndex = FindFirstXmlCloseTagIndex(stringSvgData);
|
int firstXmlCloseTagIndex = FindFirstXmlCloseTagIndex(stringSvgData, firstXmlOpenTagIndex);
|
||||||
if (firstXmlCloseTagIndex == -1)
|
if (firstXmlCloseTagIndex == -1)
|
||||||
{
|
{
|
||||||
return stringSvgData;
|
return stringSvgData;
|
||||||
@@ -192,13 +192,18 @@ namespace Common.Utilities
|
|||||||
styleIndex -= numRemoved;
|
styleIndex -= numRemoved;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
firstXmlCloseTagIndex -= numRemoved;
|
||||||
|
|
||||||
stringSvgData = RemoveAttribute(stringSvgData, heightIndex, HeightAttribute, out numRemoved);
|
stringSvgData = RemoveAttribute(stringSvgData, heightIndex, HeightAttribute, out numRemoved);
|
||||||
if (styleIndex != -1 && styleIndex > heightIndex)
|
if (styleIndex != -1 && styleIndex > heightIndex)
|
||||||
{
|
{
|
||||||
styleIndex -= numRemoved;
|
styleIndex -= numRemoved;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
firstXmlCloseTagIndex -= numRemoved;
|
||||||
|
|
||||||
stringSvgData = RemoveAttribute(stringSvgData, styleIndex, StyleAttribute, out numRemoved);
|
stringSvgData = RemoveAttribute(stringSvgData, styleIndex, StyleAttribute, out numRemoved);
|
||||||
|
firstXmlCloseTagIndex -= numRemoved;
|
||||||
|
|
||||||
width = CheckUnit(width);
|
width = CheckUnit(width);
|
||||||
height = CheckUnit(height);
|
height = CheckUnit(height);
|
||||||
@@ -213,7 +218,7 @@ namespace Common.Utilities
|
|||||||
scaling += $" _height:expression(this.scrollHeight > {heightR} ? " {height}" : "auto"); _width:expression(this.scrollWidth > {widthR} ? "{width}" : "auto");";
|
scaling += $" _height:expression(this.scrollHeight > {heightR} ? " {height}" : "auto"); _width:expression(this.scrollWidth > {widthR} ? "{width}" : "auto");";
|
||||||
|
|
||||||
string newStyle = $"style=\"{scaling}{centering}{oldStyle}\"";
|
string newStyle = $"style=\"{scaling}{centering}{oldStyle}\"";
|
||||||
int insertAt = stringSvgData.IndexOf(">", StringComparison.InvariantCultureIgnoreCase);
|
int insertAt = firstXmlCloseTagIndex;
|
||||||
|
|
||||||
stringSvgData = stringSvgData.Insert(insertAt, " " + newStyle);
|
stringSvgData = stringSvgData.Insert(insertAt, " " + newStyle);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user