]> source.dussan.org Git - gwtquery.git/commitdiff
fix bug with event delegation
authorjdramaix <julien.dramaix@gmail.com>
Thu, 21 Nov 2013 16:35:46 +0000 (17:35 +0100)
committerjdramaix <julien.dramaix@gmail.com>
Thu, 21 Nov 2013 16:35:46 +0000 (17:35 +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 bac63b8a27a1547274d9344088a02d5c75195c7b..cde18e47bed0042372013604be8aadb870340d4d 100644 (file)
@@ -248,7 +248,7 @@ public class EventsListener implements EventListener {
     }
 
     @Override
-    public boolean fire(Event event, Object[] handlerDatas) {
+    public boolean fire(Event event, Object[] eventDatas) {
       if (isEmpty()) {
         return true;
       }
@@ -268,7 +268,7 @@ public class EventsListener implements EventListener {
         JsObjectArray<BindFunction> bindFunctions = bindFunctionBySelector.get(cssSelector);
         for (int i = 0; bindFunctions != null && i < bindFunctions.length(); i++) {
           BindFunction f = bindFunctions.get(i);
-          if (f.hasEventType(event.getTypeInt())) {
+          if (f.hasEventType(event.getTypeInt()) || f.isTypeOf(event.getType())) {
             validSelectors.add(cssSelector);
             break;
           }
@@ -289,7 +289,7 @@ public class EventsListener implements EventListener {
         JsObjectArray<BindFunction> bindFunctions = bindFunctionBySelector.get(cssSelector);
         for (int i = 0; bindFunctions != null && i < bindFunctions.length(); i++) {
           BindFunction f = bindFunctions.get(i);
-          if (f.hasEventType(event.getTypeInt())) {
+          if (f.hasEventType(event.getTypeInt()) || f.isTypeOf(event.getType())) {
             NodeList<Element> n = realCurrentTargetBySelector.get(cssSelector);
             for (int j = 0; n != null && j < n.getLength(); j++) {
               Element element = n.getItem(j);
@@ -297,8 +297,9 @@ public class EventsListener implements EventListener {
               // handlers for this element bound to this element
               if (stopElement == null || element.equals(stopElement)) {
                 gqEvent.setCurrentElementTarget(element);
-
-                if (!f.fire(gqEvent, handlerDatas)) {
+                // data
+                eventDatas = $(element).data("___event_datas");
+                if (!f.fire(gqEvent, eventDatas)) {
                   stopElement = element;
                 }
               }
index d065964ea70d85f21eb747bf8ad389c0f090e8f6..cd00e7e608cc7e0e9837e1847de0c9bf747eb911 100644 (file)
@@ -1354,12 +1354,12 @@ public class GQueryEventsTestGwt extends GWTTestCase {
     CounterFunction handler = new CounterFunction();
 
     // test custom event binding with event data
-    target.bind("mycustomevent", "eventdata", handler);
+    target.bind("mycustomevent", "handlerdata0", handler);
 
     target.trigger("mycustomevent");
 
     assertEquals(1, handler.invokationCounter);
-    assertEquals("eventdata", handler.getArgument(0));
+    assertEquals("handlerdata0", handler.getArgument(0));
 
     // unbind
     target.unbind("mycustomevent");
@@ -1368,13 +1368,13 @@ public class GQueryEventsTestGwt extends GWTTestCase {
     assertEquals(0, handler.invokationCounter);
 
     // test custom event binding with event data as array
-    target.bind("mycustomevent", new String[]{"eventdata0", "eventdata1"}, handler);
+    target.bind("mycustomevent", new String[]{"handlerdata0", "handlerdata1"}, handler);
 
     target.trigger("mycustomevent");
 
     assertEquals(1, handler.invokationCounter);
-    assertEquals("eventdata0", handler.getArgument(0));
-    assertEquals("eventdata1", handler.getArgument(1));
+    assertEquals("handlerdata0", handler.getArgument(0));
+    assertEquals("handlerdata1", handler.getArgument(1));
   }
 
   public void testCustomEventWithHandlerData() {
@@ -1386,11 +1386,11 @@ public class GQueryEventsTestGwt extends GWTTestCase {
     // test custom event binding
     target.bind("mycustomevent", handler);
 
-    target.trigger("mycustomevent", "handlerdata0", "handlerdata1");
+    target.trigger("mycustomevent", "eventdata0", "eventdata1");
 
     assertEquals(1, handler.invokationCounter);
-    assertEquals("handlerdata0", handler.getArgument(0));
-    assertEquals("handlerdata1", handler.getArgument(1));
+    assertEquals("eventdata0", handler.getArgument(0));
+    assertEquals("eventdata1", handler.getArgument(1));
 
     // unbind
     target.unbind("mycustomevent");
@@ -1407,14 +1407,14 @@ public class GQueryEventsTestGwt extends GWTTestCase {
     CounterFunction handler = new CounterFunction();
 
     // test custom event binding with event data
-    target.bind("mycustomevent", "eventdata", handler);
+    target.bind("mycustomevent", "handlerdata0", handler);
 
-    target.trigger("mycustomevent", "handlerdata0", "handlerdata1");
+    target.trigger("mycustomevent", "eventdata0", "eventdata1");
 
     assertEquals(1, handler.invokationCounter);
-    assertEquals("eventdata", handler.getArgument(0));
-    assertEquals("handlerdata0", handler.getArgument(1));
-    assertEquals("handlerdata1", handler.getArgument(2));
+    assertEquals("handlerdata0", handler.getArgument(0));
+    assertEquals("eventdata0", handler.getArgument(1));
+    assertEquals("eventdata1", handler.getArgument(2));
 
     // unbind
     target.unbind("mycustomevent");
@@ -1423,15 +1423,15 @@ public class GQueryEventsTestGwt extends GWTTestCase {
     assertEquals(0, handler.invokationCounter);
 
     // test custom event binding with event data as array
-    target.bind("mycustomevent", new String[]{"eventdata0", "eventdata1"}, handler);
+    target.bind("mycustomevent", new String[]{"handlerdata0", "handlerdata1"}, handler);
 
-    target.trigger("mycustomevent", "handlerdata0", "handlerdata1");
+    target.trigger("mycustomevent", "eventdata0", "eventdata1");
 
     assertEquals(1, handler.invokationCounter);
-    assertEquals("eventdata0", handler.getArgument(0));
-    assertEquals("eventdata1", handler.getArgument(1));
-    assertEquals("handlerdata0", handler.getArgument(2));
-    assertEquals("handlerdata1", handler.getArgument(3));
+    assertEquals("handlerdata0", handler.getArgument(0));
+    assertEquals("handlerdata1", handler.getArgument(1));
+    assertEquals("eventdata0", handler.getArgument(2));
+    assertEquals("eventdata1", handler.getArgument(3));
   }
 
   public void testBitlessEventTriggersWithEventName() {
@@ -1446,4 +1446,130 @@ public class GQueryEventsTestGwt extends GWTTestCase {
 
     assertEquals(1, handler.invokationCounter);
   }
+
+  public void testDelegationEventWithCustomEvent() {
+    $(e).html("<div id='container'></div>");
+    GQuery container = $("#container", e);
+
+    CounterFunction handler = new CounterFunction();
+
+    // test  custom event binding
+    $(".custom", e).live("mycustomevent", handler);
+
+    container.html("<div class='custom'></div><div class='other'></div>");
+
+    $(".custom").trigger("mycustomevent");
+
+    assertEquals(1, handler.invokationCounter);
+    handler.invokationCounter = 0;
+
+    $(".other").trigger("mycustomevent");
+    assertEquals(0, handler.invokationCounter);
+
+    //  test  custom event unbinding
+    $(".custom", e).die("mycustomevent");
+
+    handler.invokationCounter = 0;
+
+    $(".custom").trigger("mycustomevent");
+
+    assertEquals(0, handler.invokationCounter);
+  }
+
+
+  public void testDelegationEventWithCustomEventAndData() {
+    $(e).html("<div id='container'></div>");
+    GQuery container = $("#container", e);
+
+    CounterFunction handler = new CounterFunction();
+
+    // test  custom event binding
+    $(".custom", e).live("mycustomevent", new String[]{"handlerdata0", "handlerdata1"}, handler);
+
+    container.html("<div class='custom'></div><div class='other'></div>");
+
+    $(".custom").trigger("mycustomevent", "eventdata0", "eventdata1");
+
+    assertEquals(1, handler.invokationCounter);
+    handler.invokationCounter = 0;
+    assertEquals("handlerdata0", handler.getArgument(0));
+    assertEquals("handlerdata1", handler.getArgument(1));
+    assertEquals("eventdata0", handler.getArgument(2));
+    assertEquals("eventdata1", handler.getArgument(3));
+
+    $(".other").trigger("mycustomevent");
+    assertEquals(0, handler.invokationCounter);
+
+    //  test  custom event unbinding
+    $(".custom", e).die("mycustomevent");
+
+    handler.invokationCounter = 0;
+
+    $(".custom").trigger("mycustomevent");
+
+    assertEquals(0, handler.invokationCounter);
+  }
+
+  public void testDelegationEventWithDelegateAndWithCustomEvent() {
+    $(e).html("<div id='container'></div>");
+    GQuery container = $("#container", e);
+
+    CounterFunction handler = new CounterFunction();
+
+    // test  custom event binding
+    $(e).delegate(".custom", "mycustomevent", handler);
+
+    container.html("<div class='custom'></div><div class='other'></div>");
+
+    $(".custom").trigger("mycustomevent");
+
+    assertEquals(1, handler.invokationCounter);
+    handler.invokationCounter = 0;
+
+    $(".other").trigger("mycustomevent");
+    assertEquals(0, handler.invokationCounter);
+
+    //  test  custom event unbinding
+    $(e).undelegate(".custom", "mycustomevent");
+
+    handler.invokationCounter = 0;
+
+    $(".custom").trigger("mycustomevent");
+
+    assertEquals(0, handler.invokationCounter);
+  }
+
+
+  public void testDelegationEventWithDelegateAndWithCustomEventAndData() {
+    $(e).html("<div id='container'></div>");
+    GQuery container = $("#container", e);
+
+    CounterFunction handler = new CounterFunction();
+
+    // test  custom event binding
+    $(e).delegate(".custom", "mycustomevent", new String[]{"handlerdata0", "handlerdata1"}, handler);
+
+    container.html("<div class='custom'></div><div class='other'></div>");
+
+    $(".custom").trigger("mycustomevent", "eventdata0", "eventdata1");
+
+    assertEquals(1, handler.invokationCounter);
+    handler.invokationCounter = 0;
+    assertEquals("handlerdata0", handler.getArgument(0));
+    assertEquals("handlerdata1", handler.getArgument(1));
+    assertEquals("eventdata0", handler.getArgument(2));
+    assertEquals("eventdata1", handler.getArgument(3));
+
+    $(".other").trigger("mycustomevent");
+    assertEquals(0, handler.invokationCounter);
+
+    //  test  custom event unbinding
+    $(e).undelegate(".custom", "mycustomevent");
+
+    handler.invokationCounter = 0;
+
+    $(".custom").trigger("mycustomevent");
+
+    assertEquals(0, handler.invokationCounter);
+  }
 }