More fixes

This commit is contained in:
2026-01-17 08:06:22 +00:00
parent f1a368a6c2
commit dc52f7f2bc
18 changed files with 1022 additions and 65 deletions

View File

@@ -20,11 +20,31 @@ internal static class WebKitNative
private delegate IntPtr WebKitWebViewGetSettingsDelegate(IntPtr webView);
private delegate void WebKitSettingsSetHardwareAccelerationPolicyDelegate(IntPtr settings, int policy);
private delegate void WebKitSettingsSetEnableJavascriptDelegate(IntPtr settings, bool enabled);
private delegate void WebKitWebViewSetBackgroundColorDelegate(IntPtr webView, ref GdkRGBA color);
[StructLayout(LayoutKind.Sequential)]
public struct GdkRGBA
{
public double Red;
public double Green;
public double Blue;
public double Alpha;
}
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void LoadChangedCallback(IntPtr webView, int loadEvent, IntPtr userData);
private delegate ulong GSignalConnectDataDelegate(IntPtr instance, string signalName, LoadChangedCallback callback, IntPtr userData, IntPtr destroyNotify, int connectFlags);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate bool ScriptDialogCallback(IntPtr webView, IntPtr dialog, IntPtr userData);
private delegate ulong GSignalConnectDataDelegate(IntPtr instance, string signalName, Delegate callback, IntPtr userData, IntPtr destroyNotify, int connectFlags);
// WebKitScriptDialog functions
private delegate int WebKitScriptDialogGetDialogTypeDelegate(IntPtr dialog);
private delegate IntPtr WebKitScriptDialogGetMessageDelegate(IntPtr dialog);
private delegate void WebKitScriptDialogConfirmSetConfirmedDelegate(IntPtr dialog, bool confirmed);
private delegate IntPtr WebKitScriptDialogPromptGetDefaultTextDelegate(IntPtr dialog);
private delegate void WebKitScriptDialogPromptSetTextDelegate(IntPtr dialog, string text);
public enum WebKitLoadEvent
{
@@ -34,6 +54,14 @@ internal static class WebKitNative
Finished
}
public enum WebKitScriptDialogType
{
Alert = 0,
Confirm = 1,
Prompt = 2,
BeforeUnloadConfirm = 3
}
private static IntPtr _handle;
private static bool _initialized;
@@ -59,9 +87,21 @@ internal static class WebKitNative
private static WebKitWebViewGetSettingsDelegate? _webkitGetSettings;
private static WebKitSettingsSetHardwareAccelerationPolicyDelegate? _webkitSetHardwareAccel;
private static WebKitSettingsSetEnableJavascriptDelegate? _webkitSetJavascript;
private static WebKitWebViewSetBackgroundColorDelegate? _webkitSetBackgroundColor;
private static GSignalConnectDataDelegate? _gSignalConnectData;
private static WebKitScriptDialogGetDialogTypeDelegate? _webkitScriptDialogGetDialogType;
private static WebKitScriptDialogGetMessageDelegate? _webkitScriptDialogGetMessage;
private static WebKitScriptDialogConfirmSetConfirmedDelegate? _webkitScriptDialogConfirmSetConfirmed;
private static WebKitScriptDialogPromptGetDefaultTextDelegate? _webkitScriptDialogPromptGetDefaultText;
private static WebKitScriptDialogPromptSetTextDelegate? _webkitScriptDialogPromptSetText;
private static readonly Dictionary<IntPtr, LoadChangedCallback> _loadChangedCallbacks = new Dictionary<IntPtr, LoadChangedCallback>();
private static readonly Dictionary<IntPtr, ScriptDialogCallback> _scriptDialogCallbacks = new Dictionary<IntPtr, ScriptDialogCallback>();
/// <summary>
/// Event raised when a JavaScript dialog (alert, confirm, prompt) is requested.
/// </summary>
public static event Action<IntPtr, WebKitScriptDialogType, string>? ScriptDialogRequested;
private const int RTLD_NOW = 2;
private const int RTLD_GLOBAL = 256;
@@ -116,6 +156,12 @@ internal static class WebKitNative
_webkitGetSettings = LoadFunction<WebKitWebViewGetSettingsDelegate>("webkit_web_view_get_settings");
_webkitSetHardwareAccel = LoadFunction<WebKitSettingsSetHardwareAccelerationPolicyDelegate>("webkit_settings_set_hardware_acceleration_policy");
_webkitSetJavascript = LoadFunction<WebKitSettingsSetEnableJavascriptDelegate>("webkit_settings_set_enable_javascript");
_webkitSetBackgroundColor = LoadFunction<WebKitWebViewSetBackgroundColorDelegate>("webkit_web_view_set_background_color");
_webkitScriptDialogGetDialogType = LoadFunction<WebKitScriptDialogGetDialogTypeDelegate>("webkit_script_dialog_get_dialog_type");
_webkitScriptDialogGetMessage = LoadFunction<WebKitScriptDialogGetMessageDelegate>("webkit_script_dialog_get_message");
_webkitScriptDialogConfirmSetConfirmed = LoadFunction<WebKitScriptDialogConfirmSetConfirmedDelegate>("webkit_script_dialog_confirm_set_confirmed");
_webkitScriptDialogPromptGetDefaultText = LoadFunction<WebKitScriptDialogPromptGetDefaultTextDelegate>("webkit_script_dialog_prompt_get_default_text");
_webkitScriptDialogPromptSetText = LoadFunction<WebKitScriptDialogPromptSetTextDelegate>("webkit_script_dialog_prompt_set_text");
_gobjectHandle = dlopen("libgobject-2.0.so.0", 258);
if (_gobjectHandle != IntPtr.Zero)
@@ -238,6 +284,15 @@ internal static class WebKitNative
}
}
public static void SetBackgroundColor(IntPtr webView, double r, double g, double b, double a = 1.0)
{
if (_webkitSetBackgroundColor != null && webView != IntPtr.Zero)
{
var color = new GdkRGBA { Red = r, Green = g, Blue = b, Alpha = a };
_webkitSetBackgroundColor(webView, ref color);
}
}
public static ulong ConnectLoadChanged(IntPtr webView, LoadChangedCallback callback)
{
if (_gSignalConnectData == null || webView == IntPtr.Zero)
@@ -253,4 +308,72 @@ internal static class WebKitNative
{
_loadChangedCallbacks.Remove(webView);
}
/// <summary>
/// Connects to the script-dialog signal to intercept JavaScript alert/confirm/prompt dialogs.
/// Returns true from the callback to prevent the default WebKitGTK dialog.
/// </summary>
public static ulong ConnectScriptDialog(IntPtr webView, ScriptDialogCallback callback)
{
if (_gSignalConnectData == null || webView == IntPtr.Zero)
{
Console.WriteLine("[WebKitNative] Cannot connect script-dialog: signal connect not available");
return 0uL;
}
_scriptDialogCallbacks[webView] = callback;
return _gSignalConnectData(webView, "script-dialog", callback, IntPtr.Zero, IntPtr.Zero, 0);
}
public static void DisconnectScriptDialog(IntPtr webView)
{
_scriptDialogCallbacks.Remove(webView);
}
/// <summary>
/// Gets the type of a script dialog.
/// </summary>
public static WebKitScriptDialogType GetScriptDialogType(IntPtr dialog)
{
if (_webkitScriptDialogGetDialogType == null || dialog == IntPtr.Zero)
return WebKitScriptDialogType.Alert;
return (WebKitScriptDialogType)_webkitScriptDialogGetDialogType(dialog);
}
/// <summary>
/// Gets the message from a script dialog.
/// </summary>
public static string? GetScriptDialogMessage(IntPtr dialog)
{
if (_webkitScriptDialogGetMessage == null || dialog == IntPtr.Zero)
return null;
IntPtr msgPtr = _webkitScriptDialogGetMessage(dialog);
return msgPtr == IntPtr.Zero ? null : Marshal.PtrToStringUTF8(msgPtr);
}
/// <summary>
/// Sets the confirmed state for a confirm dialog.
/// </summary>
public static void SetScriptDialogConfirmed(IntPtr dialog, bool confirmed)
{
_webkitScriptDialogConfirmSetConfirmed?.Invoke(dialog, confirmed);
}
/// <summary>
/// Gets the default text for a prompt dialog.
/// </summary>
public static string? GetScriptDialogPromptDefaultText(IntPtr dialog)
{
if (_webkitScriptDialogPromptGetDefaultText == null || dialog == IntPtr.Zero)
return null;
IntPtr textPtr = _webkitScriptDialogPromptGetDefaultText(dialog);
return textPtr == IntPtr.Zero ? null : Marshal.PtrToStringUTF8(textPtr);
}
/// <summary>
/// Sets the text response for a prompt dialog.
/// </summary>
public static void SetScriptDialogPromptText(IntPtr dialog, string text)
{
_webkitScriptDialogPromptSetText?.Invoke(dialog, text);
}
}