Author: [email protected]
Date: Thu Jul 16 08:05:27 2009
New Revision: 5740
Modified:
trunk/user/src/com/google/gwt/user/client/DOM.java
trunk/user/test/com/google/gwt/user/client/ui/DOMTest.java
Log:
DOM#eventGetCurrentEvent() now returns the native event when called from an
UncaughtExceptionHandler that is handling an error associated with a native
event.
Patch by: jlabanca
Review by: jgw
Modified: trunk/user/src/com/google/gwt/user/client/DOM.java
==============================================================================
--- trunk/user/src/com/google/gwt/user/client/DOM.java (original)
+++ trunk/user/src/com/google/gwt/user/client/DOM.java Thu Jul 16 08:05:27
2009
@@ -1257,12 +1257,18 @@
* event.
*/
static void dispatchEvent(Event evt, Element elem, EventListener
listener) {
+ // Preserve the current event in case we are in a reentrant event
dispatch.
+ Event prevCurrentEvent = currentEvent;
+ currentEvent = evt;
+
UncaughtExceptionHandler handler = GWT.getUncaughtExceptionHandler();
if (handler != null) {
dispatchEventAndCatch(evt, elem, listener, handler);
} else {
dispatchEventImpl(evt, elem, listener);
}
+
+ currentEvent = prevCurrentEvent;
}
/**
@@ -1312,14 +1318,7 @@
}
}
- // Preserve the current event in case we are in a reentrant event
dispatch.
- Event prevCurrentEvent = currentEvent;
- currentEvent = evt;
- try {
- // Pass the event to the listener.
- listener.onBrowserEvent(evt);
- } finally {
- currentEvent = prevCurrentEvent;
- }
+ // Pass the event to the listener.
+ listener.onBrowserEvent(evt);
}
}
Modified: trunk/user/test/com/google/gwt/user/client/ui/DOMTest.java
==============================================================================
--- trunk/user/test/com/google/gwt/user/client/ui/DOMTest.java (original)
+++ trunk/user/test/com/google/gwt/user/client/ui/DOMTest.java Thu Jul 16
08:05:27 2009
@@ -15,15 +15,24 @@
*/
package com.google.gwt.user.client.ui;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
import com.google.gwt.dom.client.BodyElement;
import com.google.gwt.dom.client.Document;
+import com.google.gwt.dom.client.NativeEvent;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Timer;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Tests standard DOM operations in the {...@link DOM} class.
*/
@@ -64,6 +73,45 @@
DOM.removeElementAttribute(div, "class");
cssClass = DOM.getElementAttribute(div, "class");
assertEquals("", cssClass);
+ }
+
+ /**
+ * Tests that {...@link DOM#eventGetCurrentEvent()} returns the event to the
+ * {...@link UncaughtExceptionHandler}.
+ */
+ public void testEventGetCurrentEventOnException() {
+ Button button = new Button("test", new ClickHandler() {
+ public void onClick(ClickEvent event) {
+ // Intentionally trigger an error
+ throw new IllegalArgumentException();
+ }
+ });
+ RootPanel.get().add(button);
+
+ // Verify the exception is captured
+ final List<String> ret = new ArrayList<String>();
+ GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
+ public void onUncaughtException(Throwable e) {
+ Event event = DOM.eventGetCurrentEvent();
+ if (event == null) {
+ ret.add("Event is null");
+ return;
+ }
+ if (event.getTypeInt() != Event.ONCLICK) {
+ ret.add("Event is not a click event");
+ return;
+ }
+ ret.add("Success");
+ }
+ });
+ NativeEvent clickEvent = Document.get().createClickEvent(0, 0, 0, 0, 0,
+ false, false, false, false);
+ button.getElement().dispatchEvent(clickEvent);
+
+ assertEquals(1, ret.size());
+ assertEquals("Success", ret.get(0));
+ RootPanel.get().remove(button);
+ GWT.setUncaughtExceptionHandler(null);
}
/**
--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---