the GJS code, in case you are wondering ... the if is executed, the jsResult is useless with any kind of data I pass (string, boolean, array, object, number, null):
if (wvUCM.register_script_message_handler('gjs')) { wvUCM.connect('script-message-received', (self, jsResult) => { print(jsResult); }); } On Wed, Nov 1, 2017 at 12:23 PM, Andrea Giammarchi < andrea.giammar...@gmail.com> wrote: > so ... it looks really like the exposed API is completely useless as it is > > ```js > webkit.messageHandlers.gjs.postMessage('hello'); > ``` > > Returns a > > [boxed instance proxy GIName:WebKit2.JavascriptResult jsobj@0x7fa08c2e4160 > native@0x7fa052081d80] > > > and if you try to get its value it goes bananas with a message like: > > Gjs-WARNING **: JS ERROR: Error: Unable to find module implementing > foreign type JavaScriptCore.Value > > > What's the purpose of register_script_message_handler at all? What am I > missing? > > > > > On Wed, Nov 1, 2017 at 11:02 AM, Andrea Giammarchi < > andrea.giammar...@gmail.com> wrote: > >> I've quickly provided a proof of concept but you could have a JSONChannel >> class singleton on the client side that queue each info and wait for the >> GJS side to receive one before sending another. >> >> I might try a real implementation though and see how it works. >> >> however, this is just a work around for the fact you can send messages >> without any content (... and I wonder how that can be useful in any way ...) >> >> Regards >> >> On Wed, Nov 1, 2017 at 10:50 AM, Sam Jansen <sam.jan...@starleaf.com> >> wrote: >> >>> >>> >>> On 1 November 2017 at 11:55, Andrea Giammarchi < >>> andrea.giammar...@gmail.com> wrote: >>> >>>> Actually the `notify::title` with a prefixed "secret-channel" and >>>> serialized JSON looks like the best of them all, for the time being, as it >>>> makes it straight forward for both client and server to communicate. >>>> >>>> ```js >>>> // listen to each response >>>> new MutationObserver(m => { >>>> if (/^secret:response=/.test(document.title)) { >>>> const data = JSON.parse(document.title.slice(RegExp['$&'].length)); >>>> document.title = ''; >>>> console.log(data); >>>> } >>>> }).observe( >>>> document.querySelector('title'), >>>> {childList: true} >>>> ); >>>> >>>> // send info using client or simulate server sending in responses >>>> document.title = 'secret:response=' + JSON.stringify({some: 'value'}); >>>> ``` >>>> >>>> with a proper class/wrap to handle events and send data transparently >>>> it might be a great way to exchange info >>>> >>>> >>> I've just come to the opposite conclusion, though I don't disagree as >>> such... >>> >>> My concern is that setting document.title, and having notify::title >>> called is asynchronous (I believe). So in your JS, if one had: >>> >>> ``` >>> document.title = '1' >>> document.title = '2' >>> ``` >>> >>> Then by the time notify::title is called, and you inspect your >>> "webkit.title" property, I'd expect you'd only see the '2' value, and >>> (likely) not the '1'. >>> >>> It's possible to solve this by ensuring the GJS side has picked up a >>> message, and e.g. reset the title, I suppose. This feels like an awkward >>> solution to me though. >>> >>> >>>> >>>> >>>> On Wed, Nov 1, 2017 at 5:53 AM, Sam Jansen <sam.jan...@starleaf.com> >>>> wrote: >>>> >>>>> >>>>> >>>>> On 1 November 2017 at 05:43, <philip.chime...@gmail.com> wrote: >>>>> >>>>>> On Thu, Oct 12, 2017 at 5:23 AM Andrea Giammarchi < >>>>>> andrea.giammar...@gmail.com> wrote: >>>>>> >>>>>>> FWIW I've used the location with a private channel as protocol to >>>>>>> intercept calls to/from the page and GJS. >>>>>>> >>>>>>> https://github.com/WebReflection/jsgtk-twitter/blob/master/a >>>>>>> pp#L162-L175 >>>>>>> >>>>>>> The channel is a random string: https://github.com/Web >>>>>>> Reflection/jsgtk-twitter/blob/master/app#L59 >>>>>>> >>>>>>> From the page, which is aware of the "secret" channel, I call GJS >>>>>>> actions via location.href = `secret1234:method(${encodeURI >>>>>>> Component(JSON.stringify(value))})`; >>>>>>> >>>>>>> The protocol secret1234 is intercepted and the >>>>>>> `controller.method(JSON.parse(decodeURIComponent(restOfURI)))` >>>>>>> invoked. >>>>>>> >>>>>>> To signal the page everything is fine I use >>>>>>> this.webView.runJavaScript https://github.com/WebReflect >>>>>>> ion/jsgtk-twitter/blob/master/app#L377 >>>>>>> >>>>>>> The page has a listener for the `secret1234` event on the main >>>>>>> window, and such listener is instrumented to react accordingly with the >>>>>>> CustomEvent .detail payload/info. >>>>>>> >>>>>>> This might look a bit convoluted, and it has JSON serialization as >>>>>>> limitation for the kind of data you want to pass (i.e. I use base64 >>>>>>> encoded >>>>>>> images as source from remotely fetched files enabling somehow CORS for >>>>>>> whatever I want) but it worked well, circumventing the missing >>>>>>> communication channel available in Qt. >>>>>>> >>>>>>> Maybe today there are better ways for doing a similar thing and if >>>>>>> that's the case, please share. >>>>>>> >>>>>> >>>>>> Here is another, fairly new, way to do it. Start out by registering a >>>>>> "script message handler": >>>>>> http://devdocs.baznga.org/webkit240~4.0_api/webkit2.usercont >>>>>> entmanager#method-register_script_message_handler >>>>>> >>>>>> To send a message to the page, use the same thing that Andrea uses: >>>>>> http://devdocs.baznga.org/webkit240~4.0_api/webkit2.webview# >>>>>> method-run_javascript >>>>>> >>>>>> To send a message from the page to the GJS program, use the >>>>>> postMessage() method mentioned in the documentation, and connect to this >>>>>> signal in your GJS program to receive the message: >>>>>> http://devdocs.baznga.org/webkit240~4.0_api/webkit2.usercont >>>>>> entmanager#signal-script-message-received >>>>>> >>>>>> >>>>> Excellent - I had not noticed this. My first attempt at communicating >>>>> between WebKit2 and GJS was via setting "document.title" and having GJS >>>>> connect to the "notify::title" signal! Not a great approach, this looks >>>>> much better. >>>>> >>>>> >>>>>> Although I just realized that unfortunately the values won't be able >>>>>> to be marshalled into GJS since you need to use the JavaScriptCore API to >>>>>> get at them. This is a really nice method in C, but in JS you can only >>>>>> use >>>>>> it to send a message without any content. That is annoying. I should >>>>>> probably open up an issue about this. >>>>>> >>>>>> >>>>> I just hit upon this problem myself. In researching it, I found it is >>>>> solved (at least well enough for my use-case) with this open source >>>>> library: >>>>> >>>>> https://github.com/saifulbkhan/wkjscore-result >>>>> >>>>> It's awkward having another dependency for me, especially one that >>>>> isn't in a normal Ubuntu/Fedora/etc. package, but otherwise this approach >>>>> worked fine for me. >>>>> >>>>> >>>>>> On Wed, Oct 11, 2017 at 12:57 PM, Adriano Patrizio < >>>>>>> adriano.patri...@hotmail.com> wrote: >>>>>>> >>>>>>>> Thank you for response, this is my problem: have necessity to >>>>>>>> implement methods into my web application webkit2 based and comunicate >>>>>>>> with >>>>>>>> GJS script (example: filesystem functions to read and write files or >>>>>>>> window >>>>>>>> managment). >>>>>>>> >>>>>>> >>>>>> Regards, >>>>>> Philip C >>>>>> >>>>>> _______________________________________________ >>>>>> javascript-list mailing list >>>>>> javascript-list@gnome.org >>>>>> https://mail.gnome.org/mailman/listinfo/javascript-list >>>>>> >>>>>> >>>>> >>>> >>> >> >
_______________________________________________ javascript-list mailing list javascript-list@gnome.org https://mail.gnome.org/mailman/listinfo/javascript-list