|
2 | 2 | // The Microsoft Corporation licenses this file to you under the MIT license. |
3 | 3 | // See the LICENSE file in the project root for more information. |
4 | 4 |
|
| 5 | +using System.IO; |
5 | 6 | using System.Net.Http; |
6 | 7 | using System.Reflection; |
7 | 8 | using System.Runtime.CompilerServices; |
@@ -106,7 +107,7 @@ public override void DoPreview<T>(T dataSource) |
106 | 107 | return; |
107 | 108 | } |
108 | 109 |
|
109 | | - CleanupWebView2UserDataFolder(); |
| 110 | + EnsureWebView2UserDataFolder(); |
110 | 111 |
|
111 | 112 | string svgData = null; |
112 | 113 | bool blocked = false; |
@@ -251,23 +252,27 @@ private void AddWebViewControl(string svgData) |
251 | 252 | _browser.CoreWebView2.AddWebResourceRequestedFilter("*", CoreWebView2WebResourceContext.All); |
252 | 253 | _browser.CoreWebView2.WebResourceRequested += CoreWebView2_BlockExternalResources; |
253 | 254 |
|
254 | | - string generatedPreview = _previewGenerator.GeneratePreview(svgData); |
| 255 | + var cacheKey = SvgPreviewCacheHelper.BuildCacheKey( |
| 256 | + "v1", |
| 257 | + VirtualHostName, |
| 258 | + svgData, |
| 259 | + _settings.ColorMode.ToString(), |
| 260 | + _settings.ThemeColor.ToArgb().ToString(), |
| 261 | + _settings.SolidColor.ToArgb().ToString(), |
| 262 | + _settings.CheckeredShade.ToString()); |
255 | 263 |
|
256 | | - // WebView2.NavigateToString() limitation |
257 | | - // See https://learn.microsoft.com/dotnet/api/microsoft.web.webview2.core.corewebview2.navigatetostring?view=webview2-dotnet-1.0.864.35#remarks |
258 | | - // While testing the limit, it turned out it is ~1.5MB, so to be on a safe side we go for 1.5m bytes |
259 | | - if (generatedPreview.Length > 1_500_000) |
260 | | - { |
261 | | - string filename = _webView2UserDataFolder + "\\" + Guid.NewGuid().ToString() + ".html"; |
262 | | - File.WriteAllText(filename, generatedPreview); |
263 | | - _localFileURI = new Uri(filename); |
264 | | - _browser.Source = _localFileURI; |
265 | | - } |
266 | | - else |
| 264 | + var cacheFolder = Path.Combine(_webView2UserDataFolder, "Cache"); |
| 265 | + var cacheFilePath = SvgPreviewCacheHelper.GetCacheFilePath(cacheFolder, cacheKey); |
| 266 | + |
| 267 | + if (!File.Exists(cacheFilePath) || new FileInfo(cacheFilePath).Length == 0) |
267 | 268 | { |
268 | | - _browser.NavigateToString(generatedPreview); |
| 269 | + string generatedPreview = _previewGenerator.GeneratePreview(svgData); |
| 270 | + File.WriteAllText(cacheFilePath, generatedPreview); |
269 | 271 | } |
270 | 272 |
|
| 273 | + _localFileURI = new Uri(cacheFilePath); |
| 274 | + _browser.Source = _localFileURI; |
| 275 | + |
271 | 276 | Controls.Add(_browser); |
272 | 277 | } |
273 | 278 | catch (Exception) |
@@ -318,17 +323,11 @@ private void PreviewError<T>(Exception exception, T dataSource) |
318 | 323 | /// <summary> |
319 | 324 | /// Cleanup the previously created tmp html files from svg files bigger than 2MB. |
320 | 325 | /// </summary> |
321 | | - private void CleanupWebView2UserDataFolder() |
| 326 | + private void EnsureWebView2UserDataFolder() |
322 | 327 | { |
323 | 328 | try |
324 | 329 | { |
325 | | - // Cleanup temp dir |
326 | | - var dir = new DirectoryInfo(_webView2UserDataFolder); |
327 | | - |
328 | | - foreach (var file in dir.EnumerateFiles("*.html")) |
329 | | - { |
330 | | - file.Delete(); |
331 | | - } |
| 330 | + Directory.CreateDirectory(_webView2UserDataFolder); |
332 | 331 | } |
333 | 332 | catch (Exception) |
334 | 333 | { |
|
0 commit comments