Interaction between JBCefBrowser JavaScript and Kotlin code

Answered

Hello, I am working on an IntelliJ plugin where I would like to render a graph in a webview which is part of a ToolWindow. I am using the JBCefBrowser for this, and I managed to initiate this browser with some static HTML. However ideally I want interactions between the browser it's JavaScript runtime, and my Kotlin plugin. For instance when I click on a button in the browser, I want to handle this by my Kotlin runtime to do open a certain file within the IDE. The other way around I might want to send some data from my Kotlin runtime into my JavaScript runtime. On internet I couldn't really find any good suggestions on how I could achieve this, would really appreciate if someone has some tips or recommendations.

0
4 comments

Hi Ramon,

Did you get familiar with this section? https://plugins.jetbrains.com/docs/intellij/jcef.html#executing-plugin-code-from-javascript

If it doesn't help, please describe your problem in more detail.

0

Hi Karol,

I noticed that the documentation you’re referring to seems to be outdated. Could you provide a more recent link or point me to the latest documentation?

For example, the method:

JBCefJSQuery openLinkQuery = JBCefJSQuery.create(browser); // 1

JBCefJSQuery.create()

is now marked as deprecated and is scheduled for removal. This change might affect how we initialize or interact with JBCefBrowser. I wanted to confirm if there’s a new recommended approach or if we should update our code accordingly.

 

0

For what it is worth, this is how I implemented JBCefBrowser in the end:

https://github.com/ramonvermeulen/dbt-toolkit/blob/80b8791ba5558e0031858323b8c17aebea903b30/src/main/kotlin/com/github/ramonvermeulen/dbtToolkit/ui/panels/LineagePanel.kt#L63

e.g. receiving events from the JS runtime

private val javaScriptEngineProxy: JBCefJSQuery = JBCefJSQuery.create(browser as JBCefBrowserBase)
javaScriptEngineProxy.addHandler(::handleJavaScriptCallback)

 

sending events to JS runtime

browser.cefBrowser.executeJavaScript("setActiveNode('${newActiveNode?.id}')", browser.cefBrowser.url, -1)
0

Hi Info,

Only one create method is deprecated and it is mentioned in the docs to pass JBCefBrowserBase instance:

  1. Create a JBCefQuery instance. Make sure that the passed browser instance is of the type JBCefBrowserBase (casting may be necessary).

If you pass JBCefBrowserBase, the non-depracted method will be used.

0

Please sign in to leave a comment.