0

With JavaFx WebView, I can get the 'window' of a browser instance[1] with:

// Java code
netscape.javascript.JSObject win = (JSObject) webengine.executeScript("window");

Then I can pass this JSObject to another browser instance[2], and in this browser's javascript, I can manipulate and access DOM, variables and functions of the first browser instance[1] like this:

// Javascript code
// get 'window' netscape.javascript.JSObject of 'browser1' webview 
// control from the getWindow() method in my linked Java class
var window1 = javaObj.getWindow("browser1");

// get variables defined in 'browser1' javascript
var rString = window1.myString;
var rNum = window1.myNumber;

// execute the 'myAlert' function on 'browser1' and pass variables in
window1.myAlert(rString + " - " + rNum + "<br><br>" + Date());

// manipulate the DOM on 'browser1'
window1.document.getElementById("myLabel").style.backgroundColor = "red";

How can I achieve this with jxBrowser?

JoseHeitor
  • 61
  • 1
  • 7

1 Answers1

0

JxBrowser provides similar functionality that allows injecting Java objects into JavaScript and call its methods from JavaScript code, but JxBrowser doesn't use the netscape.javascript.JSObject class. The following example demonstrates the idea how to use the Java object injection to access Java object methods from JavaScript:

import com.teamdev.jxbrowser.chromium.Browser;
import com.teamdev.jxbrowser.chromium.JSValue;
import com.teamdev.jxbrowser.chromium.dom.By;
import com.teamdev.jxbrowser.chromium.dom.DOMDocument;
import com.teamdev.jxbrowser.chromium.dom.DOMElement;

public class JavaScriptJavaSample {
    public static void main(String[] args) {
        Browser browser = new Browser();

        JSValue window = browser.executeJavaScriptAndReturnValue("window");

        // Inject Java object into JavaScript and associate it with
        // the window.javaWindow property.
        JavaWindow javaWindow = new JavaWindow(browser);
        window.asObject().setProperty("javaWindow", javaWindow);

        // You can access public fields of the injected Java object
        // and modify their values from JavaScript. For example:
        //
        // window.javaWindow.myString = 'Hello, Java';
        // window.javaWindow.myNumber = 123;
        // window.document().getElementById('myLabel').setAttribute('name', 'myName');
    }

    public static class JavaDocument {

        private DOMDocument document;

        public JavaDocument(DOMDocument document) {
            this.document = document;
        }

        public DOMElement getElementById(String id) {
            return document.findElement(By.id(id));
        }
    }

    public static class JavaWindow {
        public String myString;
        public int myNumber;

        private Browser browser;

        public JavaWindow(Browser browser) {
            this.browser = browser;
        }

        public JavaDocument document() {
            return new JavaDocument(browser.getDocument());
        }
    }
}

You can read more about JavaScript-Java Bridge API in the articles at https://jxbrowser.support.teamdev.com/support/solutions/folders/9000074803

Vladimir
  • 1
  • 1
  • 23
  • 30