Files

79 lines
2.6 KiB
C#
Raw Permalink Normal View History

2025-11-15 14:52:01 +01:00
using System;
2026-04-07 09:52:37 +02:00
using System.Runtime.InteropServices.WindowsRuntime;
2025-11-15 14:52:01 +01:00
using System.Threading.Tasks;
2026-04-07 09:52:37 +02:00
using Microsoft.Web.WebView2.Core;
2025-11-15 14:52:01 +01:00
namespace Wino.Mail.WinUI.Extensions;
public static class WebViewExtensions
{
2026-04-07 09:52:37 +02:00
private static readonly object _environmentLock = new();
2026-02-08 10:35:24 +01:00
private static bool _environmentInitialized;
2026-04-07 09:52:37 +02:00
private static Task<CoreWebView2Environment>? _sharedEnvironmentTask;
2026-02-08 10:35:24 +01:00
/// <summary>
/// Sets WebView2 environment variables once per process.
/// Must be called before any WebView2 is initialized.
/// </summary>
public static void EnsureWebView2Environment()
{
if (_environmentInitialized) return;
Environment.SetEnvironmentVariable("WEBVIEW2_DEFAULT_BACKGROUND_COLOR", "00FFFFFF");
Environment.SetEnvironmentVariable("WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS",
"--enable-features=OverlayScrollbar,msOverlayScrollbarWinStyle,msOverlayScrollbarWinStyleAnimation,msWebView2CodeCache");
_environmentInitialized = true;
}
2026-04-07 09:52:37 +02:00
public static Task<CoreWebView2Environment> GetSharedEnvironmentAsync()
{
EnsureWebView2Environment();
lock (_environmentLock)
{
_sharedEnvironmentTask ??= CoreWebView2Environment.CreateAsync().AsTask();
return _sharedEnvironmentTask;
}
}
2025-11-15 14:52:01 +01:00
/// <summary>
/// Executes a script function in the WebView2 control.
/// </summary>
/// <param name="parameters">Parameters should be serialized to json</param>
2026-02-08 10:35:24 +01:00
public static async Task<string> ExecuteScriptFunctionAsync(this Microsoft.UI.Xaml.Controls.WebView2 Chromium, string functionName, params string[] parameters)
2025-11-15 14:52:01 +01:00
{
2026-02-08 10:35:24 +01:00
if (Chromium?.CoreWebView2 == null) return string.Empty;
2025-11-15 14:52:01 +01:00
string script = functionName + "(" + string.Join(", ", parameters) + ");";
2026-02-08 10:35:24 +01:00
return await Chromium.ExecuteScriptAsync(script);
2025-11-15 14:52:01 +01:00
}
public static async Task<string> ExecuteScriptFunctionSafeAsync(this Microsoft.UI.Xaml.Controls.WebView2 Chromium, string functionName, params string[] parameters)
{
if (Chromium == null) return string.Empty;
try
{
return await Chromium.ExecuteScriptFunctionAsync(functionName, parameters: parameters);
}
catch { }
return string.Empty;
}
public static async Task<string> ExecuteScriptSafeAsync(this Microsoft.UI.Xaml.Controls.WebView2 Chromium, string script)
{
if (Chromium == null) return string.Empty;
try
{
return await Chromium.ExecuteScriptAsync(script);
}
catch { }
return string.Empty;
}
}