Problem with interoperability with JavaFX WebEngine (original) (raw)

A. Sundararajan sundararajan.athijegannathan at oracle.com
Fri Mar 27 13:48:49 UTC 2015


I think I found the issue with this modified script.

var WebEngine = Java.type("javafx.scene.web.WebEngine"); var engine = new WebEngine();

var window = engine.executeScript("window");

print(Debug.getClass(window.foo)); print("typeof(window.foo) = " + typeof(window.foo)); if (window.foo) { print("window.foo is truthy"); }

We need to run with -J-Dnashorn.debug to enable nashorn debug mode. Debug.getClass gets the Java class of the value. Apparently, browser's JSObject impl. returns a string with the value "undefined" for undefined values! And not a special value or null for undefined...

I think nashorn's BrowserJSObjectLinker has to probably call JSObject.hasMember to check existence of a member before calling JSObject.getMember. That appears to be the only way to find out if "undefined" string is due to missing property or not.

-Sundar

On Friday 27 March 2015 06:22 PM, A. Sundararajan wrote:

Browser's DOM objects (like WebEngine's) implement netscape.javascript.JSObject interface. Such objects are treated specially by nashorn's linker.

http://hg.openjdk.java.net/jdk9/dev/nashorn/file/ca150ddd536e/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/BrowserJSObjectLinker.java

is the dynalink linker that handles such objects. JSObject.getMember, putMember, call are used to provide property, call access seamlessly. Please check out this example: http://hg.openjdk.java.net/jdk9/dev/nashorn/file/ca150ddd536e/samples/browserdom.js So, what you're seeing is a bug in the way that linker works. Let me check out and file a bug. Thanks, -Sundar On Friday 27 March 2015 04:41 PM, David P. Caldwell wrote: So it's very cool, and unexpected, that JavaScript objects obtained from a JavaFX WebEngine show up as something like ordinary Nashorn objects in Nashorn scripts. That's an unexpected bonus (I was planning on using .setMember() and all that stuff from netscape.javascript.JSObject).

The objects behave a bit strangely, though. So I've got a couple of bug reports, I guess. Here's a script that demonstrates the ones I've found so far: var WebEngine = Java.type("javafx.scene.web.WebEngine"); var engine = new WebEngine(); var window = engine.executeScript("window"); print("foo = " + window.foo); print("typeof(window.foo) = " + typeof(window.foo)); if (window.foo) { print("window.foo is truthy"); } Output: $ /usr/lib/jvm/jdk1.8.040/bin/jjs -fx nashorn.js foo = undefined typeof(window.foo) = string window.foo is truthy I actually am using a much more complicated embedding that is done from Java, so I can tell you the problem is not in the implementation of the -fx flag. Other than that, I can't see much; I haven't delved into the Nashorn code, let alone whatever magic enables this. -- David.



More information about the nashorn-dev mailing list