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 -~----------~----~----~----~------~----~------~--~---
