fix: switch WebViewFetchWindow to WebMessageReceived for script results

This commit is contained in:
SuperDooper
2026-05-08 16:11:54 +02:00
parent 03676a980f
commit 55e1f754c5
+21 -12
View File
@@ -34,25 +34,34 @@ internal sealed class WebViewFetchWindow : Window
await _wv.EnsureCoreWebView2Async(env); await _wv.EnsureCoreWebView2Async(env);
var tcs = new TaskCompletionSource<string?>(); var tcs = new TaskCompletionSource<string?>(TaskCreationOptions.RunContinuationsAsynchronously);
EventHandler<CoreWebView2NavigationCompletedEventArgs>? handler = null; // Use WebMessageReceived so the script can post back asynchronously without
handler = async (_, e) => // relying on Promise-awaiting support in the WebView2 runtime version.
EventHandler<CoreWebView2WebMessageReceivedEventArgs>? msgHandler = null;
msgHandler = (_, args) =>
{ {
_wv.CoreWebView2.NavigationCompleted -= handler; _wv.CoreWebView2.WebMessageReceived -= msgHandler;
tcs.TrySetResult(args.WebMessageAsString);
};
_wv.CoreWebView2.WebMessageReceived += msgHandler;
EventHandler<CoreWebView2NavigationCompletedEventArgs>? navHandler = null;
navHandler = async (_, e) =>
{
_wv.CoreWebView2.NavigationCompleted -= navHandler;
if (!e.IsSuccess) { tcs.TrySetResult(null); return; } if (!e.IsSuccess) { tcs.TrySetResult(null); return; }
try try { await _wv.CoreWebView2.ExecuteScriptAsync(script); }
{
var result = await _wv.CoreWebView2.ExecuteScriptAsync(script);
tcs.TrySetResult(result);
}
catch { tcs.TrySetResult(null); } catch { tcs.TrySetResult(null); }
}; };
_wv.CoreWebView2.NavigationCompleted += navHandler;
_wv.CoreWebView2.NavigationCompleted += handler;
_wv.CoreWebView2.Navigate(navigateUrl); _wv.CoreWebView2.Navigate(navigateUrl);
_ = Task.Delay(timeoutMs).ContinueWith(_ => tcs.TrySetResult(null)); _ = Task.Delay(timeoutMs).ContinueWith(_ =>
{
_wv.CoreWebView2.WebMessageReceived -= msgHandler;
tcs.TrySetResult(null);
});
return await tcs.Task; return await tcs.Task;
} }