From 084c69d9c754d35b7ad8de2a1fe6192e56916d44 Mon Sep 17 00:00:00 2001 From: fur Date: Sun, 21 Jun 1998 06:51:27 +0000 Subject: [PATCH] Added the getClass() method for backward-compatibility with old LiveConnect. git-svn-id: svn://10.0.0.236/trunk@4210 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/js/ref/liveconnect/jsj_JavaArray.c | 2 +- mozilla/js/ref/liveconnect/jsj_JavaClass.c | 142 +++++++++++++------ mozilla/js/ref/liveconnect/jsj_JavaObject.c | 4 +- mozilla/js/ref/liveconnect/jsj_JavaPackage.c | 2 +- mozilla/js/ref/liveconnect/jsj_convert.c | 20 +-- mozilla/js/ref/liveconnect/jsj_private.h | 1 - 6 files changed, 112 insertions(+), 59 deletions(-) diff --git a/mozilla/js/ref/liveconnect/jsj_JavaArray.c b/mozilla/js/ref/liveconnect/jsj_JavaArray.c index 64a7eceefce..9c98cbf72be 100644 --- a/mozilla/js/ref/liveconnect/jsj_JavaArray.c +++ b/mozilla/js/ref/liveconnect/jsj_JavaArray.c @@ -207,7 +207,7 @@ JavaArray_deleteProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) static JSBool JavaArray_defaultValue(JSContext *cx, JSObject *obj, JSType type, jsval *vp) { - printf("In JavaArray_defaultValue()\n"); + /* printf("In JavaArray_defaultValue()\n"); */ return JavaObject_convert(cx, obj, JSTYPE_STRING, vp); } diff --git a/mozilla/js/ref/liveconnect/jsj_JavaClass.c b/mozilla/js/ref/liveconnect/jsj_JavaClass.c index fff099c6725..59ba405ab41 100644 --- a/mozilla/js/ref/liveconnect/jsj_JavaClass.c +++ b/mozilla/js/ref/liveconnect/jsj_JavaClass.c @@ -95,9 +95,11 @@ lookup_static_member_by_id(JSContext *cx, JNIEnv *jEnv, JSObject *obj, class_descriptor = JS_GetPrivate(cx, obj); if (!class_descriptor) { - JS_ReportError(cx, "illegal operation on JavaClass prototype object"); - return JS_FALSE; + *class_descriptorp = NULL; + *memberp = NULL; + return JS_TRUE; } + if (class_descriptorp) *class_descriptorp = class_descriptor; @@ -185,7 +187,7 @@ JavaClass_setPropertyById(JSContext *cx, JSObject *obj, jsid id, jsval *vp) jsval idval; JNIEnv *jEnv; - printf("In JavaClass_setProperty\n"); + /* printf("In JavaClass_setProperty\n"); */ /* Get the Java per-thread environment pointer for this JSContext */ jsj_MapJSContextToJSJThread(cx, &jEnv); @@ -247,7 +249,7 @@ JavaClass_lookupProperty(JSContext *cx, JSObject *obj, jsid id, { JNIEnv *jEnv; - printf("In JavaClass_lookupProperty()\n"); + /* printf("In JavaClass_lookupProperty()\n"); */ /* Get the Java per-thread environment pointer for this JSContext */ jsj_MapJSContextToJSJThread(cx, &jEnv); @@ -303,7 +305,7 @@ JavaClass_deleteProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) static JSBool JavaClass_defaultValue(JSContext *cx, JSObject *obj, JSType type, jsval *vp) { - printf("In JavaClass_defaultValue()\n"); + /* printf("In JavaClass_defaultValue()\n"); */ return JavaClass_convert(cx, obj, JSTYPE_STRING, vp); } @@ -455,7 +457,6 @@ JavaClass_getObjectOps(JSContext *cx, JSClass *clazz) return &JavaClass_ops; } - JSClass JavaClass_class = { "JavaClass", JSCLASS_HAS_PRIVATE, NULL, NULL, NULL, NULL, @@ -463,6 +464,93 @@ JSClass JavaClass_class = { JavaClass_getObjectOps, }; +JSObject * +jsj_new_JavaClass(JSContext *cx, JNIEnv *jEnv, JSObject* parent_obj, + JavaClassDescriptor *class_descriptor) +{ + JSObject *JavaClass_obj; + + JavaClass_obj = JS_NewObject(cx, &JavaClass_class, 0, parent_obj); + if (!JavaClass_obj) + return NULL; + + JS_SetPrivate(cx, JavaClass_obj, (void *)class_descriptor); + +#ifdef DEBUG + /* printf("JavaClass \'%s\' created\n", class_descriptor->name); */ +#endif + + return JavaClass_obj; +} + +JSObject * +jsj_define_JavaClass(JSContext *cx, JNIEnv *jEnv, JSObject* parent_obj, + const char *simple_class_name, + jclass java_class) +{ + JavaClassDescriptor *class_descriptor; + JSObject *JavaClass_obj; + + class_descriptor = jsj_GetJavaClassDescriptor(cx, jEnv, java_class); + if (!class_descriptor) + return NULL; + + JavaClass_obj = jsj_new_JavaClass(cx, jEnv, parent_obj, class_descriptor); + if (!JavaClass_obj) + return NULL; + + if (!JS_DefineProperty(cx, parent_obj, simple_class_name, + OBJECT_TO_JSVAL(JavaClass_obj), 0, 0, + JSPROP_PERMANENT|JSPROP_READONLY|JSPROP_ENUMERATE)) + return NULL; + return JavaClass_obj; +} + + +/* + * The getClass() native JS method is defined as a property of the global + * object. Given a JavaObject it returns the corresponding JavaClass. This + * is useful for accessing static methods and fields. + * + * js> getClass(new java.lang.String("foo")) + * [JavaClass java.lang.String] + */ +static JSBool +getClass(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + JSObject *obj_arg, *JavaClass_obj; + JavaObjectWrapper *java_wrapper; + JavaClassDescriptor *class_descriptor; + JNIEnv *jEnv; + + jsj_MapJSContextToJSJThread(cx, &jEnv); + if (!jEnv) + return JS_FALSE; + + if (argc != 1 || + !JSVAL_IS_OBJECT(argv[0]) || + !(obj_arg = JSVAL_TO_OBJECT(argv[0])) || + (!JS_InstanceOf(cx, obj_arg, &JavaObject_class, 0) && + !JS_InstanceOf(cx, obj_arg, &JavaArray_class, 0))) { + JS_ReportError(cx, "getClass expects a Java object argument"); + return JS_FALSE; + } + + java_wrapper = JS_GetPrivate(cx, obj_arg); + if (!java_wrapper) { + JS_ReportError(cx, "getClass called on prototype object"); + return JS_FALSE; + } + + class_descriptor = java_wrapper->class_descriptor; + + JavaClass_obj = jsj_new_JavaClass(cx, jEnv, NULL, class_descriptor); + if (!JavaClass_obj) + return JS_FALSE; + *rval = OBJECT_TO_JSVAL(JavaClass_obj); + return JS_TRUE; +} + extern PR_IMPORT_DATA(JSObjectOps) js_ObjectOps; JSBool @@ -475,44 +563,10 @@ jsj_init_JavaClass(JSContext *cx, JSObject *global_obj) if (!JS_InitClass(cx, global_obj, 0, &JavaClass_class, 0, 0, 0, 0, 0, 0)) return JS_FALSE; + if (!JS_DefineFunction(cx, global_obj, "getClass", getClass, 0, + JSPROP_READONLY)) + return JS_FALSE; + return jsj_InitJavaClassReflectionsTable(); } -JSObject * -jsj_define_JavaClass(JSContext *cx, JNIEnv *jEnv, JSObject* parent_obj, - const char *simple_class_name, - const char *fully_qualified_class_name, - jclass java_class) -{ - JSObject *JavaClass_obj; - JavaClassDescriptor *class_descriptor; - - JavaClass_obj = JS_DefineObject(cx, parent_obj, simple_class_name, - &JavaClass_class, 0, - JSPROP_PERMANENT | JSPROP_READONLY); - if (!JavaClass_obj) - return NULL; - - /* Set the prototype so that objects constructed with - "new" have the right JSClass - if (!JS_DefineProperty(cx, JavaClass_obj, "prototype", - JSVAL_NULL, 0, 0, JSPROP_PERMANENT | JSPROP_READONLY)) - goto error; */ - - /* Attach private, native data to the JS object */ - class_descriptor = jsj_GetJavaClassDescriptor(cx, jEnv, java_class); - if (!class_descriptor) - goto error; - - JS_SetPrivate(cx, JavaClass_obj, (void *)class_descriptor); - -#ifdef DEBUG - /* printf("JavaClass \'%s\' created\n", class_descriptor->name); */ -#endif - - return JavaClass_obj; - -error: - JS_DeleteProperty(cx, parent_obj, simple_class_name); - return NULL; -} diff --git a/mozilla/js/ref/liveconnect/jsj_JavaObject.c b/mozilla/js/ref/liveconnect/jsj_JavaObject.c index ccff0330833..1f06453f318 100644 --- a/mozilla/js/ref/liveconnect/jsj_JavaObject.c +++ b/mozilla/js/ref/liveconnect/jsj_JavaObject.c @@ -507,7 +507,7 @@ JavaObject_lookupProperty(JSContext *cx, JSObject *obj, jsid id, { JNIEnv *jEnv; - printf("In JavaObject_lookupProperty()\n"); + /* printf("In JavaObject_lookupProperty()\n"); */ /* Get the Java per-thread environment pointer for this JSContext */ jsj_MapJSContextToJSJThread(cx, &jEnv); @@ -690,6 +690,6 @@ jsj_init_JavaObject(JSContext *cx, JSObject *global_obj) 0, 0, 0, 0)) return JS_FALSE; - + return init_java_obj_reflections_table(); } diff --git a/mozilla/js/ref/liveconnect/jsj_JavaPackage.c b/mozilla/js/ref/liveconnect/jsj_JavaPackage.c index cf8b1b2a0f3..0c4877f6282 100644 --- a/mozilla/js/ref/liveconnect/jsj_JavaPackage.c +++ b/mozilla/js/ref/liveconnect/jsj_JavaPackage.c @@ -168,7 +168,7 @@ JavaPackage_resolve(JSContext *cx, JSObject *obj, jsval id) if (jclazz) { JSObject *newClass; - newClass = jsj_define_JavaClass(cx, jEnv, obj, subPath, newPath, jclazz); + newClass = jsj_define_JavaClass(cx, jEnv, obj, subPath, jclazz); if (!newClass) { ok = JS_FALSE; goto out; diff --git a/mozilla/js/ref/liveconnect/jsj_convert.c b/mozilla/js/ref/liveconnect/jsj_convert.c index 0347db7cd0f..4bd6c492cb3 100644 --- a/mozilla/js/ref/liveconnect/jsj_convert.c +++ b/mozilla/js/ref/liveconnect/jsj_convert.c @@ -101,16 +101,7 @@ jsj_ConvertJSValueToJavaObject(JSContext *cx, JNIEnv *jEnv, jsval v, JavaSignatu return JS_TRUE; } - /* JS functions can be wrapped as a netscape.javascript.JSObject */ - if (JS_TypeOfValue(cx, v) == JSTYPE_FUNCTION) { - if (convert_js_obj_to_JSObject_wrapper(cx, jEnv, js_obj, signature, cost, java_value)) - return JS_TRUE; - - /* That didn't work, so fall through, to attempt conversion to - a java.lang.String ... */ - - /* Check for a Java object wrapped inside a JS object */ - } else if (JS_InstanceOf(cx, js_obj, &JavaObject_class, 0) || + if (JS_InstanceOf(cx, js_obj, &JavaObject_class, 0) || JS_InstanceOf(cx, js_obj, &JavaArray_class, 0)) { /* The source value is a Java object wrapped inside a JavaScript @@ -150,6 +141,15 @@ jsj_ConvertJSValueToJavaObject(JSContext *cx, JNIEnv *jEnv, jsval v, JavaSignatu /* Fall through, to attempt conversion to a Java string */ + } else if (JS_TypeOfValue(cx, v) == JSTYPE_FUNCTION) { + /* JS functions can be wrapped as a netscape.javascript.JSObject */ + if (convert_js_obj_to_JSObject_wrapper(cx, jEnv, js_obj, signature, cost, java_value)) + return JS_TRUE; + + /* That didn't work, so fall through, to attempt conversion to + a java.lang.String ... */ + + /* Check for a Java object wrapped inside a JS object */ } else { /* Otherwise, see if the target type is the netscape.javascript.JSObject wrapper class or one of its subclasses, in which case a diff --git a/mozilla/js/ref/liveconnect/jsj_private.h b/mozilla/js/ref/liveconnect/jsj_private.h index 6856d56b005..8d98e06280a 100644 --- a/mozilla/js/ref/liveconnect/jsj_private.h +++ b/mozilla/js/ref/liveconnect/jsj_private.h @@ -313,7 +313,6 @@ jsj_ReleaseJavaClassDescriptor(JSContext *cx, JNIEnv *jEnv, JavaClassDescriptor extern JSObject * jsj_define_JavaClass(JSContext *cx, JNIEnv *jEnv, JSObject *obj, const char *unqualified_class_name, - const char *fully_qualified_class_name, jclass jclazz); extern JavaMemberDescriptor *