diff -r f18b7262fe91 -r f78cdceed17b launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JVMBridge.java --- a/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JVMBridge.java Sun Apr 28 17:42:49 2013 +0200 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JVMBridge.java Wed Jun 12 18:19:29 2013 +0200 @@ -17,16 +17,27 @@ */ package org.apidesign.bck2brwsr.launcher.fximpl; +import java.net.URL; import java.util.TooManyListenersException; import javafx.beans.value.ChangeListener; +import javafx.scene.web.WebEngine; +import netscape.javascript.JSObject; /** * * @author Jaroslav Tulach */ public final class JVMBridge { + private final WebEngine engine; + private final WebClassLoader cl; + private static ClassLoader[] ldrs; private static ChangeListener onBck2BrwsrLoad; + + JVMBridge(WebEngine eng) { + this.engine = eng; + this.cl = new WebClassLoader(JVMBridge.class.getClassLoader()); + } public static void registerClassLoaders(ClassLoader[] loaders) { ldrs = loaders.clone(); @@ -47,18 +58,57 @@ } public Class loadClass(String name) throws ClassNotFoundException { - System.err.println("trying to load " + name); - ClassNotFoundException ex = null; - if (ldrs != null) for (ClassLoader l : ldrs) { - try { - return Class.forName(name, true, l); - } catch (ClassNotFoundException ex2) { - ex = ex2; + return Class.forName(name, true, cl); + } + + private final class WebClassLoader extends JsClassLoader { + public WebClassLoader(ClassLoader parent) { + super(parent); + } + + @Override + protected URL findResource(String name) { + if (ldrs != null) for (ClassLoader l : ldrs) { + URL u = l.getResource(name); + if (u != null) { + return u; + } } + return null; } - if (ex == null) { - ex = new ClassNotFoundException("No loaders"); + + @Override + protected Fn defineFn(String code, String... names) { + StringBuilder sb = new StringBuilder(); + sb.append("(function() {"); + sb.append(" var x = {};"); + sb.append(" x.fn = function("); + String sep = ""; + for (String n : names) { + sb.append(sep).append(n); + sep = ","; + } + sb.append(") {\n"); + sb.append(code); + sb.append("};"); + sb.append("return x;"); + sb.append("})()"); + + JSObject x = (JSObject) engine.executeScript(sb.toString()); + return new JSFn(x); } - throw ex; + } + + private static final class JSFn extends Fn { + private final JSObject fn; + + public JSFn(JSObject fn) { + this.fn = fn; + } + + @Override + public Object invoke(Object... args) throws Exception { + return fn.call("fn", args); // NOI18N + } } }