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"));