- New: WebGadget EventTypes
- New: WebGadget HitTest Callback
- WebKit_LoadHTML
- WebKit_LoadFile
- WebKit_GetHtmlCode ; Get resource data asynchronous. With synchron not longer work!
Update v1.01.2
- Fix: Now send event with right window id
Update v1.2.1
- Added: #PB_Eventtype_WebLoadFailed ; Detail over EventData()
- Added: #PB_Eventtype_WebLoadFailedTLS ; Detail over EventData()
Update v1.03.2
- Added: WebKit_RunJavaScript(...)
- Added: #PB_EventType_WebRunJavaScriptFinished
- Added: #PB_EventType_WebRunJavaScriptFailed
Update v1.03.3
- WebKit_RunJavaScript added optional parameter ScriptID. Use EventData() to get ScriptID
Update v1.04.1
- Remove WebKit_GetDataAsynchron
- Remove Webkit_GetDataHTML
- Remove #PB_EventType_WebGetDataFinished
- Added WebKit_GetHtmlCode(Gadget, *Callback.WebKit_GetHtmlCodeCallback)
- ----
- Remove #PB_EventType_WebRunJavaScriptFinished
- Remove #PB_EventType_WebRunJavaScriptFailed
- Change WebKit_RunJavaScript(Gadget, ScriptID, JavaScript.s, *Callback.WebKit_RunJavaScriptCallback)
- ----
- Added WebKit_DisableJavaScript(Gadget, State)
- Added WebKit_IsEnableJavaScript(Gadget)
Update v1.05.1
- Added WebKit_SetNavigationCallback(Gadget, *Callback.Webkit_NavigationCallback)
* This fixed too the "web-process-crashed" on Raspberry Arm64 the click on a link
Update v1.06.2
- Added #PB_EventType_WebProcessCrashed
Update v1.06.3
- Bugfix: Forgot some 'ProcedureC' for callback
Update v1.06.4
- Added WebKit_SetAcceleration(Gadget, Policy)
Update v1.06.6
- Added WebViewGadget
- Optimize Java Result
Update v1.06.7
- Added Settings Get/SetProperty
- Added SetPermissionCallback
- Update Example
Update v1.06.8
- Change: Query the permission request name for better gobject checking
WebGadgetEx.pb
Code: Select all
;-TOP
; Comment : WebGadgetEx (GTK3)
; Compiler: Purebasic v6.xx (Ubuntu 20.04 LTS, Raspberry PI)
; Author : mk-soft
; File : WebGadgetEx.pb
; Version : v1.06.8
; Create : 26.11.2021
; Update : 03.03.2024
; Link : https://www.purebasic.fr/english/viewtopic.php?t=78274
; ---------------------
; Linux Libraries (deb)
; sudo apt-get install libwebkit2gtk-4.0
; sudo apt-get install libwebkit2gtk-4.0-dev
; Syntax Callback:
; - HitTestCallback(Gadget, Type, Text.s)
; - NavigationCallback(Gadget, URI.s)
; * Return true to enable load uri
; - GetHtmlCodeCallback(Gadget, State, HtmlCode.s)
; - RunJavaScriptCallback(Gadget, State, ScriptID, JavaResult.s)
; *********************
DeclareModule WebKit2
ImportC ""
webkit_user_media_permission_is_for_audio_device(*request)
webkit_user_media_permission_is_for_video_device(*request)
EndImport
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
Structure WebKitLoadError
Link.s
Code.i
Message.s
EndStructure
Structure WebKitLoadErrorTLS
Link.s
Errors.i
*Certificate
EndStructure
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 WebKit_Init(Gadget)
Declare WebKit_Free(Gadget)
Declare WebKit_LoadURI(Gadget, URI.s)
Declare WebKit_LoadHTML(Gadget, content.s, base_uri.s = "localhost")
Declare WebKit_LoadFile(Gadget, FileName.s)
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)
EndDeclareModule
Module WebKit2
EnableExplicit
; ---- Force compiler to link webkit
If 0 : WebGadget(0, 0, 0, 0, 0, "") : EndIf
; ----
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)
; ----
ImportC ""
webkit_web_view_new()
webkit_web_view_load_uri(*web_view, url.p-utf8)
webkit_web_view_load_html(*web_view, content.p-utf8, base_uri.p-utf8);
webkit_web_view_get_uri(*web_view)
webkit_web_view_get_title(*web_view)
webkit_hit_test_result_get_context(*hit_test_result)
webkit_hit_test_result_context_is_link(*hit_test_result)
webkit_hit_test_result_context_is_image(*hit_test_result)
webkit_hit_test_result_context_is_media(*hit_test_result)
webkit_hit_test_result_context_is_editable(*hit_test_result)
webkit_hit_test_result_context_is_selection(*hit_test_result)
webkit_hit_test_result_context_is_scrollbar(*hit_test_result)
webkit_hit_test_result_get_link_uri(*hit_test_result)
webkit_hit_test_result_get_link_title(*hit_test_result)
webkit_hit_test_result_get_link_label(*hit_test_result)
webkit_hit_test_result_get_image_uri(*hit_test_result)
webkit_hit_test_result_get_media_uri(*hit_test_result)
webkit_permission_request_allow(*request)
webkit_permission_request_deny(*request)
webkit_web_view_get_main_resource(*web_view) ; Result WebKitWebResource
webkit_web_resource_get_data(*resource, *cancellable, *callback, user_data)
webkit_web_resource_get_data_finish(*resource, *result, *length, *p_error)
webkit_web_view_get_settings(*web_view)
webkit_web_view_set_settings(*web_view, *settings)
webkit_settings_get_enable_javascript(*settings)
webkit_settings_set_enable_javascript(*settings, enabled)
webkit_settings_set_hardware_acceleration_policy(*settings, policy)
webkit_web_view_run_javascript(*web_view, script.p-utf8, *cancellable, *callback, user_data)
webkit_web_view_run_javascript_finish(*web_view, *result, *p_error) ; *js_result
webkit_javascript_result_unref (*js_result)
webkit_javascript_result_get_global_context(*js_result)
webkit_javascript_result_get_value(*js_result)
JSValueIsString(*context, value)
JSValueIsNumber(*context, value)
JSValueIsInt32(*context, value)
JSValueToStringCopy(*context, value, outException)
JSValueToNumber.d(*context, value, outException)
JSStringGetMaximumUTF8CStringSize(*js_str_value)
JSStringGetUTF8CString(*js_str_value, *str_value, str_length)
JSStringRelease(*js_str_value)
; gobject
g_type_check_instance(*instance)
g_type_name(Type)
g_type_name_from_instance(*Instance)
g_type_name_from_class(*Class)
EndImport
; ----
Structure udtWebKitGadget
; Widgets
Window.i
Gadget.i
WebView.i
; Signal handle
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
; ----
Global NewMap mapWebKitGadget.udtWebKitGadget()
; ----
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 \NavigationCallback(\Gadget, \HitTestURI)
webkit_web_view_load_uri(*web_view, *WidgetData\HitTestURI)
EndIf
Else
webkit_web_view_load_uri(*web_view, *WidgetData\HitTestURI)
EndIf
ProcedureReturn 1 ; Button process finished
Else
ProcedureReturn 0 ; Botton process continue
EndIf
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_Init(Gadget)
Protected r1, *GadgetData.udtWebKitGadget, cancel
If Not (GadgetType(Gadget) = #PB_GadgetType_Web Or GadgetType(Gadget) = 35); #PB_GadgetType_WebView)
ProcedureReturn 0
EndIf
*GadgetData = AddMapElement(mapWebKitGadget(), Str(Gadget))
If Not *GadgetData
ProcedureReturn 0
EndIf
With *GadgetData
\Gadget = Gadget
Select GadgetType(Gadget)
Case #PB_GadgetType_Web
\WebView = GadgetID(Gadget)
Case 35;#PB_GadgetType_WebView
\WebView = gtk_bin_get_child_(GadgetID(Gadget))
EndSelect
\Window = g_object_get_data_(gtk_widget_get_toplevel_(\WebView), "pb_id")
; Bind Signals
\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)
EndWith
ProcedureReturn *GadgetData
EndProcedure
; ----
Procedure WebKit_Free(Gadget)
Protected *GadgetData.udtWebKitGadget
*GadgetData = FindMapElement(mapWebKitGadget(), Str(Gadget))
If Not *GadgetData
ProcedureReturn 0
EndIf
With *GadgetData
; Unbind Signals
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
DeleteMapElement(mapWebKitGadget())
EndWith
EndProcedure
; ----
Procedure WebKit_LoadURI(Gadget, URI.s)
Protected r1, *GadgetData.udtWebKitGadget
*GadgetData = FindMapElement(mapWebKitGadget(), Str(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 = FindMapElement(mapWebKitGadget(), Str(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 = FindMapElement(mapWebKitGadget(), Str(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 = FindMapElement(mapWebKitGadget(), Str(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 = FindMapElement(mapWebKitGadget(), Str(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 = FindMapElement(mapWebKitGadget(), Str(Gadget))
If *GadgetData
*GadgetData\HitTestCallback = *Callback
EndIf
EndProcedure
; ----
Procedure WebKit_SetNavigationCallback(Gadget, *Callback.WebKit_NavigationCallback)
Protected *GadgetData.udtWebKitGadget
*GadgetData = FindMapElement(mapWebKitGadget(), Str(Gadget))
If *GadgetData
*GadgetData\NavigationCallback = *Callback
EndIf
EndProcedure
; ----
Procedure WebKit_SetPermissionCallback(Gadget, *Callback.Webkit_PermissionCallback)
Protected *GadgetData.udtWebKitGadget
*GadgetData = FindMapElement(mapWebKitGadget(), Str(Gadget))
If *GadgetData
*GadgetData\PermissionCallback = *Callback
EndIf
EndProcedure
; ----
Procedure WebKit_GetHtmlCode(Gadget, *Callback.WebKit_GetHtmlCodeCallback)
Protected r1, *GadgetData.udtWebKitGadget
With *GadgetData
*GadgetData = FindMapElement(mapWebKitGadget(), Str(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 = FindMapElement(mapWebKitGadget(), Str(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 = FindMapElement(mapWebKitGadget(), Str(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 = FindMapElement(mapWebKitGadget(), Str(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 = FindMapElement(mapWebKitGadget(), Str(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 = FindMapElement(mapWebKitGadget(), Str(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 35; #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
EndModule
; ****