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