]> source.dussan.org Git - gwtquery.git/commitdiff
returned js values in runJavascriptFunctionImpl should be boxed, share method used...
authorManuel Carrasco Moñino <manuel.carrasco.m@gmail.com>
Sat, 23 Mar 2013 01:11:52 +0000 (02:11 +0100)
committerManuel Carrasco Moñino <manuel.carrasco.m@gmail.com>
Sat, 23 Mar 2013 01:11:52 +0000 (02:11 +0100)
gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsCache.java
gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsUtils.java

index 5d564cc865e0598732ba79f6c448fcc3bba692dc..c389ffa616918c9e3de0e3405f6c75c724dffd3c 100644 (file)
@@ -79,11 +79,7 @@ public class JsCache extends JavaScriptObject {
   }
   
   public final native <T> T get(Object id) /*-{
-    var r = this && this[id], t = typeof r;
-    // box booleans and numbers in a gwt object
-    if (t == 'boolean') return @java.lang.Boolean::valueOf(Z)(r);
-    if (t == 'number')  return @java.lang.Double::valueOf(D)(r);
-    return r;
+    return @com.google.gwt.query.client.js.JsCache::gwtBox(*)([ this && this[id] ]);
   }-*/;
 
   public final JsCache getCache(int id) {
@@ -245,4 +241,32 @@ public class JsCache extends JavaScriptObject {
     }
     return js;
   }
+
+  /**
+   * Gets an object wrapped in a js array and boxes it with the appropriate
+   * Object in the GWT world.
+   *
+   * It is thought to be called from other jsni code without dealing with casting issues.
+   *
+   * It will box the unique element in the array with a Boolean or a Double in the case
+   * of primitive variables, otherwise it returns the object itself, or null if undefined.
+   *
+   * Example
+   * <pre>
+   * native Object myMethod() /*-{
+   *   var myJsVar = ... ;
+   *   return @com.google.gwt.query.client.js.JsCache::gwtBox(*)([ myJsVar ]);
+   * }-* /
+   * </pre>
+   *
+   */
+  public static native Object gwtBox(JavaScriptObject oneElementArray) /*-{
+    var r = oneElementArray;
+    if (typeof r == 'object' && r.length == 1) {
+      var r = r[0]; t = typeof r;
+      if (t == 'boolean') return @java.lang.Boolean::valueOf(Z)(r);
+      if (t == 'number')  return @java.lang.Double::valueOf(D)(r);
+    }
+    return r || null;
+  }-*/;
 }
index 2d9ba9dd8709e84f741d7af6a51a725632c581d4..790afca3cce2b0364c8592eccad7287838021bb9 100644 (file)
@@ -49,13 +49,13 @@ public class JsUtils {
       return jso.equals(obj);
     }
 
-    private native void exec(JavaScriptObject f, Object data) /*-{
-      f(data);
+    private native Object exec(JavaScriptObject f, Object data) /*-{
+      return @com.google.gwt.query.client.js.JsCache::gwtBox(*)([ f(data) ]);
     }-*/;
 
     public void f() {
       if (jso != null) {
-        exec(jso, getDataObject());
+        setArguments(exec(jso, arguments(0)));
       }
     }
 
@@ -448,7 +448,9 @@ public class JsUtils {
   }
   
   private static native <T> T runJavascriptFunctionImpl(JavaScriptObject o, String meth, JsArrayMixed args) /*-{
-    return (f = o && o[meth]) && @com.google.gwt.query.client.js.JsUtils::isFunction(*)(f) && f.apply(o, args) || null;
+    return (f = o && o[meth])
+        && @com.google.gwt.query.client.js.JsUtils::isFunction(*)(f)
+        && @com.google.gwt.query.client.js.JsCache::gwtBox(*)([f.apply(o, args)]);
   }-*/;
 
   /**
@@ -514,4 +516,5 @@ public class JsUtils {
     }
     return ret;
   }
+
 }