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