[webkit-gtk] Calling a native (compiled) subprogram from JavaScript in WebKitGTK
Leo Ufimtsev
Leonidas at redhat.com
Wed Sep 13 08:46:48 PDT 2017
Hello Ludovic,
I'm doing something similar right now.
For webkit2:
- you need to compile a webextension
- The web extension deals with interacting with javascript
- You'd have to use gdbus to communicate with main process.
I have a few snippets that implement the above:
- Basic webextension:
https://github.com/LeoUfimtsev/LeoGtk3/tree/master/snip_Webkit_ExtensionMinimum
- Basic webextension, where javascript calls are handled by c:
https://github.com/LeoUfimtsev/LeoGtk3/tree/master/snip_Webkit_ExtensionJavascriptCoreFunc
- Basic GDbus snippet:
https://github.com/LeoUfimtsev/LeoGtk3/tree/master/snip_GDBus
- Basic webkextension, where javascript calls C and C reached main process
over GDBus:
https://github.com/LeoUfimtsev/LeoGtk3/tree/master/snip_Webkit_Ext_JSC_GDBus
It's a lot of work, but currently afaik the only way of doing it.
Let me know if you have any questions about the above.
On Tue, Sep 12, 2017 at 10:29 AM, Ludovic Brenta <ludovic at ludovic-brenta.org
> wrote:
> Hello,
>
> I am extending a multi-million-line-of-code application written
> in Ada with a new WebKitGTK browser window, using the WebKit2GTK
> API.
>
> After reading [1] and [2] I am trying to expose an Ada (or C,
> C++, Vala, whatever) subprogram to the JavaScript engine in
> WebKit, so that JavaScript code can call it.
>
> [1] http://www.davedoesdev.com/wrapping-webkit-part-1-gtk+-vala/
> [2] https://karhm.com/JavaScriptCore_C_API/
>
> The gist of it is: attach a callback to the "load-changed" signal
> of the WebKitWebView. If the Load_Event is "finished", create a
> new function object (by calling JSObjectMakeFunctionWithCallback);
> add to the global object of the WebView a new property whose name
> is the name of the function as seen from JavaScript and the value
> is the function object.
>
> If I try to call the function thus exported (and aptly named
> "exported"), the JavaScript engine throws:
>
> ReferenceError: Can't find variable: exported
>
> I am suspecting that I'm attaching the property to the wrong
> global object. Since I'm stuck with Red Hat Enterprise Linux
> and the webkitgtk3-devel-2.4.9-6.el7.x86_64 package, I have no
> debugging info available for WebKit itself (only for the host
> application), so I can't easily debug what's happening. All I
> can tell for sure is that Get_Javascript_Global_Context,
> Get_Global_Object, String.To_JavaScript etc all return non-null
> and that Exceptions remain null after the call to Set_Property.
> Am I doing something wrong? Is this feature even supported with
> WebKit2 or should I switch to the deprecated WebKit 1 that does not
> use a separate process?
>
> type Attribute_T is (None, Read_Only, Dont_Enum, Dont_Delete);
> type Attributes_T is array (Attribute_T) of Boolean with Pack, Size =>
> Interfaces.C.unsigned'Size;
>
> function Get_Global_Object (Ctx : in Context_T) return T
> with Convention => C, Import, External_Name =>
> "JSContextGetGlobalObject";
>
> procedure Set_Property (Ctx : in Context_T;
> Object : in T;
> Property_Name : in String.T;
> New_Value : in Value.T;
> Attributes : in Attributes_T;
> Exceptions : out Value.T)
> with Convention => C, Import, External_Name => "JSObjectSetProperty";
>
> type Callback_T is access function (Ctx : in Context_T;
> Func : in T;
> This : in T;
> Argument_Count : in
> Interfaces.C.size_t;
> Arguments : in
> Value.Arrays.Pointer;
> Exceptions : out Value.T)
> return Value.T with Convention => C;
>
> function Make_Function_With_Callback (Ctx : in Context_T; Name : in
> String.T; Callback : in Callback_T) return T
> with Convention => C, Import, External_Name =>
> "JSObjectMakeFunctionWithCallback";
>
> procedure Export_Ada_Function_To_Javascript (Ctx : in
> Context_T;
> Javascript_Name : in
> Standard.String;
> Ada_Function : in
> Callback_T) is
> Global : constant T := Get_Global_Object (Ctx);
> Name : constant String.T := String.To_Javascript (Javascript_Name);
> Func_Obj : constant T := Make_Function_With_Callback (Ctx,
> Name => Name,
> Callback =>
> Ada_Function);
> Exceptions : Value.T;
> begin
> Set_Property (Ctx,
> Object => Global,
> Property_Name => Name,
> New_Value => Value.T (Func_Obj),
> Attributes => (Read_Only => True, others => False),
> Exceptions => Exceptions);
> -- TODO: log Exceptions, possibly raise an Ada exception?
> end Export_Ada_Function_To_Javascript;
>
> procedure On_Load_Changed (View : not null access
> Webkit.Web_View.Record_T'Class;
> Load_Event : in
> Webkit.Web_View.Load_Event_T) is
> begin
> case Load_Event is
> when Webkit.Web_View.Started | Webkit.Web_View.Redirected |
> Webkit.Web_View.Committed => null;
> when Webkit.Web_View.Finished =>
> Javascript.Object.Export_Ada_Function_To_Javascript (Ctx =>
> View.Get_Javascript_Global_Context,
>
> Javascript_Name => "exported",
>
> Ada_Function => Exported'Access);
> end case;
> exception
> when others =>
> UIF_Error.Report (Kind => UIF_Error.Operation_Aborted,
> Unit_Name => Display_Name,
> Message => "Exception in
> Regulation_Editor.Browser_Window.On_Load_Changed");
> end On_Load_Changed;
>
> --
> Ludovic Brenta.
>
> _______________________________________________
> webkit-gtk mailing list
> webkit-gtk at lists.webkit.org
> https://lists.webkit.org/mailman/listinfo/webkit-gtk
>
--
Leo Ufimtsev, Software Engineer, Red Hat
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-gtk/attachments/20170913/2c8a2285/attachment-0001.html>
More information about the webkit-gtk
mailing list