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

Reply via email to