1.1 --- a/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JVMBridge.java Sun Apr 28 17:42:49 2013 +0200
1.2 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JVMBridge.java Wed Jun 12 18:19:29 2013 +0200
1.3 @@ -17,16 +17,27 @@
1.4 */
1.5 package org.apidesign.bck2brwsr.launcher.fximpl;
1.6
1.7 +import java.net.URL;
1.8 import java.util.TooManyListenersException;
1.9 import javafx.beans.value.ChangeListener;
1.10 +import javafx.scene.web.WebEngine;
1.11 +import netscape.javascript.JSObject;
1.12
1.13 /**
1.14 *
1.15 * @author Jaroslav Tulach <jtulach@netbeans.org>
1.16 */
1.17 public final class JVMBridge {
1.18 + private final WebEngine engine;
1.19 + private final WebClassLoader cl;
1.20 +
1.21 private static ClassLoader[] ldrs;
1.22 private static ChangeListener<Void> onBck2BrwsrLoad;
1.23 +
1.24 + JVMBridge(WebEngine eng) {
1.25 + this.engine = eng;
1.26 + this.cl = new WebClassLoader(JVMBridge.class.getClassLoader());
1.27 + }
1.28
1.29 public static void registerClassLoaders(ClassLoader[] loaders) {
1.30 ldrs = loaders.clone();
1.31 @@ -47,18 +58,57 @@
1.32 }
1.33
1.34 public Class<?> loadClass(String name) throws ClassNotFoundException {
1.35 - System.err.println("trying to load " + name);
1.36 - ClassNotFoundException ex = null;
1.37 - if (ldrs != null) for (ClassLoader l : ldrs) {
1.38 - try {
1.39 - return Class.forName(name, true, l);
1.40 - } catch (ClassNotFoundException ex2) {
1.41 - ex = ex2;
1.42 + return Class.forName(name, true, cl);
1.43 + }
1.44 +
1.45 + private final class WebClassLoader extends JsClassLoader {
1.46 + public WebClassLoader(ClassLoader parent) {
1.47 + super(parent);
1.48 + }
1.49 +
1.50 + @Override
1.51 + protected URL findResource(String name) {
1.52 + if (ldrs != null) for (ClassLoader l : ldrs) {
1.53 + URL u = l.getResource(name);
1.54 + if (u != null) {
1.55 + return u;
1.56 + }
1.57 }
1.58 + return null;
1.59 }
1.60 - if (ex == null) {
1.61 - ex = new ClassNotFoundException("No loaders");
1.62 +
1.63 + @Override
1.64 + protected Fn defineFn(String code, String... names) {
1.65 + StringBuilder sb = new StringBuilder();
1.66 + sb.append("(function() {");
1.67 + sb.append(" var x = {};");
1.68 + sb.append(" x.fn = function(");
1.69 + String sep = "";
1.70 + for (String n : names) {
1.71 + sb.append(sep).append(n);
1.72 + sep = ",";
1.73 + }
1.74 + sb.append(") {\n");
1.75 + sb.append(code);
1.76 + sb.append("};");
1.77 + sb.append("return x;");
1.78 + sb.append("})()");
1.79 +
1.80 + JSObject x = (JSObject) engine.executeScript(sb.toString());
1.81 + return new JSFn(x);
1.82 }
1.83 - throw ex;
1.84 + }
1.85 +
1.86 + private static final class JSFn extends Fn {
1.87 + private final JSObject fn;
1.88 +
1.89 + public JSFn(JSObject fn) {
1.90 + this.fn = fn;
1.91 + }
1.92 +
1.93 + @Override
1.94 + public Object invoke(Object... args) throws Exception {
1.95 + return fn.call("fn", args); // NOI18N
1.96 + }
1.97 }
1.98 }