With Linux 12, Ubuntu >= 22.04, Mint Linux LMDE 6 there is already the libwebkit2gtk-4.1. With Ubuntu 24.04 the libwebkit2gtk-4.0-dev that you need for Purebasic is already missing and you have to load it from Ubuntu Jammy.
Here I use LoadLibrary and not Import. So you don't need the devels. If libwebkit2gtk-4.1 is missing, the system automatically falls back to libwebkit2gtk-4.0.
I used my WebGadget Extensions as a basic and customised it.
Unfortunately, there are a few special rules here. I don't know how Fred has solved this internally.
- FreeGadget must be used.
- When exiting the program, all events must be processed again.
Update v1.02.4
- Bugfix: MyWebViewGadget
- Added: WebKit_GetVersion
MyWebKitGadget.pb
Code: Select all
;-TOP
; Comment : WebKitGadget (GTK3)
; Author : mk-soft
; Link : https://www.purebasic.fr/english/viewtopic.php?t=84479
; File : MyWebKitGadget.pb
; Library : libwebkit2gtk-4.1.so.0 or fallback to libwebkit2gtk-4.0.so
; Version : v1.02.4
; Create : 19.11.2021
; Update : 06.07.2024
; ---------------------
; Linux Libraries (deb)
; sudo apt-get install libwebkit2gtk-4.0
; sudo apt-get install libwebkit2gtk-4.1
; Rules:
; Do "FreeGadget(#WebViewGadget)" before close window or end program
; Do "While WindowEvent() : Delay(10) : Wend" before end program
; Syntax:
; WebKit_HitTestCallback(Gadget, Type, Text.s)
; WebKit_GetHtmlCodeCallback(Gadget, State, HtmlCode.s)
; WebKit_RunJavaScriptCallback(Gadget, State, ScriptID, JavaResult.s)
; Webkit_NavigationCallback(Gadget, URI.s)
; Webkit_PermissionCallback(Gadget, RequestName.s, *Request)
; *********************
DeclareModule WebKit2
;-* Public Module WebKit2
;--- Constants
Enumeration #PB_EventType_FirstCustomValue
#PB_EventType_WebLoadStarted
#PB_EventType_WebLoadRedirected
#PB_EventType_WebLoadCommitted
#PB_EventType_WebLoadFinished
#PB_EventType_WebLoadFailed
#PB_EventType_WebLoadFailedTLS
#PB_EventType_WebProcessCrashed
EndEnumeration
#WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT = 1 << 1
#WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK = 1 << 2
#WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE = 1 << 3
#WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA = 1 << 4
#WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE = 1 << 5
#WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR = 1 << 6
#WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION = 1 << 7
#WEBKIT_HARDWARE_ACCELERATION_POLICY_ON_DEMAND = 0
#WEBKIT_HARDWARE_ACCELERATION_POLICY_ALWAYS = 1
#WEBKIT_HARDWARE_ACCELERATION_POLICY_NEVER = 2
;--- Structures
Structure WebKitLoadError
Link.s
Code.i
Message.s
EndStructure
Structure WebKitLoadErrorTLS
Link.s
Errors.i
*Certificate
EndStructure
;--- Functions
Prototype WebKit_HitTestCallback(Gadget, Type, Text.s)
Prototype WebKit_GetHtmlCodeCallback(Gadget, State, HtmlCode.s)
Prototype WebKit_RunJavaScriptCallback(Gadget, State, ScriptID, JavaResult.s)
Prototype Webkit_NavigationCallback(Gadget, URI.s)
Prototype Webkit_PermissionCallback(Gadget, RequestName.s, *Request)
Declare MyWebViewGadget(Gadget, x, y, Width, Height, url.s, Flags = 0)
Declare WebKit_LoadURI(Gadget, URI.s)
Declare WebKit_LoadHTML(Gadget, content.s, base_uri.s = "localhost")
Declare WebKit_LoadFile(Gadget, FileName.s)
Declare WebKit_GoBack(Gadget)
Declare WebKit_GoForward(Gadget)
Declare WebKit_Reload(Gadget)
Declare WebKit_StopLoading(Gadget)
Declare.s WebKit_GetVersion()
Declare.s WebKit_GetURI(Gadget)
Declare.s WebKit_GetTitle(Gadget)
Declare.i WebKit_GetHtmlCode(Gadget, *Callback.WebKit_GetHtmlCodeCallback)
Declare WebKit_SetHitTestCallback(Gadget, *Callback.WebKit_HitTestCallback)
Declare WebKit_SetNavigationCallback(Gadget, *Callback.WebKit_NavigationCallback)
Declare WebKit_SetPermissionCallback(Gadget, *Callback.Webkit_PermissionCallback)
Declare WebKit_RunJavaScript(Gadget, ScriptID, JavaScript.s, *Callback.WebKit_RunJavaScriptCallback)
Declare WebKit_DisableJavaScript(Gadget, State)
Declare WebKit_IsEnableJavaScript(Gadget)
Declare WebKit_SetAcceleration(Gadget, Policy)
Declare WebKit_GetProperty(Gadget, Property.s, *Value.gvalue)
Declare WebKit_SetProperty(Gadget, Property.s, *Value.gvalue)
PrototypeC webkit_user_media_permission_is_for_audio_device(*request)
PrototypeC webkit_user_media_permission_is_for_video_device(*request)
Global webkit_user_media_permission_is_for_audio_device.webkit_user_media_permission_is_for_audio_device
Global webkit_user_media_permission_is_for_video_device.webkit_user_media_permission_is_for_video_device
; ----
EndDeclareModule
Module Webkit2
;- * Private Module WebKit2
EnableExplicit
;--- Constants
Enumeration
#WEBKIT_LOAD_STARTED
#WEBKIT_LOAD_REDIRECTED
#WEBKIT_LOAD_COMMITTED
#WEBKIT_LOAD_FINISHED
EndEnumeration
; ----
Macro G_TYPE_MAKE_FUNDAMENTAL(x)
x << 2
EndMacro
#G_TYPE_INVALID = G_TYPE_MAKE_FUNDAMENTAL(0)
#G_TYPE_NONE = G_TYPE_MAKE_FUNDAMENTAL(1)
#G_TYPE_INTERFACE = G_TYPE_MAKE_FUNDAMENTAL(2)
#G_TYPE_CHAR = G_TYPE_MAKE_FUNDAMENTAL(3)
#G_TYPE_UCHAR = G_TYPE_MAKE_FUNDAMENTAL(4)
#G_TYPE_BOOLEAN = G_TYPE_MAKE_FUNDAMENTAL(5)
#G_TYPE_INT = G_TYPE_MAKE_FUNDAMENTAL(6)
#G_TYPE_UINT = G_TYPE_MAKE_FUNDAMENTAL(7)
#G_TYPE_LONG = G_TYPE_MAKE_FUNDAMENTAL(8)
#G_TYPE_ULONG = G_TYPE_MAKE_FUNDAMENTAL(9)
#G_TYPE_INT64 = G_TYPE_MAKE_FUNDAMENTAL(10)
#G_TYPE_UINT64 = G_TYPE_MAKE_FUNDAMENTAL(11)
#G_TYPE_ENUM = G_TYPE_MAKE_FUNDAMENTAL(12)
#G_TYPE_FLAGS = G_TYPE_MAKE_FUNDAMENTAL(13)
#G_TYPE_FLOAT = G_TYPE_MAKE_FUNDAMENTAL(14)
#G_TYPE_DOUBLE = G_TYPE_MAKE_FUNDAMENTAL(15)
#G_TYPE_STRING = G_TYPE_MAKE_FUNDAMENTAL(16)
#G_TYPE_POINTER = G_TYPE_MAKE_FUNDAMENTAL(17)
#G_TYPE_BOXED = G_TYPE_MAKE_FUNDAMENTAL(18)
#G_TYPE_PARAM = G_TYPE_MAKE_FUNDAMENTAL(19)
#G_TYPE_OBJECT = G_TYPE_MAKE_FUNDAMENTAL(20)
;--- Imports
ImportC ""
g_type_check_instance(*instance)
g_type_name(Type)
g_type_name_from_instance(*instance)
g_type_name_from_class(*class)
EndImport
;--- Structures
Structure udtWebKitGadget
; PB ID's
Window.i
Gadget.i
; Widgets
Container.i
WebView.i
; Signal handle
signal_container_destroy.i
signal_container_size_allocate.i
signal_webkit_size_allocate.i
signal_webkit_ready_to_show.i
signal_load_changed.i
signal_mouse_target_changed.i
signal_load_failed.i
signal_load_failed_with_tls_errors.i
signal_web_process_crashed.i
signal_button_press_event.i
signal_permission_request.i
; Data
*Resource
HitTestURI.s
; User callback hit test
*HitTestCallback.WebKit_HitTestCallback
; User callback navigation
*NavigationCallback.WebKit_NavigationCallback
; Permission Request
*PermissionCallback.Webkit_PermissionCallback
; User callback get data
*GetDataCallback.WebKit_GetHtmlCodeCallback
; Last load failed
LoadError.WebKitLoadError
; Last load failed tls
LoadErrorTLS.WebKitLoadErrorTLS
EndStructure
Structure udtJavaScriptData
Gadget.i
ScriptID.i
*RunJavaScriptCallback.WebKit_RunJavaScriptCallback
EndStructure
;--- Prototypes
PrototypeC webkit_web_view_new()
PrototypeC webkit_web_view_load_uri(*web_view, url.p-utf8)
PrototypeC webkit_web_view_load_html(*web_view, content.p-utf8, base_uri.p-utf8);
PrototypeC webkit_web_view_get_uri(*web_view)
PrototypeC webkit_web_view_get_title(*web_view)
PrototypeC webkit_web_view_can_go_back(*web_view)
PrototypeC webkit_web_view_go_back(*web_view)
PrototypeC webkit_web_view_can_go_forward(*web_view)
PrototypeC webkit_web_view_go_forward(*web_view)
PrototypeC webkit_web_view_reload(*web_view)
PrototypeC webkit_web_view_stop_loading(*web_view)
PrototypeC webkit_hit_test_result_get_context(*hit_test_result)
PrototypeC webkit_hit_test_result_context_is_link(*hit_test_result)
PrototypeC webkit_hit_test_result_context_is_image(*hit_test_result)
PrototypeC webkit_hit_test_result_context_is_media(*hit_test_result)
PrototypeC webkit_hit_test_result_context_is_editable(*hit_test_result)
PrototypeC webkit_hit_test_result_context_is_selection(*hit_test_result)
PrototypeC webkit_hit_test_result_context_is_scrollbar(*hit_test_result)
PrototypeC webkit_hit_test_result_get_link_uri(*hit_test_result)
PrototypeC webkit_hit_test_result_get_link_title(*hit_test_result)
PrototypeC webkit_hit_test_result_get_link_label(*hit_test_result)
PrototypeC webkit_hit_test_result_get_image_uri(*hit_test_result)
PrototypeC webkit_hit_test_result_get_media_uri(*hit_test_result)
PrototypeC webkit_web_view_get_main_resource(*web_view) ; Result WebKitWebResource
PrototypeC webkit_web_resource_get_data(*resource, *cancellable, *callback, user_data)
PrototypeC webkit_web_resource_get_data_finish(*resource, *result, *length, *p_error);
PrototypeC webkit_permission_request_allow(*request)
PrototypeC webkit_permission_request_deny(*request)
PrototypeC webkit_web_view_get_settings(*web_view)
PrototypeC webkit_web_view_set_settings(*web_view, *settings)
PrototypeC webkit_settings_get_enable_javascript(*settings)
PrototypeC webkit_settings_set_enable_javascript(*settings, enabled)
PrototypeC webkit_settings_set_hardware_acceleration_policy(*settings, policy)
PrototypeC webkit_web_view_run_javascript(*web_view, script.p-utf8, *cancellable, *callback, user_data)
PrototypeC webkit_web_view_run_javascript_finish(*web_view, *result, *p_error) ; *js_result
PrototypeC webkit_javascript_result_unref (*js_result)
PrototypeC webkit_javascript_result_get_global_context(*js_result)
PrototypeC webkit_javascript_result_get_value(*js_result)
PrototypeC JSValueIsString(*context, value)
PrototypeC JSValueIsNumber(*context, value)
PrototypeC JSValueIsInt32(*context, value)
PrototypeC JSValueToStringCopy(*context, value, outException)
PrototypeC.d JSValueToNumber(*context, value, outException)
PrototypeC JSStringGetMaximumUTF8CStringSize(*js_str_value)
PrototypeC JSStringGetUTF8CString(*js_str_value, *str_value, str_length)
PrototypeC JSStringRelease(*js_str_value)
PrototypeC webkit_get_major_version()
PrototypeC webkit_get_minor_version()
PrototypeC webkit_get_micro_version()
Global IsWebkit2
; ----
Procedure InitModule()
Protected lib
lib = OpenLibrary(#PB_Any, "libwebkit2gtk-4.1.so.0")
If Not lib
lib = OpenLibrary(#PB_Any, "libwebkit2gtk-4.0.so")
EndIf
If lib
Global webkit_get_major_version.webkit_get_major_version = GetFunction(lib, "webkit_get_major_version")
Global webkit_get_minor_version.webkit_get_minor_version = GetFunction(lib, "webkit_get_minor_version")
Global webkit_get_micro_version.webkit_get_micro_version = GetFunction(lib, "webkit_get_micro_version")
Global webkit_web_view_new.webkit_web_view_new = GetFunction(lib, "webkit_web_view_new")
Global webkit_web_view_load_uri.webkit_web_view_load_uri = GetFunction(lib, "webkit_web_view_load_uri")
Global webkit_web_view_load_html.webkit_web_view_load_html = GetFunction(lib, "webkit_web_view_load_html")
Global webkit_web_view_get_uri.webkit_web_view_get_uri = GetFunction(lib, "webkit_web_view_get_uri")
Global webkit_web_view_get_title.webkit_web_view_get_title = GetFunction(lib, "webkit_web_view_get_title")
Global webkit_hit_test_result_get_context.webkit_hit_test_result_get_context = GetFunction(lib, "webkit_hit_test_result_get_context")
Global webkit_hit_test_result_context_is_link.webkit_hit_test_result_context_is_link = GetFunction(lib, "webkit_hit_test_result_context_is_link")
Global webkit_hit_test_result_context_is_image.webkit_hit_test_result_context_is_image = GetFunction(lib, "webkit_hit_test_result_context_is_image")
Global webkit_hit_test_result_context_is_media.webkit_hit_test_result_context_is_media = GetFunction(lib, "webkit_hit_test_result_context_is_media")
Global webkit_hit_test_result_context_is_editable.webkit_hit_test_result_context_is_editable = GetFunction(lib, "webkit_hit_test_result_context_is_editable")
Global webkit_hit_test_result_context_is_selection.webkit_hit_test_result_context_is_selection = GetFunction(lib, "webkit_hit_test_result_context_is_selection")
Global webkit_hit_test_result_context_is_scrollbar.webkit_hit_test_result_context_is_scrollbar = GetFunction(lib, "webkit_hit_test_result_context_is_scrollbar")
Global webkit_hit_test_result_get_link_uri.webkit_hit_test_result_get_link_uri = GetFunction(lib, "webkit_hit_test_result_get_link_uri")
Global webkit_hit_test_result_get_link_title.webkit_hit_test_result_get_link_title = GetFunction(lib, "webkit_hit_test_result_get_link_title")
Global webkit_hit_test_result_get_link_label.webkit_hit_test_result_get_link_label = GetFunction(lib, "webkit_hit_test_result_get_link_label")
Global webkit_hit_test_result_get_image_uri.webkit_hit_test_result_get_image_uri = GetFunction(lib, "webkit_hit_test_result_get_image_uri")
Global webkit_hit_test_result_get_media_uri.webkit_hit_test_result_get_media_uri = GetFunction(lib, "webkit_hit_test_result_get_media_uri")
Global webkit_web_view_can_go_back.webkit_web_view_can_go_back = GetFunction(lib, "webkit_web_view_can_go_back")
Global webkit_web_view_go_back.webkit_web_view_go_back = GetFunction(lib, "webkit_web_view_go_back")
Global webkit_web_view_can_go_forward.webkit_web_view_can_go_forward = GetFunction(lib, "webkit_web_view_can_go_forward")
Global webkit_web_view_go_forward.webkit_web_view_go_forward = GetFunction(lib, "webkit_web_view_go_forward")
Global webkit_web_view_reload.webkit_web_view_reload = GetFunction(lib, "webkit_web_view_reload")
Global webkit_web_view_stop_loading.webkit_web_view_stop_loading = GetFunction(lib, "webkit_web_view_stop_loading")
Global webkit_web_view_get_main_resource.webkit_web_view_get_main_resource = GetFunction(lib, "webkit_web_view_get_main_resource")
Global webkit_web_resource_get_data.webkit_web_resource_get_data = GetFunction(lib, "webkit_web_resource_get_data")
Global webkit_web_resource_get_data_finish.webkit_web_resource_get_data_finish = GetFunction(lib, "webkit_web_resource_get_data_finish")
Global webkit_permission_request_allow.webkit_permission_request_allow = GetFunction(lib, "webkit_permission_request_allow")
Global webkit_permission_request_deny.webkit_permission_request_deny = GetFunction(lib, "webkit_permission_request_deny")
Global webkit_web_view_get_settings.webkit_web_view_get_settings = GetFunction(lib, "webkit_web_view_get_settings")
Global webkit_web_view_set_settings.webkit_web_view_set_settings = GetFunction(lib, "webkit_web_view_set_settings")
Global webkit_settings_get_enable_javascript.webkit_settings_get_enable_javascript = GetFunction(lib, "webkit_settings_get_enable_javascript")
Global webkit_settings_set_enable_javascript.webkit_settings_set_enable_javascript = GetFunction(lib, "webkit_settings_set_enable_javascript")
Global webkit_settings_set_hardware_acceleration_policy.webkit_settings_set_hardware_acceleration_policy = GetFunction(lib, "webkit_settings_set_hardware_acceleration_policy")
Global webkit_web_view_run_javascript.webkit_web_view_run_javascript = GetFunction(lib, "webkit_web_view_run_javascript")
Global webkit_web_view_run_javascript_finish.webkit_web_view_run_javascript_finish = GetFunction(lib, "webkit_web_view_run_javascript_finish")
Global webkit_javascript_result_unref.webkit_javascript_result_unref = GetFunction(lib, "webkit_javascript_result_unref")
Global webkit_javascript_result_get_global_context.webkit_javascript_result_get_global_context = GetFunction(lib, "webkit_javascript_result_get_global_context")
Global webkit_javascript_result_get_value.webkit_javascript_result_get_value = GetFunction(lib, "webkit_javascript_result_get_value")
Global webkit_user_media_permission_is_for_audio_device.webkit_user_media_permission_is_for_audio_device = GetFunction(lib, "webkit_user_media_permission_is_for_audio_device")
Global webkit_user_media_permission_is_for_video_device.webkit_user_media_permission_is_for_video_device = GetFunction(lib, "webkit_user_media_permission_is_for_video_device")
; Java
Global JSValueIsString.JSValueIsString = GetFunction(lib, "JSValueIsString")
Global JSValueIsNumber.JSValueIsNumber = GetFunction(lib, "JSValueIsNumber")
Global JSValueIsInt32.JSValueIsInt32 = GetFunction(lib, "JSValueIsInt32")
Global JSValueToStringCopy.JSValueToStringCopy = GetFunction(lib, "JSValueToStringCopy")
Global JSValueToNumber.JSValueToNumber = GetFunction(lib, "JSValueToNumber")
Global JSStringGetMaximumUTF8CStringSize.JSStringGetMaximumUTF8CStringSize = GetFunction(lib, "JSStringGetMaximumUTF8CStringSize")
Global JSStringGetUTF8CString.JSStringGetUTF8CString = GetFunction(lib, "JSStringGetUTF8CString")
Global JSStringRelease.JSStringRelease = GetFunction(lib, "JSStringRelease")
IsWebkit2 = #True
ProcedureReturn #True
Else
IsWebkit2 = #False
ProcedureReturn #False
EndIf
EndProcedure : InitModule()
; ----
Declare WebKit_Destroy(*GadgetData.udtWebKitGadget)
ProcedureC _signal_container_destroy_cb(*Self.GtkWidget, *GadgetData.udtWebKitGadget)
If *GadgetData
;Debug "Destroy Webview"
WebKit_Destroy(*GadgetData)
;Debug "Release GadgetData"
FreeStructure(*GadgetData)
EndIf
EndProcedure
; ----
ProcedureC _signal_container_size_allocate_cb(*Self.GtkWidget, *Allocation.GtkAllocation,*GadgetData.udtWebKitGadget)
Protected ParentAllocation.GtkAllocation
With *GadgetData
If *GadgetData
*Allocation\x = 0
*Allocation\y = 0
*Allocation\width - 0
*Allocation\height - 8
gtk_widget_size_allocate_(*GadgetData\WebView, *Allocation)
EndIf
EndWith
EndProcedure
; ----
ProcedureC _signal_webkit_ready_to_show_cb(*Self.GtkWidget, *GadgetData.udtWebKitGadget)
With *GadgetData
Debug "WebKit Ready"
EndWith
EndProcedure
; ----
ProcedureC _signal_webkit_size_allocate_cb(*Self.GtkWidget, *Allocation.GtkAllocation,*GadgetData.udtWebKitGadget)
Protected ParentAllocation.GtkAllocation
With *GadgetData
;Debug "WebKit dx = " + *Allocation\width
EndWith
EndProcedure
; ----
ProcedureC _signal_load_changed_cb(*web_view, load_event, *GadgetData.udtWebKitGadget)
With *GadgetData
Select load_event
Case #WEBKIT_LOAD_STARTED
PostEvent(#PB_Event_Gadget, \Window, \Gadget, #PB_Eventtype_WebLoadStarted)
Case #WEBKIT_LOAD_COMMITTED
PostEvent(#PB_Event_Gadget, \Window, \Gadget, #PB_Eventtype_WebLoadCommitted)
Case #WEBKIT_LOAD_REDIRECTED
PostEvent(#PB_Event_Gadget, \Window, \Gadget, #PB_Eventtype_WebLoadRedirected)
Case #WEBKIT_LOAD_FINISHED
PostEvent(#PB_Event_Gadget, \Window, \Gadget, #PB_Eventtype_WebLoadFinished)
EndSelect
EndWith
EndProcedure
; ----
ProcedureC _signal_mouse_target_changed_cb(*web_view, *hit_test_result, modifiers, *GadgetData.udtWebKitGadget)
Protected gint, *gchar, text.s
gint = webkit_hit_test_result_get_context(*hit_test_result)
With *GadgetData
If *GadgetData
If gint & #WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK
*gchar = webkit_hit_test_result_get_link_uri(*hit_test_result)
\HitTestURI = PeekS(*gchar, -1, #PB_UTF8)
If \HitTestCallback
\HitTestCallback(\Gadget, #WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK, \HitTestURI)
EndIf
Else
\HitTestURI = ""
EndIf
If \HitTestCallback
If gint & #WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE
*gchar = webkit_hit_test_result_get_image_uri(*hit_test_result)
text = PeekS(*gchar, -1, #PB_UTF8)
\HitTestCallback(\Gadget, #WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE, text)
EndIf
If gint & #WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA
*gchar = webkit_hit_test_result_get_media_uri(*hit_test_result)
text = PeekS(*gchar, -1, #PB_UTF8)
\HitTestCallback(\Gadget, #WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA, text)
EndIf
If gint & #WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR
\HitTestCallback(\Gadget, #WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR, "")
EndIf
If gint & #WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION
\HitTestCallback(\Gadget, #WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION, "")
EndIf
If gint = #WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT
\HitTestCallback(\Gadget, #WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT, "")
EndIf
EndIf
EndIf
EndWith
EndProcedure
; ----
ProcedureC _signal_load_failed_cb(*web_view, load_event, *failing_uri, *error.gerror, *GadgetData.udtWebKitGadget)
With *GadgetData
\LoadError\Link = PeekS(*failing_uri, -1, #PB_UTF8)
\LoadError\Code = *error\code
\LoadError\Message + PeekS(*error\message, -1, #PB_UTF8)
PostEvent(#PB_Event_Gadget, \Window, \Gadget, #PB_Eventtype_WebLoadFailed, @\LoadError)
EndWith
ProcedureReturn #True
EndProcedure
; ----
ProcedureC _signal_load_failed_with_tls_errors_cb(*web_view, *failing_uri, *certificate, errors, *GadgetData.udtWebKitGadget)
With *GadgetData
\LoadErrorTLS\Link = PeekS(*failing_uri, -1, #PB_UTF8)
\LoadErrorTLS\Errors = errors
\LoadErrorTLS\Certificate = *certificate
PostEvent(#PB_Event_Gadget, \Window, \Gadget, #PB_Eventtype_WebLoadFailedTLS, @\LoadErrorTLS)
EndWith
ProcedureReturn #False
EndProcedure
; ----
ProcedureC _signal_web_process_crashed_cb(*web_view, *GadgetData.udtWebKitGadget)
With *GadgetData
PostEvent(#PB_Event_Gadget, \Window, \Gadget, #PB_EventType_WebProcessCrashed)
webkit_web_view_load_html(*web_view, "Web Process Crashed!", "")
EndWith
ProcedureReturn #True
EndProcedure
; ----
ProcedureC _signal_button_press_event_cb(*web_view, *Event.GdkEventButton, *WidgetData.udtWebKitGadget)
With *WidgetData
If *Event\button = 1 And \HitTestURI <> ""
If \NavigationCallback
If FindString(\HitTestURI, "://")
If \NavigationCallback(\Gadget, \HitTestURI)
webkit_web_view_load_uri(*web_view, *WidgetData\HitTestURI)
Else
ProcedureReturn 1; Botton process finished
EndIf
EndIf
EndIf
EndIf
ProcedureReturn 0 ; Botton process continue
EndWith
EndProcedure
; ----
ProcedureC _signal_permission_request_cb(*web_view, *request.gobject, *GadgetData.udtWebKitGadget)
Protected r1, *instance_name, request_name.s
With *GadgetData
If \PermissionCallback
If Not g_type_check_instance(*request\g_type_instance)
ProcedureReturn #True
EndIf
*instance_name = g_type_name_from_instance(*request\g_type_instance)
If Not *instance_name
ProcedureReturn #True
EndIf
request_name = PeekS(*instance_name, -1, #PB_UTF8)
If \PermissionCallback(\Gadget, request_name, *request)
webkit_permission_request_allow(*request)
ProcedureReturn #True
EndIf
EndIf
webkit_permission_request_deny(*request)
EndWith
ProcedureReturn #True
EndProcedure
; ----
ProcedureC _get_response_data_finish_cb(*resource, *result, *GadgetData.udtWebKitGadget)
Protected HtmlResult.s, *guchar, length.i, *error.gerror
With *GadgetData
*guchar = webkit_web_resource_get_data_finish(*resource, *result, @length, @*error)
If *guchar
If \GetDataCallback
HtmlResult = PeekS(*guchar, length, #PB_UTF8)
\GetDataCallback(\Gadget, #True, HtmlResult)
EndIf
g_free_(*guchar)
Else
HtmlResult = PeekS(*error\message, -1, #PB_UTF8)
g_error_free_(*error)
If \GetDataCallback
HtmlResult = PeekS(*guchar, length, #PB_UTF8)
\GetDataCallback(\Gadget, #False, HtmlResult)
EndIf
EndIf
EndWith
EndProcedure
; ----
ProcedureC _web_view_javascript_finished_cb(*object, *result, *ScriptData.udtJavaScriptData)
Protected JavaResult.s, *js_result, *error.gerror
Protected *context, value, *js_str_value, *str_value, str_length, dbl_value.d, int_value.i
With *ScriptData
*js_result = webkit_web_view_run_javascript_finish(*object, *result, @*error)
If *js_result
*context = webkit_javascript_result_get_global_context(*js_result);
value = webkit_javascript_result_get_value(*js_result);
If value
*js_str_value = JSValueToStringCopy(*context, value, #Null);
If *js_str_value
str_length = JSStringGetMaximumUTF8CStringSize(*js_str_value);
*str_value = g_malloc_(str_length);
JSStringGetUTF8CString(*js_str_value, *str_value, str_length);
JSStringRelease(*js_str_value) ;
JavaResult = PeekS(*str_value, -1, #PB_UTF8)
g_free_(*str_value)
EndIf
Else
JavaResult = "Java Value is Nil"
EndIf
webkit_javascript_result_unref(*js_result)
If \RunJavaScriptCallback
\RunJavaScriptCallback(\Gadget, #True, \ScriptID, JavaResult)
EndIf
Else
JavaResult = PeekS(*error\message, -1, #PB_UTF8)
g_error_free_(*error)
If \RunJavaScriptCallback
\RunJavaScriptCallback(\Gadget, #False, \ScriptID, JavaResult)
EndIf
EndIf
EndWith
FreeStructure(*ScriptData)
EndProcedure
; ----
Procedure WebKit_LoadURI(Gadget, URI.s)
Protected r1, *GadgetData.udtWebKitGadget
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
r1 = webkit_web_view_load_uri(*GadgetData\WebView, URI)
EndIf
ProcedureReturn r1
EndProcedure
; ----
Procedure WebKit_LoadHTML(Gadget, Content.s, Base_URI.s = "localhost")
Protected r1, *GadgetData.udtWebKitGadget
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
r1 = webkit_web_view_load_html(*GadgetData\WebView, Content, Base_URI)
EndIf
ProcedureReturn r1
EndProcedure
; ----
Procedure WebKit_LoadFile(Gadget, FileName.s)
Protected r1, file.s, *GadgetData.udtWebKitGadget
If FileSize(FileName) > 0
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
file = "file://" + FileName
r1 = webkit_web_view_load_uri(*GadgetData\WebView, file)
EndIf
EndIf
ProcedureReturn r1
EndProcedure
; ----
Procedure.s WebKit_GetURI(Gadget)
Protected s1.s, *gchar, *GadgetData.udtWebKitGadget
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
*gchar = webkit_web_view_get_uri(*GadgetData\WebView)
If *gchar
s1 = PeekS(*gchar, -1, #PB_Ascii)
EndIf
EndIf
ProcedureReturn s1
EndProcedure
; ----
Procedure.s WebKit_GetTitle(Gadget)
Protected s1.s, *gchar, *GadgetData.udtWebKitGadget
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
*gchar = webkit_web_view_get_title(*GadgetData\WebView)
If *gchar
s1 = PeekS(*gchar, -1, #PB_Ascii)
EndIf
EndIf
ProcedureReturn s1
EndProcedure
; ----
Procedure WebKit_SetHitTestCallback(Gadget, *Callback.WebKit_HitTestCallback)
Protected *GadgetData.udtWebKitGadget
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
*GadgetData\HitTestCallback = *Callback
EndIf
EndProcedure
; ----
Procedure WebKit_SetNavigationCallback(Gadget, *Callback.WebKit_NavigationCallback)
Protected *GadgetData.udtWebKitGadget
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
*GadgetData\NavigationCallback = *Callback
EndIf
EndProcedure
; ----
Procedure WebKit_SetPermissionCallback(Gadget, *Callback.Webkit_PermissionCallback)
Protected *GadgetData.udtWebKitGadget
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
*GadgetData\PermissionCallback = *Callback
EndIf
EndProcedure
; ----
Procedure WebKit_GetHtmlCode(Gadget, *Callback.WebKit_GetHtmlCodeCallback)
Protected r1, *GadgetData.udtWebKitGadget
With *GadgetData
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
\Resource = webkit_web_view_get_main_resource(\WebView)
If \Resource
\GetDataCallback = *Callback
webkit_web_resource_get_data(\Resource, 0, @_get_response_data_finish_cb(), *GadgetData)
r1 = #True
EndIf
EndIf
EndWith
ProcedureReturn r1
EndProcedure
; ----
Procedure WebKit_RunJavaScript(Gadget, ScriptID, JavaScript.s, *Callback.WebKit_RunJavaScriptCallback)
Protected *GadgetData.udtWebKitGadget, *ScriptData.udtJavaScriptData
Protected r1
With *GadgetData
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
*ScriptData = AllocateStructure(udtJavaScriptData)
If *ScriptData
*ScriptData\Gadget = \Gadget
*ScriptData\ScriptID = ScriptID
*ScriptData\RunJavaScriptCallback = *Callback
webkit_web_view_run_javascript(\WebView, JavaScript, #Null, @_web_view_javascript_finished_cb(), *ScriptData)
r1 = #True
EndIf
EndIf
EndWith
ProcedureReturn r1
EndProcedure
; ----
Procedure WebKit_DisableJavaScript(Gadget, State)
Protected *GadgetData.udtWebKitGadget, *settings
Protected r1
With *GadgetData
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
*settings = webkit_web_view_get_settings(*GadgetData\WebView)
If State
webkit_settings_set_enable_javascript(*settings, #False)
Else
webkit_settings_set_enable_javascript(*settings, #True)
EndIf
EndIf
EndWith
EndProcedure
; ----
Procedure WebKit_IsEnableJavaScript(Gadget)
Protected *GadgetData.udtWebKitGadget, *settings
Protected r1
With *GadgetData
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
*settings = webkit_web_view_get_settings(*GadgetData\WebView)
r1 = webkit_settings_get_enable_javascript(*settings)
EndIf
EndWith
ProcedureReturn r1
EndProcedure
; ----
Procedure WebKit_GetProperty(Gadget, Property.s, *Value.gvalue)
Protected *GadgetData.udtWebKitGadget, *settings
Protected r1, value.gvalue
With *GadgetData
If *value
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
*settings = webkit_web_view_get_settings(*GadgetData\WebView)
g_object_get_property_(*settings, Property, *value)
r1 = *Value\g_type
EndIf
EndIf
EndWith
ProcedureReturn r1
EndProcedure
; ----
Procedure WebKit_SetProperty(Gadget, Property.s, *Value.gvalue)
Protected *GadgetData.udtWebKitGadget, *settings
Protected r1, value.gvalue
With *GadgetData
If *value
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
*settings = webkit_web_view_get_settings(*GadgetData\WebView)
r1 =g_object_set_property_(*settings, Property, *value)
EndIf
EndIf
EndWith
ProcedureReturn r1
EndProcedure
; ----
Procedure WebKit_SetAcceleration(Gadget, Policy)
Protected webview, *settings
Select GadgetType(gadget)
Case #PB_GadgetType_Web
webview = GadgetID(Gadget)
Case #PB_GadgetType_WebView
webview = gtk_bin_get_child_(GadgetID(Gadget))
Default
ProcedureReturn 0
EndSelect
*settings = webkit_web_view_get_settings(webview)
webkit_settings_set_hardware_acceleration_policy(*settings, Policy)
EndProcedure
; ----
Procedure WebKit_GoBack(Gadget)
Protected *GadgetData.udtWebKitGadget
If IsGadget(Gadget)
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
If webkit_web_view_can_go_back(*GadgetData\WebView)
webkit_web_view_go_back(*GadgetData\WebView)
EndIf
EndIf
EndIf
EndProcedure
; ----
Procedure WebKit_GoForward(Gadget)
Protected *GadgetData.udtWebKitGadget
If IsGadget(Gadget)
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
If webkit_web_view_can_go_forward(*GadgetData\WebView)
webkit_web_view_go_forward(*GadgetData\WebView)
EndIf
EndIf
EndIf
EndProcedure
; ----
Procedure WebKit_Reload(Gadget)
Protected *GadgetData.udtWebKitGadget
If IsGadget(Gadget)
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
webkit_web_view_reload(*GadgetData\WebView)
EndIf
EndIf
EndProcedure
; ----
Procedure WebKit_StopLoading(Gadget)
Protected *GadgetData.udtWebKitGadget
If IsGadget(Gadget)
*GadgetData = GetGadgetData(Gadget)
If *GadgetData
webkit_web_view_stop_loading(*GadgetData\WebView)
EndIf
EndIf
EndProcedure
;-- NewWebView
Procedure MyWebViewGadget(Gadget, x, y, Width, Height, url.s, Flags = 0)
Static Init
Protected r1, id, *GadgetData.udtWebKitGadget, cancel
If Not IsWebkit2
ProcedureReturn 0
EndIf
id = ContainerGadget(Gadget, x, y, Width, Height, Flags)
If Not id
ProcedureReturn 0
EndIf
CloseGadgetList()
If Gadget = #PB_Any
Gadget = id
EndIf
*GadgetData = AllocateStructure(udtWebKitGadget)
If Not *GadgetData
FreeGadget(Gadget)
ProcedureReturn 0
EndIf
With *GadgetData
\Gadget = Gadget
\Container = GadgetID(Gadget)
\Window = g_object_get_data_(gtk_widget_get_toplevel_(\Container), "pb_id")
\WebView = webkit_web_view_new()
If \WebView
If Not Init
Init = #True
g_object_ref_(\WebView)
EndIf
gtk_container_add_(\Container, \WebView)
gtk_widget_show_(\WebView)
If url
r1 = webkit_web_view_load_uri(\WebView, url)
EndIf
; Set gadget data
SetGadgetData(Gadget, *GadgetData)
; Bind Signals
\signal_container_destroy = g_signal_connect_(\Container, "destroy", @_signal_container_destroy_cb(), *GadgetData)
\signal_container_size_allocate = g_signal_connect_(\Container, "size-allocate", @_signal_container_size_allocate_cb(), *GadgetData)
\signal_webkit_ready_to_show = g_signal_connect_(\WebView, "ready-to-show", @_signal_webkit_ready_to_show_cb(), *GadgetData)
\signal_webkit_size_allocate = g_signal_connect_(\WebView, "size-allocate", @_signal_webkit_size_allocate_cb(), *GadgetData)
\signal_load_changed = g_signal_connect_(\WebView, "load-changed", @_signal_load_changed_cb(), *GadgetData)
\signal_mouse_target_changed = g_signal_connect_(\WebView, "mouse-target-changed", @_signal_mouse_target_changed_cb(), *GadgetData)
\signal_load_failed = g_signal_connect_(\WebView, "load-failed", @_signal_load_failed_cb(), *GadgetData)
\signal_load_failed_with_tls_errors = g_signal_connect_(\WebView, "load-failed-with-tls-errors", @_signal_load_failed_with_tls_errors_cb(), *GadgetData)
\signal_web_process_crashed = g_signal_connect_(\WebView, "web-process-crashed", @_signal_web_process_crashed_cb(), *GadgetData)
\signal_button_press_event = g_signal_connect_(\WebView, "button-press-event", @_signal_button_press_event_cb(), *GadgetData)
\signal_permission_request = g_signal_connect_(\WebView, "permission-request", @_signal_permission_request_cb(), *GadgetData)
ProcedureReturn id
Else
FreeGadget(Gadget)
FreeStructure(*GadgetData)
ProcedureReturn 0
EndIf
EndWith
EndProcedure
; ----
Procedure.s WebKit_GetVersion()
ProcedureReturn Str(webkit_get_major_version()) + "." + Str(webkit_get_minor_version()) + "." + Str(webkit_get_micro_version())
EndProcedure
; ----
Procedure WebKit_Destroy(*GadgetData.udtWebKitGadget)
If Not *GadgetData
ProcedureReturn 0
EndIf
With *GadgetData
; Unbind Signals
If g_signal_handler_is_connected_(\Container, \signal_container_size_allocate)
g_signal_handler_disconnect_(\Container, \signal_container_size_allocate)
EndIf
If g_signal_handler_is_connected_(\Container, \signal_container_destroy)
g_signal_handler_disconnect_(\Container, \signal_container_destroy)
EndIf
If g_signal_handler_is_connected_(\WebView, \signal_webkit_size_allocate)
g_signal_handler_disconnect_(\WebView, \signal_webkit_size_allocate)
EndIf
If g_signal_handler_is_connected_(\WebView, \signal_load_changed)
g_signal_handler_disconnect_(\WebView, \signal_load_changed)
EndIf
If g_signal_handler_is_connected_(\WebView, \signal_mouse_target_changed)
g_signal_handler_disconnect_(\WebView, \signal_mouse_target_changed)
EndIf
If g_signal_handler_is_connected_(\WebView, \signal_load_failed)
g_signal_handler_disconnect_(\WebView, \signal_load_failed)
EndIf
If g_signal_handler_is_connected_(\WebView, \signal_load_failed_with_tls_errors)
g_signal_handler_disconnect_(\WebView, \signal_load_failed_with_tls_errors)
EndIf
If g_signal_handler_is_connected_(\WebView, \signal_web_process_crashed)
g_signal_handler_disconnect_(\WebView, \signal_web_process_crashed)
EndIf
If g_signal_handler_is_connected_(\WebView, \signal_button_press_event)
g_signal_handler_disconnect_(\WebView, \signal_button_press_event)
EndIf
gtk_container_remove_(\Container, \WebView)
EndWith
EndProcedure
; ----
EndModule
; ****