1 // This file is part of Desktop App Toolkit,
2 // a set of libraries for developing nice desktop applications.
3 //
4 // For license and copyright information please follow this link:
5 // https://github.com/desktop-app/legal/blob/master/LEGAL
6 //
7 #pragma once
8 
9 #include <gio/gio.h>
10 
11 #define GTK_TYPE_CONTAINER (gtk_container_get_type ())
12 #define GTK_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_CONTAINER, GtkContainer))
13 
14 #define GTK_TYPE_WIDGET (gtk_widget_get_type ())
15 #define GTK_WIDGET(widget) (G_TYPE_CHECK_INSTANCE_CAST ((widget), GTK_TYPE_WIDGET, GtkWidget))
16 
17 #define GTK_TYPE_WINDOW (gtk_window_get_type ())
18 #define GTK_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_WINDOW, GtkWindow))
19 
20 #define WEBKIT_TYPE_NAVIGATION_POLICY_DECISION (webkit_navigation_policy_decision_get_type())
21 #define WEBKIT_NAVIGATION_POLICY_DECISION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_NAVIGATION_POLICY_DECISION, WebKitNavigationPolicyDecision))
22 
23 #define WEBKIT_TYPE_WEB_VIEW (webkit_web_view_get_type())
24 #define WEBKIT_WEB_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_WEB_VIEW, WebKitWebView))
25 
26 typedef struct _GdkWindow GdkWindow;
27 typedef struct _GtkContainer GtkContainer;
28 typedef struct _GtkWidget GtkWidget;
29 typedef struct _GtkWindow GtkWindow;
30 
31 typedef struct _JSCValue JSCValue;
32 typedef const struct OpaqueJSContext *JSContextRef;
33 typedef struct OpaqueJSContext *JSGlobalContextRef;
34 typedef struct OpaqueJSString *JSStringRef;
35 typedef const struct OpaqueJSValue* JSValueRef;
36 
37 typedef struct _WebKitJavascriptResult WebKitJavascriptResult;
38 typedef struct _WebKitNavigationAction WebKitNavigationAction;
39 typedef struct _WebKitNavigationPolicyDecision WebKitNavigationPolicyDecision;
40 typedef struct _WebKitPolicyDecision WebKitPolicyDecision;
41 typedef struct _WebKitURIRequest WebKitURIRequest;
42 typedef struct _WebKitUserContentManager WebKitUserContentManager;
43 typedef struct _WebKitUserScript WebKitUserScript;
44 typedef struct _WebKitWebView WebKitWebView;
45 typedef struct _WebKitSettings WebKitSettings;
46 
47 typedef enum {
48 	GTK_WINDOW_TOPLEVEL,
49 	GTK_WINDOW_POPUP,
50 } GtkWindowType;
51 
52 typedef enum {
53 	WEBKIT_LOAD_STARTED,
54 	WEBKIT_LOAD_REDIRECTED,
55 	WEBKIT_LOAD_COMMITTED,
56 	WEBKIT_LOAD_FINISHED,
57 } WebKitLoadEvent;
58 
59 typedef enum {
60 	WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION,
61 	WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION,
62 	WEBKIT_POLICY_DECISION_TYPE_RESPONSE,
63 } WebKitPolicyDecisionType;
64 
65 typedef enum {
66 	WEBKIT_USER_CONTENT_INJECT_ALL_FRAMES,
67 	WEBKIT_USER_CONTENT_INJECT_TOP_FRAME,
68 } WebKitUserContentInjectedFrames;
69 
70 typedef enum {
71 	WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_START,
72 	WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_END,
73 } WebKitUserScriptInjectionTime;
74 
75 namespace Webview::WebkitGtk {
76 
77 inline gboolean (*gtk_init_check)(int *argc, char ***argv);
78 inline void (*gdk_set_allowed_backends)(const gchar *backends);
79 inline GType (*gtk_widget_get_type)(void);
80 inline void (*gtk_widget_grab_focus)(GtkWidget *widget);
81 inline GType (*gtk_container_get_type)(void);
82 inline void (*gtk_container_add)(
83 	GtkContainer *container,
84 	GtkWidget *widget);
85 inline GdkWindow *(*gtk_widget_get_window)(GtkWidget *widget);
86 inline GtkWidget *(*gtk_window_new)(GtkWindowType type);
87 inline void (*gtk_widget_destroy)(GtkWidget *widget);
88 inline void (*gtk_widget_hide)(GtkWidget *widget);
89 inline void (*gtk_widget_show_all)(GtkWidget *widget);
90 inline GType (*gtk_window_get_type)(void);
91 inline void (*gtk_window_set_decorated)(GtkWindow *window, gboolean setting);
92 
93 // returns Window that is a typedef to unsigned long,
94 // but we avoid to include Xlib.h here
95 inline unsigned long (*gdk_x11_window_get_xid)(GdkWindow *window);
96 
97 inline char *(*jsc_value_to_string)(JSCValue *value);
98 inline JSStringRef (*JSValueToStringCopy)(
99 	JSContextRef ctx,
100 	JSValueRef value,
101 	JSValueRef* exception);
102 inline size_t (*JSStringGetMaximumUTF8CStringSize)(JSStringRef string);
103 inline size_t (*JSStringGetUTF8CString)(
104 	JSStringRef string,
105 	char* buffer,
106 	size_t bufferSize);
107 inline void (*JSStringRelease)(JSStringRef string);
108 
109 inline JSCValue *(*webkit_javascript_result_get_js_value)(
110 	WebKitJavascriptResult *js_result);
111 inline JSGlobalContextRef (*webkit_javascript_result_get_global_context)(
112 	WebKitJavascriptResult *js_result);
113 inline JSValueRef (*webkit_javascript_result_get_value)(
114 	WebKitJavascriptResult *js_result);
115 
116 inline GType (*webkit_navigation_policy_decision_get_type)(void);
117 inline WebKitNavigationAction *(*webkit_navigation_policy_decision_get_navigation_action)(
118 	WebKitNavigationPolicyDecision *decision);
119 inline WebKitURIRequest *(*webkit_navigation_action_get_request)(
120 	WebKitNavigationAction *navigation);
121 inline WebKitURIRequest *(*webkit_navigation_policy_decision_get_request)(
122 	WebKitNavigationPolicyDecision *decision);
123 inline const gchar *(*webkit_uri_request_get_uri)(WebKitURIRequest *request);
124 inline void (*webkit_policy_decision_ignore)(WebKitPolicyDecision *decision);
125 
126 inline GtkWidget *(*webkit_web_view_new)(void);
127 inline GType (*webkit_web_view_get_type)(void);
128 inline WebKitUserContentManager *(*webkit_web_view_get_user_content_manager)(
129 	WebKitWebView *web_view);
130 inline gboolean (*webkit_user_content_manager_register_script_message_handler)(
131 	WebKitUserContentManager *manager,
132 	const gchar *name);
133 inline WebKitSettings *(*webkit_web_view_get_settings)(
134 	WebKitWebView *web_view);
135 inline void (*webkit_settings_set_javascript_can_access_clipboard)(
136 	WebKitSettings *settings,
137 	gboolean enabled);
138 inline void (*webkit_web_view_load_uri)(
139 	WebKitWebView *web_view,
140 	const gchar *uri);
141 inline WebKitUserScript *(*webkit_user_script_new)(
142 	const gchar *source,
143 	WebKitUserContentInjectedFrames injected_frames,
144 	WebKitUserScriptInjectionTime injection_time,
145 	const gchar* const *whitelist,
146 	const gchar* const *blacklist);
147 inline void (*webkit_user_content_manager_add_script)(
148 	WebKitUserContentManager *manager,
149 	WebKitUserScript *script);
150 inline void (*webkit_web_view_run_javascript)(
151 	WebKitWebView *web_view,
152 	const gchar *script,
153 	GCancellable *cancellable,
154 	GAsyncReadyCallback callback,
155 	gpointer user_data);
156 
157 [[nodiscard]] bool Resolve();
158 
159 } // namespace Webview::WebkitGtk
160