Using the same trick with call also inside WebView classloader
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 17 Jun 2013 19:55:31 +0200
branchclassloader
changeset 118329302b4c0776
parent 1182 743f2fe4f0bc
child 1184 ccf2447021f6
Using the same trick with call also inside WebView
launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JVMBridge.java
     1.1 --- a/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JVMBridge.java	Mon Jun 17 19:52:10 2013 +0200
     1.2 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JVMBridge.java	Mon Jun 17 19:55:31 2013 +0200
     1.3 @@ -19,12 +19,14 @@
     1.4  
     1.5  import java.net.URL;
     1.6  import java.util.ArrayList;
     1.7 +import java.util.Arrays;
     1.8  import java.util.Collections;
     1.9  import java.util.Enumeration;
    1.10  import java.util.List;
    1.11  import java.util.TooManyListenersException;
    1.12  import javafx.beans.value.ChangeListener;
    1.13  import javafx.scene.web.WebEngine;
    1.14 +import javax.script.Invocable;
    1.15  import netscape.javascript.JSObject;
    1.16  
    1.17  /**
    1.18 @@ -99,8 +101,7 @@
    1.19          protected Fn defineFn(String code, String... names) {
    1.20              StringBuilder sb = new StringBuilder();
    1.21              sb.append("(function() {");
    1.22 -            sb.append("  var x = {};");
    1.23 -            sb.append("  x.fn = function(");
    1.24 +            sb.append("  return function(");
    1.25              String sep = "";
    1.26              for (String n : names) {
    1.27                  sb.append(sep).append(n);
    1.28 @@ -109,7 +110,6 @@
    1.29              sb.append(") {\n");
    1.30              sb.append(code);
    1.31              sb.append("};");
    1.32 -            sb.append("return x;");
    1.33              sb.append("})()");
    1.34              
    1.35              JSObject x = (JSObject) engine.executeScript(sb.toString());
    1.36 @@ -127,7 +127,11 @@
    1.37          @Override
    1.38          public Object invoke(Object thiz, Object... args) throws Exception {
    1.39              try {
    1.40 -                return fn.call("fn", args); // NOI18N
    1.41 +                List<Object> all = new ArrayList<Object>(args.length + 1);
    1.42 +                all.add(thiz == null ? fn : thiz);
    1.43 +                all.addAll(Arrays.asList(args));
    1.44 +                Object ret = fn.call("call", all.toArray()); // NOI18N
    1.45 +                return ret == fn ? null : ret;
    1.46              } catch (Error t) {
    1.47                  t.printStackTrace();
    1.48                  throw t;