WebKit:
authorrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 14 Dec 2004 00:29:51 +0000 (00:29 +0000)
committerrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 14 Dec 2004 00:29:51 +0000 (00:29 +0000)
Fixed <rdar://problem/3887767> LiveConnect doesn't propagate Java exceptions back to JavaScript (prevents security suite from running)

        Reviewed by John.

        * Plugins.subproj/WebJavaPlugIn.h:

JavaScriptCore:
Fixed <rdar://problem/3887767> LiveConnect doesn't propagate Java exceptions back to JavaScript (prevents security suite from running)

        Reviewed by John.

        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeMethod):
        * bindings/jni/jni_objc.mm:
        (KJS::Bindings::dispatchJNICall):
        * bindings/jni/jni_runtime.h:
        * bindings/jni/jni_utility.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8200 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/bindings/jni/jni_instance.cpp
JavaScriptCore/bindings/jni/jni_objc.mm
JavaScriptCore/bindings/jni/jni_runtime.h
JavaScriptCore/bindings/jni/jni_utility.h
WebKit/ChangeLog
WebKit/Plugins.subproj/WebJavaPlugIn.h

index 7a1296bf799fd4f7adbb113fc8f0a9701154b8b7..fecd7e8c0c117fa90225e6cd5705012539d7eb6f 100644 (file)
@@ -1,3 +1,16 @@
+2004-12-13  Richard Williamson   <rjw@apple.com>
+
+       Fixed <rdar://problem/3887767> LiveConnect doesn't propagate Java exceptions back to JavaScript (prevents security suite from running)
+
+        Reviewed by John.
+
+        * bindings/jni/jni_instance.cpp:
+        (JavaInstance::invokeMethod):
+        * bindings/jni/jni_objc.mm:
+        (KJS::Bindings::dispatchJNICall):
+        * bindings/jni/jni_runtime.h:
+        * bindings/jni/jni_utility.h:
+
 === Safari-175 ===
 
 2004-12-07  Maciej Stachowiak  <mjs@apple.com>
index 9fc2550db016f6ed30ad3fa91cca4e791b7edbb4..7d3e95af5e13729de5b9299ac318e9e498ca58c4 100644 (file)
@@ -158,7 +158,18 @@ Value JavaInstance::invokeMethod (KJS::ExecState *exec, const MethodList &method
     bool handled = false;
     if (execContext && execContext->nativeHandle()) {
         jobject obj = _instance->_instance;
-        handled = dispatchJNICall (execContext->nativeHandle(), obj, jMethod->methodID(obj), jMethod->JNIReturnType(), jArgs, result);
+        Value exceptionDescription;
+        bool isStatic = false;  // FIXME, need to get meta data from Java about static methods
+        const char *callingURL = 0;  // FIXME, need to propagate calling URL to Java
+        handled = dispatchJNICall (execContext->nativeHandle(), obj, isStatic, jMethod->JNIReturnType(), jMethod->methodID(obj), jArgs, result, callingURL, exceptionDescription);
+        if (!exceptionDescription.isNull()) {
+            Object error = Error::create(exec, GeneralError, exceptionDescription.toString(exec).UTF8String().c_str());
+            
+            exec->setException(error);
+            
+            free (jArgs);
+            return Undefined();
+        }
     }
     
     // The following code can be conditionally removed once we have a Tiger update that
index 10d26aee2fc078ca6738e79c8c03596b81a2c493..5d931b06a424b5b98ec739f2409e7630e6fd2e72 100644 (file)
  */
 #import <Foundation/Foundation.h>
 #import <JavaScriptCore/jni_utility.h>
+#import <JavaScriptCore/objc_utility.h>
 
 using namespace KJS::Bindings;
 
 @interface NSObject (WebScriptingPrivate)
 - (jvalue)webPlugInCallJava:(jobject)object method:(jmethodID)method returnType:(JNIType)returnType arguments:(jvalue*)args;
+- (jvalue)webPlugInCallJava:(jobject)object
+                   isStatic:(BOOL)isStatic
+                 returnType:(JNIType)returnType
+                     method:(jmethodID)method
+                  arguments:(jvalue*)args
+                 callingURL:(NSURL *)url
+       exceptionDescription:(NSString **)exceptionString;
 @end
 
-bool KJS::Bindings::dispatchJNICall (const void *targetAppletView, jobject obj, jmethodID methodID, JNIType returnType, jvalue *args, jvalue &result)
+bool KJS::Bindings::dispatchJNICall (const void *targetAppletView, jobject obj, bool isStatic, JNIType returnType, jmethodID methodID, jvalue *args, jvalue &result, const char *callingURL, Value &exceptionDescription)
 {
     id view = (id)targetAppletView;
     
-    if ([view respondsToSelector:@selector(webPlugInCallJava:method:returnType:arguments:)]) {
+    if ([view respondsToSelector:@selector(webPlugInCallJava:isStatic:returnType:method:arguments:callingURL:exceptionDescription:)]) {
+        NSString *_exceptionDescription = 0;
+        NSURL *_callingURL = callingURL ? [NSURL URLWithString:[NSString stringWithUTF8String:callingURL]] : nil;
+        result = [view webPlugInCallJava:obj isStatic:isStatic returnType:returnType method:methodID arguments:args callingURL:_callingURL exceptionDescription:&_exceptionDescription];
+        if (_exceptionDescription != 0) {
+            exceptionDescription = convertNSStringToString(_exceptionDescription);
+        }
+        return true;
+    }
+    else if ([view respondsToSelector:@selector(webPlugInCallJava:method:returnType:arguments:)]) {
         result = [view webPlugInCallJava:obj method:methodID returnType:returnType arguments:args];
         return true;
     }
index a7edd397bf297d668d15959ff2afc5944cda2e2d..977a38f224e10b621aadedf657a4d7cd6d06f296 100644 (file)
@@ -32,6 +32,7 @@
 #include <runtime.h>
 #include <ustring.h>
 
+
 namespace KJS
 {
 class Value;
index 6bf7805a4b6424de0123559b5518b7f6daf57297..89d5def17bf3685b541b7f5593c76c247d81c1dc 100644 (file)
@@ -105,7 +105,7 @@ jdouble callJNIDoubleMethodIDA (jobject obj, jmethodID methodID, jvalue *args);
 JavaVM *getJavaVM();
 JNIEnv *getJNIEnv();
 
-bool dispatchJNICall (const void *targetAppletView, jobject obj, jmethodID methodID, JNIType returnType, jvalue *args, jvalue &result);
+bool dispatchJNICall (const void *targetAppletView, jobject obj, bool isStatic, JNIType returnType, jmethodID methodID, jvalue *args, jvalue &result, const char *callingURL, Value &exceptionDescription);
 
 } // namespace Bindings
 
index 0da170a84014323848af76056cc95c5eaae639f6..e818536422e53fa65b7b5130f1f56a87c1680cbc 100644 (file)
@@ -1,3 +1,11 @@
+2004-12-13  Richard Williamson   <rjw@apple.com>
+
+       Fixed <rdar://problem/3887767> LiveConnect doesn't propagate Java exceptions back to JavaScript (prevents security suite from running)
+
+        Reviewed by John.
+
+        * Plugins.subproj/WebJavaPlugIn.h:
+
 2004-12-13  John Sullivan  <sullivan@apple.com>
 
         Reviewed by Maciej.
index 1aa4aed1d1c6e2a8d0f9d716707e3acea5b0a8cc..15e86ee89ddc77c3a79cf423ce0047cfab511911 100644 (file)
@@ -39,9 +39,13 @@ typedef enum {
 /*!
     @method webPlugInCallJava:method:returnType:arguments:
     @param object The Java instance that will receive the method call.
-    @param method The ID of the Java method to call.
+    @param isStatic A flag that indicated whether the method is a class method.
     @param returnType The return type of the Java method.
+    @param method The ID of the Java method to call.
     @param args The arguments to use with the method invocation.
+    @param callingURL The URL of the page that contains the JavaScript that is calling Java.
+    @param exceptionDescription Pass in nil or the address of pointer to a string object.  If any exception
+    is thrown by Java the return value will be a description of the exception, otherwise nil.
     @discussion Calls to Java from native code should not make direct
     use of JNI.  Instead they should use this method to dispatch calls to the 
     Java VM.  This is required to guarantee that the correct thread will receive
@@ -49,6 +53,12 @@ typedef enum {
     the AppKit main thread.  This method is only implemented by the Java plug-in.
     @result The result of the method invocation.
 */
-- (jvalue)webPlugInCallJava:(jobject)object method:(jmethodID)method returnType:(WebJNIReturnType)returnType arguments:(jvalue*)args;
+- (jvalue)webPlugInCallJava:(jobject)object
+                   isStatic:(BOOL)isStatic
+                 returnType:(WebJNIReturnType)returnType
+                     method:(jmethodID)method
+                  arguments:(jvalue*)args
+                 callingURL:(NSURL *)url
+       exceptionDescription:(NSString **)exceptionString;
 
 @end