// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Runtime.InteropServices; namespace Microsoft.Maui.Platform.Linux.Interop; /// /// P/Invoke bindings for WebKitGTK library. /// WebKitGTK provides a full-featured web browser engine for Linux. /// public static class WebKitGtk { private const string WebKit2Lib = "libwebkit2gtk-4.1.so.0"; private const string GtkLib = "libgtk-3.so.0"; private const string GObjectLib = "libgobject-2.0.so.0"; private const string GLibLib = "libglib-2.0.so.0"; #region GTK Initialization [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern bool gtk_init_check(ref int argc, ref IntPtr argv); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_main(); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_main_quit(); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern bool gtk_events_pending(); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_main_iteration(); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern bool gtk_main_iteration_do(bool blocking); #endregion #region GTK Window [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr gtk_window_new(int type); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_window_set_default_size(IntPtr window, int width, int height); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_window_set_decorated(IntPtr window, bool decorated); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_window_move(IntPtr window, int x, int y); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_window_resize(IntPtr window, int width, int height); #endregion #region GTK Widget [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_widget_show_all(IntPtr widget); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_widget_show(IntPtr widget); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_widget_hide(IntPtr widget); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_widget_destroy(IntPtr widget); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_widget_set_size_request(IntPtr widget, int width, int height); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_widget_realize(IntPtr widget); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr gtk_widget_get_window(IntPtr widget); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_widget_set_can_focus(IntPtr widget, bool canFocus); #endregion #region GTK Container [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_container_add(IntPtr container, IntPtr widget); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern void gtk_container_remove(IntPtr container, IntPtr widget); #endregion #region GTK Plug (for embedding in X11 windows) [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr gtk_plug_new(ulong socketId); [DllImport(GtkLib, CallingConvention = CallingConvention.Cdecl)] public static extern ulong gtk_plug_get_id(IntPtr plug); #endregion #region WebKitWebView [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr webkit_web_view_new(); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr webkit_web_view_new_with_context(IntPtr context); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_web_view_load_uri(IntPtr webView, [MarshalAs(UnmanagedType.LPUTF8Str)] string uri); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_web_view_load_html(IntPtr webView, [MarshalAs(UnmanagedType.LPUTF8Str)] string content, [MarshalAs(UnmanagedType.LPUTF8Str)] string? baseUri); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_web_view_reload(IntPtr webView); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_web_view_stop_loading(IntPtr webView); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_web_view_go_back(IntPtr webView); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_web_view_go_forward(IntPtr webView); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern bool webkit_web_view_can_go_back(IntPtr webView); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern bool webkit_web_view_can_go_forward(IntPtr webView); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr webkit_web_view_get_uri(IntPtr webView); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr webkit_web_view_get_title(IntPtr webView); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern double webkit_web_view_get_estimated_load_progress(IntPtr webView); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern bool webkit_web_view_is_loading(IntPtr webView); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_web_view_run_javascript(IntPtr webView, [MarshalAs(UnmanagedType.LPUTF8Str)] string script, IntPtr cancellable, IntPtr callback, IntPtr userData); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr webkit_web_view_run_javascript_finish(IntPtr webView, IntPtr result, out IntPtr error); #endregion #region WebKitSettings [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr webkit_web_view_get_settings(IntPtr webView); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_settings_set_enable_javascript(IntPtr settings, bool enabled); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_settings_set_user_agent(IntPtr settings, [MarshalAs(UnmanagedType.LPUTF8Str)] string userAgent); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr webkit_settings_get_user_agent(IntPtr settings); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_settings_set_enable_developer_extras(IntPtr settings, bool enabled); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_settings_set_javascript_can_access_clipboard(IntPtr settings, bool enabled); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_settings_set_enable_webgl(IntPtr settings, bool enabled); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_settings_set_allow_file_access_from_file_urls(IntPtr settings, bool enabled); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_settings_set_allow_universal_access_from_file_urls(IntPtr settings, bool enabled); #endregion #region WebKitWebContext [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr webkit_web_context_get_default(); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr webkit_web_context_new(); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr webkit_web_context_get_cookie_manager(IntPtr context); #endregion #region WebKitCookieManager [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_cookie_manager_set_accept_policy(IntPtr cookieManager, int policy); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_cookie_manager_set_persistent_storage(IntPtr cookieManager, [MarshalAs(UnmanagedType.LPUTF8Str)] string filename, int storage); // Cookie accept policies public const int WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS = 0; public const int WEBKIT_COOKIE_POLICY_ACCEPT_NEVER = 1; public const int WEBKIT_COOKIE_POLICY_ACCEPT_NO_THIRD_PARTY = 2; // Cookie persistent storage types public const int WEBKIT_COOKIE_PERSISTENT_STORAGE_TEXT = 0; public const int WEBKIT_COOKIE_PERSISTENT_STORAGE_SQLITE = 1; #endregion #region WebKitNavigationAction [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr webkit_navigation_action_get_request(IntPtr action); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern int webkit_navigation_action_get_navigation_type(IntPtr action); #endregion #region WebKitURIRequest [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr webkit_uri_request_get_uri(IntPtr request); #endregion #region WebKitPolicyDecision [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_policy_decision_use(IntPtr decision); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_policy_decision_ignore(IntPtr decision); [DllImport(WebKit2Lib, CallingConvention = CallingConvention.Cdecl)] public static extern void webkit_policy_decision_download(IntPtr decision); #endregion #region GObject Signal Connection [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void GCallback(); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void LoadChangedCallback(IntPtr webView, int loadEvent, IntPtr userData); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate bool DecidePolicyCallback(IntPtr webView, IntPtr decision, int decisionType, IntPtr userData); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void LoadFailedCallback(IntPtr webView, int loadEvent, IntPtr failingUri, IntPtr error, IntPtr userData); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void NotifyCallback(IntPtr webView, IntPtr paramSpec, IntPtr userData); [DllImport(GObjectLib, CallingConvention = CallingConvention.Cdecl)] public static extern ulong g_signal_connect_data(IntPtr instance, [MarshalAs(UnmanagedType.LPUTF8Str)] string detailedSignal, Delegate handler, IntPtr data, IntPtr destroyData, int connectFlags); [DllImport(GObjectLib, CallingConvention = CallingConvention.Cdecl)] public static extern void g_signal_handler_disconnect(IntPtr instance, ulong handlerId); [DllImport(GObjectLib, CallingConvention = CallingConvention.Cdecl)] public static extern void g_object_unref(IntPtr obj); #endregion #region GLib Memory [DllImport(GLibLib, CallingConvention = CallingConvention.Cdecl)] public static extern void g_free(IntPtr mem); #endregion #region WebKit Load Events public const int WEBKIT_LOAD_STARTED = 0; public const int WEBKIT_LOAD_REDIRECTED = 1; public const int WEBKIT_LOAD_COMMITTED = 2; public const int WEBKIT_LOAD_FINISHED = 3; #endregion #region WebKit Policy Decision Types public const int WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION = 0; public const int WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION = 1; public const int WEBKIT_POLICY_DECISION_TYPE_RESPONSE = 2; #endregion #region Helper Methods /// /// Converts a native UTF-8 string pointer to a managed string. /// public static string? PtrToStringUtf8(IntPtr ptr) { if (ptr == IntPtr.Zero) return null; return Marshal.PtrToStringUTF8(ptr); } /// /// Processes pending GTK events without blocking. /// public static void ProcessGtkEvents() { while (gtk_events_pending()) { gtk_main_iteration_do(false); } } #endregion }