Revision: 6162
Author: [email protected]
Date: Fri Sep 18 10:54:47 2009
Log: Save and restore the state of NativePreviewEvent in case an event is  
fired while the current event is being previewed.

Patch by: jlabanca
Review by: jgw


http://code.google.com/p/google-web-toolkit/source/detail?r=6162

Modified:
  /trunk/user/src/com/google/gwt/user/client/Event.java
  /trunk/user/test/com/google/gwt/user/client/EventTest.java

=======================================
--- /trunk/user/src/com/google/gwt/user/client/Event.java       Tue Jul 28  
09:34:53 2009
+++ /trunk/user/src/com/google/gwt/user/client/Event.java       Fri Sep 18  
10:54:47 2009
@@ -72,13 +72,27 @@
       */
      private static boolean fire(HandlerManager handlers, NativeEvent  
nativeEvent) {
        if (TYPE != null && handlers != null &&  
handlers.isEventHandled(TYPE)) {
+        // Cache the current values in the singleton in case we are in the
+        // middle of handling another event.
+        boolean lastIsCanceled = singleton.isCanceled;
+        boolean lastIsConsumed = singleton.isConsumed;
+        boolean lastIsFirstHandler = singleton.isFirstHandler;
+        NativeEvent lastNativeEvent = singleton.nativeEvent;
+
          // Revive the event
          singleton.revive();
          singleton.setNativeEvent(nativeEvent);

          // Fire the event
          handlers.fireEvent(singleton);
-        return !(singleton.isCanceled() && !singleton.isConsumed());
+        boolean ret = !(singleton.isCanceled() && !singleton.isConsumed());
+
+        // Restore the state of the singleton.
+        singleton.isCanceled = lastIsCanceled;
+        singleton.isConsumed = lastIsConsumed;
+        singleton.isFirstHandler = lastIsFirstHandler;
+        singleton.nativeEvent = lastNativeEvent;
+        return ret;
        }
        return true;
      }
=======================================
--- /trunk/user/test/com/google/gwt/user/client/EventTest.java  Thu Jul 30  
13:47:31 2009
+++ /trunk/user/test/com/google/gwt/user/client/EventTest.java  Fri Sep 18  
10:54:47 2009
@@ -323,6 +323,29 @@
      handler1.assertIsFired(false);
      reg0.removeHandler();
    }
+
+  /**
+   * Test that {...@link Event#fireNativePreviewEvent(NativeEvent)} returns  
the
+   * correct value even if another event is fired while handling the  
current
+   * event.
+   */
+  public void testFireNativePreviewEventWithInterupt() {
+    NativePreviewHandler handler = new NativePreviewHandler() {
+      private boolean first = true;
+
+      public void onPreviewNativeEvent(NativePreviewEvent event) {
+        if (first) {
+          event.cancel();
+          first = false;
+          assertTrue(Event.fireNativePreviewEvent(null));
+          assertTrue(event.isCanceled());
+        }
+      }
+    };
+    HandlerRegistration reg = Event.addNativePreviewHandler(handler);
+    assertFalse(Event.fireNativePreviewEvent(null));
+    reg.removeHandler();
+  }

    /**
     * Test that {...@link Event#fireNativePreviewEvent(NativeEvent)} returns  
the
@@ -524,6 +547,6 @@
    }

    private native boolean isInternetExplorer() /*-{
-     return navigator.userAgent.toLowerCase().indexOf("msie") != -1;
-   }-*/;
-}
+    return navigator.userAgent.toLowerCase().indexOf("msie") != -1;
+  }-*/;
+}

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to