Swallow exceptions while setting __gwt$exception

Bug: issue 8449
Change-Id: I63e8321d1a68b1d20a8a4c3e86b4051320abc034
Review-Link: https://gwt-review.googlesource.com/#/c/5506/
(cherry picked from commit 4f1357c7349f0d755529a8ad228d67dac7ac9165)
diff --git a/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Exceptions.java b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Exceptions.java
index b2a0d0b..b316f5c 100644
--- a/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Exceptions.java
+++ b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Exceptions.java
@@ -43,7 +43,12 @@
     var jse = e.__gwt$exception;
     if (!jse) {
       jse = @com.google.gwt.core.client.JavaScriptException::new(Ljava/lang/Object;)(e);
-      e.__gwt$exception = jse;
+      try {
+        // See https://code.google.com/p/google-web-toolkit/issues/detail?id=8449
+        e.__gwt$exception = jse;
+      } catch (e) {
+        // The exception is not cachable
+      }
     }
     return jse;
   }-*/;
diff --git a/user/test/com/google/gwt/core/client/JavaScriptExceptionTest.java b/user/test/com/google/gwt/core/client/JavaScriptExceptionTest.java
index 093396e..67d89fa 100644
--- a/user/test/com/google/gwt/core/client/JavaScriptExceptionTest.java
+++ b/user/test/com/google/gwt/core/client/JavaScriptExceptionTest.java
@@ -54,8 +54,16 @@
     throw e;
   }-*/;
 
-  private static native void throwTypeError(Object e) /*-{
-    e.notExistsWillThrowTypeError();
+  private static native void throwTypeError() /*-{
+    "dummy".notExistsWillThrowTypeError();
+  }-*/;
+
+  private static native void throwSvgError() /*-{
+    // In Firefox, this throws an object (not Error):
+    $doc.createElementNS("http://www.w3.org/2000/svg", "text").getBBox();
+
+    // For other browsers, make sure an exception is thrown to keep the test simple
+    throw new Error;
   }-*/;
 
   private static void throwSandwichJava(Object e) {
@@ -312,7 +320,7 @@
   @DoNotRunWith(Platform.HtmlUnitUnknown)
   public void testTypeError() {
     try {
-      throwTypeError("myobj");
+      throwTypeError();
       fail();
     } catch (JavaScriptException e) {
       assertTypeError(e);
@@ -321,6 +329,17 @@
     }
   }
 
+  public void testSvgError() {
+    try {
+      throwSvgError();
+      fail();
+    } catch (JavaScriptException e) {
+      assertTrue(e.isThrownSet());
+      e = (JavaScriptException) javaNativeJavaSandwich(e);
+      assertTrue(e.isThrownSet());
+    }
+  }
+
   private static void assertTypeError(JavaScriptException e) {
     assertEquals("TypeError", e.getName());
     assertTrue(e.getDescription().contains("notExistsWillThrowTypeError"));