Revision: 6148
Author: [email protected]
Date: Wed Sep 16 11:50:04 2009
Log: Patch to pass java exceptions encountered during JS execution back to  
Java land.

Patch by: amitmanjhi
Review by: jat(tbr)


http://code.google.com/p/google-web-toolkit/source/detail?r=6148

Modified:
   
/branches/farewellSwt/dev/oophm/src/com/google/gwt/dev/shell/HtmlUnitSessionHandler.java
   
/branches/farewellSwt/dev/oophm/src/com/google/gwt/dev/shell/JavaObject.java

=======================================
---  
/branches/farewellSwt/dev/oophm/src/com/google/gwt/dev/shell/HtmlUnitSessionHandler.java
         
Tue Sep 15 18:41:30 2009
+++  
/branches/farewellSwt/dev/oophm/src/com/google/gwt/dev/shell/HtmlUnitSessionHandler.java
         
Wed Sep 16 11:50:04 2009
@@ -30,6 +30,7 @@

  import net.sourceforge.htmlunit.corejs.javascript.Context;
  import net.sourceforge.htmlunit.corejs.javascript.Function;
+import net.sourceforge.htmlunit.corejs.javascript.JavaScriptException;
  import net.sourceforge.htmlunit.corejs.javascript.Scriptable;
  import net.sourceforge.htmlunit.corejs.javascript.ScriptableObject;
  import net.sourceforge.htmlunit.corejs.javascript.Undefined;
@@ -63,9 +64,11 @@
        }
        // thisObj is the javaObject.
        Value thisValue = makeValueFromJsval(context, thisObj);
-      return JavaObject.getReturnValueFromJavaMethod(context,
-          HtmlUnitSessionHandler.this, sessionData.getChannel(),
+      ExceptionOrReturnValue returnValue =  
JavaObject.getReturnFromJavaMethod(
+          context, HtmlUnitSessionHandler.this, sessionData.getChannel(),
            TO_STRING_DISPATCH_ID, thisValue, EMPTY_VALUES);
+      return HtmlUnitSessionHandler.this.makeJsvalFromValue(context,
+          returnValue.getReturnValue());
      }

      public Scriptable construct(Context cx, Scriptable scope, Object[]  
args) {
@@ -200,6 +203,11 @@
      try {
        result = jsEngine.callFunction(htmlPage, jsFunction, jsContext,  
window,
            jsThis, jsArgs);
+    } catch (JavaScriptException ex) {
+      logger.log(TreeLogger.INFO, "INVOKE: JavaScriptException " + ex
+          + ", message: " + ex.getMessage() + " when invoking " +  
methodName);
+      return new ExceptionOrReturnValue(true, makeValueFromJsval(jsContext,
+          ex.getValue()));
      } catch (Exception ex) {
        logger.log(TreeLogger.ERROR, "INVOKE: exception " + ex + ",  
message: "
            + ex.getMessage() + " when invoking " + methodName);
=======================================
---  
/branches/farewellSwt/dev/oophm/src/com/google/gwt/dev/shell/JavaObject.java    
 
Tue Sep 15 18:41:30 2009
+++  
/branches/farewellSwt/dev/oophm/src/com/google/gwt/dev/shell/JavaObject.java    
 
Wed Sep 16 11:50:04 2009
@@ -19,6 +19,7 @@
  import com.google.gwt.dev.shell.BrowserChannel.JavaObjectRef;
  import com.google.gwt.dev.shell.BrowserChannel.ReturnMessage;
  import com.google.gwt.dev.shell.BrowserChannel.Value;
+import  
com.google.gwt.dev.shell.BrowserChannel.SessionHandler.ExceptionOrReturnValue;

  import net.sourceforge.htmlunit.corejs.javascript.Context;
  import net.sourceforge.htmlunit.corejs.javascript.Function;
@@ -34,6 +35,8 @@
  public class JavaObject extends ScriptableObject implements Function {

    private static final long serialVersionUID = -7923090130737830902L;
+  private static final ExceptionOrReturnValue DEFAULT_VALUE = new  
ExceptionOrReturnValue(
+      true, new Value());

    public static JavaObject getOrCreateJavaObject(JavaObjectRef javaRef,
        SessionData sessionData, Context context) {
@@ -41,30 +44,26 @@
          javaRef.getRefid(), context);
    }

-  static Object getReturnValueFromJavaMethod(Context cx,
+  static ExceptionOrReturnValue getReturnFromJavaMethod(Context cx,
        HtmlUnitSessionHandler sessionHandler, BrowserChannel channel,
        int dispatchId, Value thisValue, Value valueArgs[]) {
-    ReturnMessage returnMessage = null;
+
      synchronized (sessionHandler.getHtmlPage()) {
        try {
          new InvokeOnServerMessage(channel, dispatchId, thisValue,  
valueArgs).send();
        } catch (IOException e) {
-        return Undefined.instance;
+        return DEFAULT_VALUE;
        }
        try {
-        returnMessage = ((BrowserChannelClient)  
channel).reactToMessagesWhileWaitingForReturn(sessionHandler);
+        ReturnMessage returnMessage = ((BrowserChannelClient)  
channel).reactToMessagesWhileWaitingForReturn(sessionHandler);
+        return new ExceptionOrReturnValue(returnMessage.isException(),
+            returnMessage.getReturnValue());
        } catch (IOException e) {
-        return Undefined.instance;
+        return DEFAULT_VALUE;
        } catch (BrowserChannelException e) {
-        return Undefined.instance;
+        return DEFAULT_VALUE;
        }
      }
-    Value returnValue = returnMessage.getReturnValue();
-    if (returnMessage.isException()) {
-      throw new RuntimeException("JavaObject.call failed, returnMessage: "
-          + returnValue.toString());
-    }
-    return sessionHandler.makeJsvalFromValue(cx, returnValue);
    }

    static boolean isJavaObject(Context jsContext, ScriptableObject  
javaObject) {
@@ -113,15 +112,17 @@
          args[1]);
      int dispatchId = ((Number) args[0]).intValue();

+    ExceptionOrReturnValue returnValue = getReturnFromJavaMethod(cx,
+        sessionData.getSessionHandler(), sessionData.getChannel(),  
dispatchId,
+        thisValue, valueArgs);
      /*
       * Return a object array ret. ret[0] is a boolean indicating whether an
       * exception was thrown or not. ret[1] is the exception or the return  
value.
-     * If there is an exception, a RuntimeException is thrown.
       */
      Object ret[] = new Object[2];
-    ret[0] = Boolean.FALSE;
-    ret[1] = getReturnValueFromJavaMethod(cx,  
sessionData.getSessionHandler(),
-        sessionData.getChannel(), dispatchId, thisValue, valueArgs);
+    ret[0] = returnValue.isException();
+    ret[1] = sessionData.getSessionHandler().makeJsvalFromValue(cx,
+        returnValue.getReturnValue());
      return ret;
    }


--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to