From 0463741ffa06f8e34ddc10466ce1aba022a0dff5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Manuel=20Carrasco=20Mo=C3=B1ino?= Date: Wed, 3 Apr 2013 10:49:25 +0200 Subject: [PATCH] Resolve referred with plain objects. Pass the same parameters to "done" functions than jquery does. More testing --- .../com/google/gwt/query/client/Function.java | 49 ++++++++++++++++++- .../com/google/gwt/query/client/GQuery.java | 1 - .../gwt/query/client/plugins/QueuePlugin.java | 31 +++++++----- .../client/plugins/deferred/Deferred.java | 11 ++++- .../query/client/GQueryDeferredTestGwt.java | 26 +++++++++- 5 files changed, 100 insertions(+), 18 deletions(-) diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/Function.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/Function.java index 7e636a72..2b961c2a 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/Function.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/Function.java @@ -30,6 +30,51 @@ public abstract class Function { private Event event = null; private int index = -1; protected Object[] arguments = new Object[0]; + + /** + * Utility method to get a string representation with the content + * of the arguments array. It recursively visits arrays and inspect + * object to print an appropriate representation of them. + * + * It is very useful to debug arguments passed in nested promises. + * + * It is protected so as it can be used in Inner functions. + * + * Output example: + *
+   * [0](com.google.gwt.query.client.plugins.QueuePlugin) 
a1
a2
+ * [1](com.google.gwt.query.client.plugins.QueuePlugin)
a1
a2
+ * [2](java.lang.String) Foo + * [3](JSO) {"bar":"foo"} + *
+ */ + protected String dumpArguments() { + return dumpArguments(arguments, "\n"); + } + + private String dumpArguments(Object[] arguments, String sep) { + String ret = ""; + for (int i = 0, l = arguments.length; i < l; i++ ) { + ret += "[" + i + "]"; + Object o = arguments[i]; + if (o == null) { + ret += " null"; + } else if (o.getClass().isArray()) { + ret += dumpArguments((Object[])o, sep + " "); + } else if (o instanceof JavaScriptObject) { + JavaScriptObject jso = (JavaScriptObject)o; + if (JsUtils.isElement(jso)) { + ret += "(Element) " + jso.toString(); + } else { + ret += "(JSO) " + jso.cast().toJsonString(); + } + } else { + ret += "(" + o.getClass().getName() + ") " + o; + } + if (i < l-1) ret += sep; + } + return ret; + } public T getElement() { return element.cast(); @@ -121,8 +166,8 @@ public abstract class Function { */ public Object[] getArgumentArray(int idx) { Object o = idx < 0 ? arguments: getArgument(idx); - if (o != null && o.getClass().isArray()) { - return (Object[])o; + if (o != null) { + return o.getClass().isArray() ? (Object[])o : new Object[]{o}; } else if (idx == 0) { return arguments; } diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java index 54238066..ba2b7861 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java @@ -724,7 +724,6 @@ public class GQuery implements Lazy { * It Returns a new promise which will be finalized when all of its subordinates finish. * In the case of all subordinates are resolved correctly the promise will be resolved * otherwise it will be rejected. - * */ public static Promise when(Object... subordinates) { return Deferred.when(subordinates); diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/QueuePlugin.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/QueuePlugin.java index e69aa07f..f8536dad 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/QueuePlugin.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/QueuePlugin.java @@ -145,23 +145,28 @@ public class QueuePlugin> extends GQuery { * Returns a dynamically generated Promise that is resolved once all actions * in the named queue have ended. */ - public Promise promise(String name) { + public Promise promise(final String name) { final Promise.Deferred dfd = Deferred(); - Function resolve = new Function() { - int l = QueuePlugin.this.length(); - public Object f(Object... args) { + // This is the resolve function which will be added to each element + new Function() { + int l = 1; + public void f() { if (--l == 0) { - dfd.resolve(); + dfd.resolve(QueuePlugin.this); } - return null; } - }; - - for (Element elem: elements()) { - emptyHooks(elem, name).add(resolve); - } - + { + for (Element elem: elements()) { + // Add this hook function only to those elements with active queue + if (queue(elem, name, null) != null) { + emptyHooks(elem, name).add(this); + l++; + } + } + } + }.f(this, name); + return dfd.promise(); } @@ -312,7 +317,7 @@ public class QueuePlugin> extends GQuery { f.fe(elem); } else { // Run final hooks when emptying the queue, used in promises - emptyHooks(elem, name).fire(elem, name); + emptyHooks(elem, name).fire(); // It is the last function, remove the queue to avoid leaks (issue 132) removeData(elem, name); } diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/deferred/Deferred.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/deferred/Deferred.java index 40df7dbf..11ce75c1 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/deferred/Deferred.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/deferred/Deferred.java @@ -153,7 +153,7 @@ public class Deferred extends GQuery implements Promise.Deferred { } public Object f(Object... args) { - values[idx] = args; + values[idx] = args.length == 1 ? args[0] : args; if (--remaining == 0) { WhenDeferredImpl.this.resolve(values); } @@ -198,6 +198,15 @@ public class Deferred extends GQuery implements Promise.Deferred { } }); + /** + * Provides a way to execute callback functions based on one or more objects, + * usually Deferred objects that represent asynchronous events. + * + * Returns the Promise from a new "master" Deferred object that tracks the aggregate + * state of all the Deferreds passed. The method will resolve its master + * Deferred as soon as all the Deferreds resolve, or reject the master Deferred as + * soon as one of the Deferreds is rejected + */ public static Promise when(Object... d) { int l = d.length; Promise[] p = new Promise[l]; diff --git a/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryDeferredTestGwt.java b/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryDeferredTestGwt.java index c063a65d..005b4cb4 100644 --- a/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryDeferredTestGwt.java +++ b/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryDeferredTestGwt.java @@ -438,5 +438,29 @@ public class GQueryDeferredTestGwt extends GWTTestCase { }}); }}) .click(); - } + } + + public void testWhenArgumentsWhithAnyObject() { + $(e).html("
a1
a2
"); + + final GQuery g = $("div", e); + assertEquals(2, g.length()); + + // We can pass to when any object. + GQuery.when(g, g.delay(100).delay(100), "Foo", $$("{bar: 'foo'}")) + .done(new Function(){public void f() { + GQuery g1 = arguments(1, 0); + GQuery g2 = arguments(1, 0); + String foo = arguments(2, 0); + Properties p = arguments(3, 0); + + // We dont compare g and g1/g2 because they are different + // objects (GQuery vs QueuePlugin) but we can compare its content + assertEquals(g.toString(), g1.toString()); + assertEquals(g.toString(), g2.toString()); + + assertEquals("Foo", foo); + assertEquals("foo", p.get("bar")); + }}); + } } -- 2.39.5