]> source.dussan.org Git - gwtquery.git/commitdiff
Test for bitless rebinding when a widget is attached/dettatched
authorManuel Carrasco Moñino <manuel.carrasco.m@gmail.com>
Tue, 26 Nov 2013 09:06:17 +0000 (10:06 +0100)
committerManuel Carrasco Moñino <manuel.carrasco.m@gmail.com>
Tue, 26 Nov 2013 09:06:17 +0000 (10:06 +0100)
gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/events/EventsListener.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryEventsTestGwt.java

index eacc9d186fee340bf9f06b17558d8ba93be60ee1..b8e73ae17219556ce6cc81c7fd43564c62b34a1f 100644 (file)
@@ -31,7 +31,6 @@ import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.EventListener;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -400,13 +399,15 @@ public class EventsListener implements EventListener {
     return ret != null ? ret : new EventsListener(e);
   }
 
+  /**
+   * We have to set the gQuery event listener to the element again when
+   * the element is a widget, because when GWT detaches a widget it removes the 
+   * event listener.
+   */
   public static void rebind(Element e) {
     EventsListener ret = getGQueryEventListener(e);
-    if (ret != null && ret.eventBits != 0) {
-      // rebind bit event
-      ret.sink(ret.eventBits, null);
-
-      // TODO manage bitless event
+    if (ret != null) {
+      DOM.setEventListener((com.google.gwt.user.client.Element) e, ret);
     }
   }
 
@@ -427,7 +428,11 @@ public class EventsListener implements EventListener {
 
   private static native void init(Element elem, EventsListener gqevent)/*-{
                elem.__gwtlistener = @com.google.gwt.user.client.DOM::getEventListener(*)(elem);
-               elem.__gqueryevent = gqevent;
+    elem.__gqueryevent = gqevent;
+    // Someone has reported that in IE the init can be called multiple times
+    // causing a loop. We need some test to demonstrate this behaviour though.
+    // Anyway we check this condition to avoid looping
+               if (elem.__gwtlistener == gqevent) elem.__gwtlistener = null;
   }-*/;
 
   // Gwt does't handle submit nor resize events in DOM.sinkEvents
index b13b3b4e5c1827f02930790543d1815907124f3a..6795a35d3efc2c7ffd035e8120928bea020e9c41 100644 (file)
@@ -1288,6 +1288,7 @@ public class GQueryEventsTestGwt extends GWTTestCase {
     b.addClickHandler(new ClickHandler() {
       public void onClick(ClickEvent event) {
         b.getElement().getStyle().setBackgroundColor("black");
+        b.setWidth("100px");
       }
     });
     RootPanel.get().add(b);
@@ -1296,6 +1297,9 @@ public class GQueryEventsTestGwt extends GWTTestCase {
     $(b).click();
     assertEquals("red", $("button").css("color", false));
     assertEquals("black", $("button").css("background-color", false));
+    assertEquals("100px", $("button").css("width", false));
+
+    $(b).bind("custom", lazy().css("width", "200px").done());
     RootPanel.get().remove(b);
 
     $(e).append($(b));
@@ -1303,6 +1307,10 @@ public class GQueryEventsTestGwt extends GWTTestCase {
     $(b).click();
     assertEquals("red", $("button").css("color", false));
     assertEquals("black", $("button").css("background-color", false));
+    assertEquals("100px", $("button").css("width", false));
+
+    $(b).trigger("custom");
+    assertEquals("200px", $("button").css("width", false));
   }
   
   public void testIssue152() {