diff --git a/js/src/liveconnect/Makefile b/js/src/liveconnect/Makefile index b9804fbcbad2..a4439ddc0c4b 100644 --- a/js/src/liveconnect/Makefile +++ b/js/src/liveconnect/Makefile @@ -21,18 +21,14 @@ DEPTH = ../../.. include $(DEPTH)/config/config.mk -ifdef JAVA_OR_OJI -ifdef REGENERATE +ifdef NSJVM DIRS = classes endif -endif - -ifdef MOZ_OJI MODULE = java LIBRARY_NAME = jsj -REQUIRES = java js applet nspr img util layer +REQUIRES = java js applet nspr img util layer xpcom caps oji plugin CSRCS = jsj.c \ jsj_JSObject.c \ @@ -47,28 +43,25 @@ CSRCS = jsj.c \ jsj_field.c \ jsj_hash.c \ jsj_method.c \ - jsj_utils.c + jsj_utils.c \ + nsCLiveconnect.c \ + nsCLiveconnectFactory.c -endif -ifdef MOZ_OJI -ifdef REGENERATE +LLIBS=$(LIBNSPR) $(DIST)/lib/js$(MOZ_BITS)$(VERSION_NUMBER).lib \ + $(DIST)/lib/xpcom32.lib + + +ifdef NSJVM JNI_GEN = netscape.javascript.JSObject netscape.javascript.JSException endif -else # MOZ_JAVA -JRI_GEN = netscape.javascript.JSObject netscape.javascript.JSException -endif -ifdef JAVA_OR_OJI EXPORTS = jsjava.h \ - $(JRI_GEN_DIR)/netscape_javascript_JSObject.h \ - $(JRI_GEN_DIR)/netscape_javascript_JSException.h \ + $(JNI_GEN_DIR)/netscape_javascript_JSObject.h \ + $(JNI_GEN_DIR)/netscape_javascript_JSException.h \ + nsILiveconnect.h \ $(NULL) -else -EXPORTS = jsjava.h \ - $(NULL) -endif include $(DEPTH)/config/rules.mk @@ -87,8 +80,8 @@ endif ifdef JAVA_OR_OJI $(OBJDIR)/stubs.o: \ - $(JRI_GEN_DIR)/netscape_javascript_JSObject.c \ - $(JRI_GEN_DIR)/netscape_javascript_JSException.c \ + $(JNI_GEN_DIR)/netscape_javascript_JSObject.c \ + $(JNI_GEN_DIR)/netscape_javascript_JSException.c \ $(NULL) else $(OBJDIR)/stubs.o: diff --git a/js/src/liveconnect/Makefile.in b/js/src/liveconnect/Makefile.in index 69471325e2a3..96918f7aee5c 100644 --- a/js/src/liveconnect/Makefile.in +++ b/js/src/liveconnect/Makefile.in @@ -26,18 +26,15 @@ include $(DEPTH)/config/autoconf.mk include $(topsrcdir)/config/config.mk -ifdef JAVA_OR_OJI -ifdef REGENERATE +ifdef NSJVM DIRS = classes endif -endif -ifdef MOZ_OJI MODULE = java LIBRARY_NAME = jsj -REQUIRES = java js applet nspr img util layer +REQUIRES = java js applet nspr img util layer xpcom caps oji plugin CSRCS = jsj.c \ jsj_JSObject.c \ @@ -53,27 +50,19 @@ CSRCS = jsj.c \ jsj_hash.c \ jsj_method.c \ jsj_utils.c + nsCLiveconnect.c \ + nsCLiveconnectFactory.c -endif -ifdef MOZ_OJI -ifdef REGENERATE +ifdef NSJVM JNI_GEN = netscape.javascript.JSObject netscape.javascript.JSException endif -else # MOZ_JAVA -JRI_GEN = netscape.javascript.JSObject netscape.javascript.JSException -endif -ifdef JAVA_OR_OJI EXPORTS = $(srcdir)/jsjava.h \ - $(srcdir)/$(JRI_GEN_DIR)/netscape_javascript_JSObject.h \ - $(srcdir)/$(JRI_GEN_DIR)/netscape_javascript_JSException.h \ + $(srcdir)/$(JNI_GEN_DIR)/netscape_javascript_JSObject.h \ + $(srcdir)/$(JNI_GEN_DIR)/netscape_javascript_JSException.h \ $(NULL) -else -EXPORTS = $(srcdir)/jsjava.h \ - $(NULL) -endif include $(topsrcdir)/config/rules.mk diff --git a/js/src/liveconnect/jsj_JSObject.c b/js/src/liveconnect/jsj_JSObject.c index af93c4bcada8..2cf54733c6ea 100644 --- a/js/src/liveconnect/jsj_JSObject.c +++ b/js/src/liveconnect/jsj_JSObject.c @@ -73,10 +73,14 @@ static PRMonitor *js_obj_reflections_monitor = NULL; #endif /* JS_THREADSAFE */ #endif /* PRESERVE_JSOBJECT_IDENTITY */ -static JSBool -init_js_obj_reflections_table() +JSBool +jsj_init_js_obj_reflections_table() { #ifdef PRESERVE_JSOBJECT_IDENTITY + if(js_obj_reflections != NULL) + { + return JS_TRUE; + } js_obj_reflections = PR_NewHashTable(128, NULL, PR_CompareValues, PR_CompareValues, NULL, NULL); if (!js_obj_reflections) @@ -136,10 +140,17 @@ jsj_WrapJSObject(JSContext *cx, JNIEnv *jEnv, JSObject *js_obj) goto done; } +#ifdef OJI + if (JSJ_callbacks->get_java_wrapper != NULL) + { + java_wrapper_obj = JSJ_callbacks->get_java_wrapper(jEnv, (jint)js_obj); + } +#else /* No existing reflection found, so create a new Java object that wraps the JavaScript object by storing its address in a private integer field. */ java_wrapper_obj = (*jEnv)->NewObject(jEnv, njJSObject, njJSObject_JSObject, (jint)js_obj); +#endif /*! OJI */ if (!java_wrapper_obj) { jsj_UnexpectedJavaError(cx, jEnv, "Couldn't create new instance of " "netscape.javascript.JSObject"); @@ -180,8 +191,8 @@ done: * to Java objects. This is called from the finalizer of an instance of * netscape.javascript.JSObject. */ -static JSBool -remove_js_obj_reflection_from_hashtable(JSContext *cx, JSObject *js_obj) +JSBool +jsj_remove_js_obj_reflection_from_hashtable(JSContext *cx, JSObject *js_obj) { PRHashEntry *he, **hep; JSBool success = JS_FALSE; @@ -237,10 +248,17 @@ jsj_WrapJSObject(JSContext *cx, JNIEnv *jEnv, JSObject *js_obj) handle->js_obj = js_obj; handle->cx = cx; +#ifdef OJI + if (JSJ_callbacks->get_java_wrapper != NULL) + { + java_wrapper_obj = JSJ_callbacks->get_java_wrapper(jEnv, (jint)js_obj); + } +#else /* No existing reflection found, so create a new Java object that wraps the JavaScript object by storing its address in a private integer field. */ java_wrapper_obj = (*jEnv)->NewObject(jEnv, njJSObject, njJSObject_JSObject, (jint)handle); +#endif /*! OJI */ if (!java_wrapper_obj) { jsj_UnexpectedJavaError(cx, jEnv, "Couldn't create new instance of " "netscape.javascript.JSObject"); @@ -571,14 +589,9 @@ done: * Returns NULL on failure. */ -struct JavaToJSSavedState { - JSErrorReporter error_reporter; - JSJavaThreadState* java_jsj_env; -}; -typedef struct JavaToJSSavedState JavaToJSSavedState; -static JSJavaThreadState * -enter_js(JNIEnv *jEnv, jobject java_wrapper_obj, +JSJavaThreadState * +jsj_enter_js(JNIEnv *jEnv, jobject java_wrapper_obj, JSContext **cxp, JSObject **js_objp, JavaToJSSavedState* saved_state) { JSContext *cx; @@ -662,8 +675,8 @@ entry_failure: /* * This utility function is called just prior to returning into Java from JS. */ -static JSBool -exit_js(JSContext *cx, JSJavaThreadState *jsj_env, JavaToJSSavedState* original_state) +JSBool +jsj_exit_js(JSContext *cx, JSJavaThreadState *jsj_env, JavaToJSSavedState* original_state) { JNIEnv *jEnv; @@ -698,8 +711,8 @@ exit_js(JSContext *cx, JSJavaThreadState *jsj_env, JavaToJSSavedState* original_ /* Get the JavaClassDescriptor that corresponds to java.lang.Object */ -static JavaClassDescriptor * -get_jlObject_descriptor(JSContext *cx, JNIEnv *jEnv) +JavaClassDescriptor * +jsj_get_jlObject_descriptor(JSContext *cx, JNIEnv *jEnv) { /* The JavaClassDescriptor for java.lang.Object */ static JavaClassDescriptor *jlObject_descriptor = NULL; @@ -723,7 +736,7 @@ get_jlObject_descriptor(JSContext *cx, JNIEnv *jEnv) JNIEXPORT void JNICALL Java_netscape_javascript_JSObject_initClass(JNIEnv *jEnv, jclass java_class) { - init_js_obj_reflections_table(); + jsj_init_js_obj_reflections_table(); } /* @@ -748,7 +761,7 @@ Java_netscape_javascript_JSObject_getMember(JNIEnv *jEnv, jboolean is_copy; JSJavaThreadState *jsj_env; - jsj_env = enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); + jsj_env = jsj_enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); if (!jsj_env) return NULL; @@ -770,13 +783,13 @@ Java_netscape_javascript_JSObject_getMember(JNIEnv *jEnv, if (!JS_GetUCProperty(cx, js_obj, property_name_ucs2, property_name_len, &js_val)) goto done; - jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, get_jlObject_descriptor(cx, jEnv), + jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv), &dummy_cost, &member, &dummy_bool); done: if (property_name_ucs2) (*jEnv)->ReleaseStringChars(jEnv, property_name_jstr, property_name_ucs2); - if (!exit_js(cx, jsj_env, &saved_state)) + if (!jsj_exit_js(cx, jsj_env, &saved_state)) return NULL; return member; @@ -801,19 +814,19 @@ Java_netscape_javascript_JSObject_getSlot(JNIEnv *jEnv, jobject member; JSJavaThreadState *jsj_env; - jsj_env = enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); + jsj_env = jsj_enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); if (!jsj_env) return NULL; if (!JS_GetElement(cx, js_obj, slot, &js_val)) goto done; - if (!jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, get_jlObject_descriptor(cx, jEnv), + if (!jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv), &dummy_cost, &member, &dummy_bool)) goto done; done: - if (!exit_js(cx, jsj_env, &saved_state)) + if (!jsj_exit_js(cx, jsj_env, &saved_state)) return NULL; return member; @@ -839,7 +852,7 @@ Java_netscape_javascript_JSObject_setMember(JNIEnv *jEnv, jboolean is_copy; JSJavaThreadState *jsj_env; - jsj_env = enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); + jsj_env = jsj_enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); if (!jsj_env) return; @@ -865,7 +878,7 @@ Java_netscape_javascript_JSObject_setMember(JNIEnv *jEnv, done: if (property_name_ucs2) (*jEnv)->ReleaseStringChars(jEnv, property_name_jstr, property_name_ucs2); - exit_js(cx, jsj_env, &saved_state); + jsj_exit_js(cx, jsj_env, &saved_state); } /* @@ -885,7 +898,7 @@ Java_netscape_javascript_JSObject_setSlot(JNIEnv *jEnv, JavaToJSSavedState saved_state; JSJavaThreadState *jsj_env; - jsj_env = enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); + jsj_env = jsj_enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); if (!jsj_env) return; @@ -894,7 +907,7 @@ Java_netscape_javascript_JSObject_setSlot(JNIEnv *jEnv, JS_SetElement(cx, js_obj, slot, &js_val); done: - exit_js(cx, jsj_env, &saved_state); + jsj_exit_js(cx, jsj_env, &saved_state); } /* @@ -916,7 +929,7 @@ Java_netscape_javascript_JSObject_removeMember(JNIEnv *jEnv, jboolean is_copy; JSJavaThreadState *jsj_env; - jsj_env = enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); + jsj_env = jsj_enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); if (!jsj_env) return; @@ -937,7 +950,7 @@ Java_netscape_javascript_JSObject_removeMember(JNIEnv *jEnv, (*jEnv)->ReleaseStringChars(jEnv, property_name_jstr, property_name_ucs2); done: - exit_js(cx, jsj_env, &saved_state); + jsj_exit_js(cx, jsj_env, &saved_state); return; } @@ -964,7 +977,7 @@ Java_netscape_javascript_JSObject_call(JNIEnv *jEnv, jobject java_wrapper_obj, jobject result; JSJavaThreadState *jsj_env; - jsj_env = enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); + jsj_env = jsj_enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); if (!jsj_env) return NULL; @@ -1010,7 +1023,7 @@ Java_netscape_javascript_JSObject_call(JNIEnv *jEnv, jobject java_wrapper_obj, if (!JS_CallFunctionValue(cx, js_obj, function_val, argc, argv, &js_val)) goto cleanup_argv; - jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, get_jlObject_descriptor(cx, jEnv), + jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv), &dummy_cost, &result, &dummy_bool); cleanup_argv: @@ -1023,7 +1036,7 @@ cleanup_argv: done: if (function_name_ucs2) (*jEnv)->ReleaseStringChars(jEnv, function_name_jstr, function_name_ucs2); - if (!exit_js(cx, jsj_env, &saved_state)) + if (!jsj_exit_js(cx, jsj_env, &saved_state)) return NULL; return result; @@ -1054,7 +1067,7 @@ Java_netscape_javascript_JSObject_eval(JNIEnv *jEnv, jobject result; JSJavaThreadState *jsj_env; - jsj_env = enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); + jsj_env = jsj_enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); if (!jsj_env) return NULL; @@ -1076,7 +1089,7 @@ Java_netscape_javascript_JSObject_eval(JNIEnv *jEnv, /* Set up security stuff */ principals = NULL; if (JSJ_callbacks->get_JSPrincipals_from_java_caller) - principals = JSJ_callbacks->get_JSPrincipals_from_java_caller(jEnv); + principals = JSJ_callbacks->get_JSPrincipals_from_java_caller(jEnv, cx); codebase = principals ? principals->codebase : NULL; /* Have the JS engine evaluate the unicode string */ @@ -1087,13 +1100,13 @@ Java_netscape_javascript_JSObject_eval(JNIEnv *jEnv, goto done; /* Convert result to a subclass of java.lang.Object */ - jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, get_jlObject_descriptor(cx, jEnv), + jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv), &dummy_cost, &result, &dummy_bool); done: if (eval_ucs2) (*jEnv)->ReleaseStringChars(jEnv, eval_jstr, eval_ucs2); - if (!exit_js(cx, jsj_env, &saved_state)) + if (!jsj_exit_js(cx, jsj_env, &saved_state)) return NULL; return result; @@ -1115,7 +1128,7 @@ Java_netscape_javascript_JSObject_toString(JNIEnv *jEnv, JavaToJSSavedState saved_state; JSJavaThreadState *jsj_env; - jsj_env = enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); + jsj_env = jsj_enter_js(jEnv, java_wrapper_obj, &cx, &js_obj, &saved_state); if (!jsj_env) return NULL; @@ -1126,7 +1139,7 @@ Java_netscape_javascript_JSObject_toString(JNIEnv *jEnv, if (!result) result = (*jEnv)->NewStringUTF(jEnv, "*JavaObject*"); - if (!exit_js(cx, jsj_env, &saved_state)) + if (!jsj_exit_js(cx, jsj_env, &saved_state)) return NULL; return result; @@ -1152,7 +1165,7 @@ Java_netscape_javascript_JSObject_getWindow(JNIEnv *jEnv, jobject java_obj; JSJavaThreadState *jsj_env; - jsj_env = enter_js(jEnv, NULL, &cx, NULL, &saved_state); + jsj_env = jsj_enter_js(jEnv, NULL, &cx, NULL, &saved_state); if (!jsj_env) return NULL; @@ -1167,10 +1180,10 @@ Java_netscape_javascript_JSObject_getWindow(JNIEnv *jEnv, goto done; } js_val = OBJECT_TO_JSVAL(js_obj); - jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, get_jlObject_descriptor(cx, jEnv), + jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv), &dummy_cost, &java_obj, &dummy_bool); done: - if (!exit_js(cx, jsj_env, &saved_state)) + if (!jsj_exit_js(cx, jsj_env, &saved_state)) return NULL; return java_obj; diff --git a/js/src/liveconnect/jsj_convert.c b/js/src/liveconnect/jsj_convert.c index fe00d9fa0b47..bd81bd886229 100644 --- a/js/src/liveconnect/jsj_convert.c +++ b/js/src/liveconnect/jsj_convert.c @@ -177,8 +177,8 @@ jsj_ConvertJSValueToJavaObject(JSContext *cx, JNIEnv *jEnv, jsval v, JavaSignatu reference is passed to the original JS object by wrapping it inside an instance of netscape.javascript.JSObject */ if (convert_js_obj_to_JSObject_wrapper(cx, jEnv, js_obj, signature, cost, java_value)) { - if (*java_value) - *is_local_refp = JS_TRUE; + //if (*java_value) + // *is_local_refp = JS_TRUE; return JS_TRUE; } diff --git a/js/src/liveconnect/jsj_method.c b/js/src/liveconnect/jsj_method.c index f7548f294696..85b5eaca07d4 100644 --- a/js/src/liveconnect/jsj_method.c +++ b/js/src/liveconnect/jsj_method.c @@ -1007,7 +1007,7 @@ jsj_JavaInstanceMethodWrapper(JSContext *cx, JSObject *obj, return invoke_overloaded_java_method(cx, jsj_env, member_descriptor, JS_TRUE, java_class, class_descriptor, argc, argv, vp); } - + jsj_init_js_obj_reflections_table(); return invoke_overloaded_java_method(cx, jsj_env, member_descriptor, JS_FALSE, java_obj, class_descriptor, argc, argv, vp); diff --git a/js/src/liveconnect/jsj_private.h b/js/src/liveconnect/jsj_private.h index 77ac0bf49f06..3eb9ba37fc40 100644 --- a/js/src/liveconnect/jsj_private.h +++ b/js/src/liveconnect/jsj_private.h @@ -187,6 +187,14 @@ struct JSJavaThreadState { JSJavaThreadState * next; /* next thread state among all created threads */ }; +struct JavaToJSSavedState { + JSErrorReporter error_reporter; + JSJavaThreadState* java_jsj_env; +}; +typedef struct JavaToJSSavedState JavaToJSSavedState; + + + /******************************** Globals ***********************************/ extern JSJCallbacks *JSJ_callbacks; @@ -312,6 +320,20 @@ extern JSBool jsj_ConvertJavaObjectToJSBoolean(JSContext *cx, JNIEnv *jEnv, JavaClassDescriptor *class_descriptor, jobject java_obj, jsval *vp); +extern JSJavaThreadState * +jsj_enter_js(JNIEnv *jEnv, jobject java_wrapper_obj, + JSContext **cxp, JSObject **js_objp, JavaToJSSavedState* saved_state); +extern JSBool +jsj_exit_js(JSContext *cx, JSJavaThreadState *jsj_env, JavaToJSSavedState* original_state); + +extern JavaClassDescriptor * +jsj_get_jlObject_descriptor(JSContext *cx, JNIEnv *jEnv); + +extern JSBool +jsj_remove_js_obj_reflection_from_hashtable(JSContext *cx, JSObject *js_obj); + +extern JSBool +jsj_init_js_obj_reflections_table(); /************************ Java package reflection **************************/ extern JSBool diff --git a/js/src/liveconnect/jsjava.h b/js/src/liveconnect/jsjava.h index a236a8bcee78..19d2ffba46ec 100644 --- a/js/src/liveconnect/jsjava.h +++ b/js/src/liveconnect/jsjava.h @@ -81,12 +81,12 @@ typedef struct JSJCallbacks { returns the JS "Window" object corresponding to the HTML window that an applet is embedded within. More generally, it's a way for Java to get hold of a JS object that has not been explicitly passed to it. */ - JSObject * (*map_java_object_to_js_object)(JNIEnv *jEnv, jobject hint, + JSObject * (*map_java_object_to_js_object)(JNIEnv *jEnv, void *pJavaObject, char **errp); /* An interim callback function until the LiveConnect security story is straightened out. This function pointer can be set to NULL. */ - JSPrincipals * (*get_JSPrincipals_from_java_caller)(JNIEnv *jEnv); + JSPrincipals * (*get_JSPrincipals_from_java_caller)(JNIEnv *jEnv, JSContext *pJSContext); /* The following two callbacks sandwich any JS evaluation performed from Java. They may be used to implement concurrency constraints, e.g. @@ -105,7 +105,12 @@ typedef struct JSJCallbacks { void (*error_print)(const char *error_msg); JavaVM * (*get_java_vm)(char **errp); - +#ifdef OJI + /* This enables liveconnect to ask the VM for a java wrapper so that VM gets a chance to + store a mapping between a jsobject and java wrapper. So the unwrapping can be done on the + VM side before calling nsILiveconnect apis. This saves on a round trip request. */ + jobject (*get_java_wrapper)(JNIEnv *jEnv, jint jsobject); +#endif /* Reserved for future use */ void * reserved[10]; } JSJCallbacks; diff --git a/js/src/liveconnect/makefile.win b/js/src/liveconnect/makefile.win index 26d761b809f9..4ba671b8df29 100644 --- a/js/src/liveconnect/makefile.win +++ b/js/src/liveconnect/makefile.win @@ -32,7 +32,7 @@ DEPTH= ..\..\.. include <$(DEPTH)/config/config.mak> -!ifdef JAVA_OR_OJI +!ifdef NSJVM DIRS = classes !endif @@ -53,12 +53,8 @@ MAKE_OBJ_TYPE = DLL DEFFILE = $(DLLNAME).def !endif -!ifdef JAVA_OR_NSJVM -LLIBS=$(LIBNSPR) $(DIST)\lib\jrt$(MOZ_BITS)$(VERSION_NUMBER).lib \ - $(DIST)\lib\js$(MOZ_BITS)$(VERSION_NUMBER).lib -!else -LLIBS=$(LIBNSPR) $(DIST)\lib\js$(MOZ_BITS)$(VERSION_NUMBER).lib -!endif +LLIBS=$(LIBNSPR) $(DIST)\lib\js$(MOZ_BITS)$(VERSION_NUMBER).lib \ + $(DIST)\lib\xpcom32.lib !if "$(MOZ_BITS)"=="32" && defined(MOZ_DEBUG) && defined(GLOWCODE) LLIBS=$(LLIBS) $(GLOWDIR)\glowcode.lib @@ -69,7 +65,6 @@ LLIBS=$(LLIBS) $(GLOWDIR)\glowcode.lib #// Define the files necessary to build the target (ie. OBJS) #// #//------------------------------------------------------------------------ -!ifdef MOZ_OJI OBJS= \ .\$(OBJDIR)\jsj.obj \ .\$(OBJDIR)\jsj_JSObject.obj \ @@ -85,12 +80,12 @@ OBJS= \ .\$(OBJDIR)\jsj_hash.obj \ .\$(OBJDIR)\jsj_method.obj \ .\$(OBJDIR)\jsj_utils.obj \ + .\$(OBJDIR)\nsCLiveconnect.obj \ + .\$(OBJDIR)\nsCLiveconnectFactory.obj \ !if "$(MOZ_BITS)" == "16" .\$(OBJDIR)\jsj_nodl.obj \ !endif $(NULL) -!endif # MOZ_OJI -# #//------------------------------------------------------------------------ #// @@ -99,7 +94,7 @@ OBJS= \ #//------------------------------------------------------------------------ INSTALL_DIR=$(PUBLIC)\js INSTALL_FILE_LIST= \ - jsjava.h + jsjava.h nsILiveconnect.h #//------------------------------------------------------------------------ #// @@ -108,8 +103,7 @@ INSTALL_FILE_LIST= \ #// #//------------------------------------------------------------------------ -!ifdef REGENERATE - +!ifdef NSJVM JNI_GEN= \ netscape.javascript.JSObject \ netscape.javascript.JSException \ @@ -117,13 +111,11 @@ JNI_GEN= \ !endif -!ifdef JAVA_OR_OJI MODULE = java EXPORTS = \ - $(JRI_GEN_DIR)\netscape_javascript_JSObject.h \ - $(JRI_GEN_DIR)\netscape_javascript_JSException.h \ + $(JNI_GEN_DIR)\netscape_javascript_JSObject.h \ + $(JNI_GEN_DIR)\netscape_javascript_JSException.h \ $(NULL) -!endif #//------------------------------------------------------------------------ @@ -133,11 +125,16 @@ EXPORTS = \ #// #//------------------------------------------------------------------------ -LINCS=$(LINCS) -I$(JRI_GEN_DIR) \ +LINCS=$(LINCS) -I$(JNI_GEN_DIR) \ -I$(PUBLIC)\js \ -I$(PUBLIC)\java \ + -I$(PUBLIC)\xpcom \ + -I$(PUBLIC)\caps \ + -I$(PUBLIC)\oji \ + -I$(PUBLIC)\plugin \ $(NULL) + #!ifdef SERVER_BUILD #LLIBS=$(DIST)/lib/httpdlw.lib $(DIST)/lib/libsjboot.lib #!endif @@ -151,18 +148,10 @@ include <$(DEPTH)/config/rules.mak> export:: INSTALL_FILES -!ifdef JAVA_OR_OJI libs:: $(DLL) $(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).dll $(DIST)\bin $(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).lib $(DIST)\lib -!endif -!ifdef REGENERATE - -clobber:: - $(RM_R) $(JRI_GEN_DIR) - -!endif #### # this bit of extreme scariness came from the js/src makefile diff --git a/js/src/liveconnect/nsCLiveconnect.cpp b/js/src/liveconnect/nsCLiveconnect.cpp new file mode 100644 index 000000000000..608666a7a9d2 --- /dev/null +++ b/js/src/liveconnect/nsCLiveconnect.cpp @@ -0,0 +1,568 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ +/* + * This file is part of the Java-vendor-neutral implementation of LiveConnect + * + * It contains the implementation providing nsIFactory XP-COM interface. + * + */ + + +#include +#include +#include "prtypes.h" +#include "prprf.h" +#include "prlog.h" +PR_BEGIN_EXTERN_C + +#ifdef XP_MAC +#include "prosdep.h" +#endif + +#include "jsj_private.h" +#include "jsjava.h" + +#include "jscntxt.h" /* For js_ReportErrorAgain(). + TODO - get rid of private header */ + +#include "netscape_javascript_JSObject.h" /* javah-generated headers */ + + +/* A captured JavaScript error, created when JS_ReportError() is called while + running JavaScript code that is itself called from Java. */ +struct CapturedJSError { + char * message; + JSErrorReport report; /* Line # of error, etc. */ + jthrowable java_exception; /* Java exception, error, or null */ + CapturedJSError * next; /* Next oldest captured JS error */ +}; +PR_END_EXTERN_C + +#include "nsCLiveconnect.h" +#include "nsIPluginManager.h" + +static NS_DEFINE_IID(kILiveconnectIID, NS_ILIVECONNECT_IID); +static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); + + +//////////////////////////////////////////////////////////////////////////// +// from nsISupports and AggregatedQueryInterface: + +// Thes macro expands to the aggregated query interface scheme. + +NS_IMPL_AGGREGATED(nsCLiveconnect); + +NS_METHOD +nsCLiveconnect::AggregatedQueryInterface(const nsIID& aIID, void** aInstancePtr) +{ + if (aIID.Equals(kISupportsIID)) { + *aInstancePtr = GetInner(); + AddRef(); + return NS_OK; + } + if (aIID.Equals(kILiveconnectIID)) { + *aInstancePtr = this; + AddRef(); + return NS_OK; + } + return NS_NOINTERFACE; +} + + + +//////////////////////////////////////////////////////////////////////////// +// from nsILiveconnect: + +/** + * get member of a Native JSObject for a given name. + * + * @param jEnv - JNIEnv on which the call is being made. + * @param obj - A Native JS Object. + * @param name - Name of a member. + * @param pjobj - return parameter as a java object representing + * the member. If it is a basic data type it is converted to + * a corresponding java type. If it is a NJSObject, then it is + * wrapped up as java wrapper netscape.javascript.JSObject. + */ +NS_METHOD +nsCLiveconnect::GetMember(JNIEnv *jEnv, jsobject obj, const char *name, jobject *pjobj) +{ + JSContext *cx = NULL; + JSJavaThreadState *jsj_env = NULL; + JSObject *js_obj = (JSObject *)obj; + nsresult err = NS_OK; + jobject member = NULL; + jsval js_val = NULL; + int dummy_cost = 0; + JSBool dummy_bool = PR_FALSE; + JavaToJSSavedState saved_state = {NULL,NULL}; + + if(jEnv == NULL) + { + return NS_ERROR_FAILURE; + } + jsj_env = jsj_enter_js(jEnv, NULL, &cx, NULL, &saved_state); + if (!jsj_env) + return NS_ERROR_FAILURE; + + if (!name) { + JS_ReportError(cx, "illegal null member name"); + member = NULL; + goto done; + } + + + if (!JS_GetProperty(cx, js_obj, name, &js_val)) + goto done; + + jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv), + &dummy_cost, &member, &dummy_bool); + +done: + if (!jsj_exit_js(cx, jsj_env, &saved_state)) + return NS_ERROR_FAILURE; + + *pjobj = member; + + return NS_OK; +} + + +/** + * get member of a Native JSObject for a given index. + * + * @param jEnv - JNIEnv on which the call is being made. + * @param obj - A Native JS Object. + * @param index - Index of a member. + * @param pjobj - return parameter as a java object representing + * the member. + */ +NS_METHOD +nsCLiveconnect::GetSlot(JNIEnv *jEnv, jsobject obj, int slot, jobject *pjobj) +{ + JSContext *cx = NULL; + JSJavaThreadState *jsj_env = NULL; + JSObject *js_obj = (JSObject *)obj; + nsresult err = NS_OK; + jobject member = NULL; + jsval js_val = NULL; + int dummy_cost = 0; + JSBool dummy_bool = PR_FALSE; + JavaToJSSavedState saved_state = {NULL,NULL}; + + if(jEnv == NULL) + { + return NS_ERROR_FAILURE; + } + jsj_env = jsj_enter_js(jEnv, NULL, &cx, NULL, &saved_state); + if (!jsj_env) + return NS_ERROR_FAILURE; + + // =-= sudu: check to see if slot can be passed in as is. + // Should it be converted to a jsint? + if (!JS_GetElement(cx, js_obj, slot, &js_val)) + goto done; + if (!jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv), + &dummy_cost, &member, &dummy_bool)) + goto done; + +done: + if (!jsj_exit_js(cx, jsj_env, &saved_state)) + return NS_ERROR_FAILURE; + + *pjobj = member; + return NS_OK; +} + +/** + * set member of a Native JSObject for a given name. + * + * @param jEnv - JNIEnv on which the call is being made. + * @param obj - A Native JS Object. + * @param name - Name of a member. + * @param jobj - Value to set. If this is a basic data type, it is converted + * using standard JNI calls but if it is a wrapper to a JSObject + * then a internal mapping is consulted to convert to a NJSObject. + */ +NS_METHOD +nsCLiveconnect::SetMember(JNIEnv *jEnv, jsobject obj, const char *name, jobject java_obj) +{ + JSContext *cx = NULL; + JSJavaThreadState *jsj_env = NULL; + JSObject *js_obj = (JSObject *)obj; + nsresult err = NS_OK; + jobject member = NULL; + jsval js_val = NULL; + JavaToJSSavedState saved_state = {NULL,NULL}; + + if(jEnv == NULL) + { + return NS_ERROR_FAILURE; + } + + jsj_env = jsj_enter_js(jEnv, NULL, &cx, NULL, &saved_state); + if (!jsj_env) + return NS_ERROR_FAILURE; + + if (!name) { + JS_ReportError(cx, "illegal null member name"); + goto done; + } + + if (!jsj_ConvertJavaObjectToJSValue(cx, jEnv, java_obj, &js_val)) + goto done; + + JS_SetProperty(cx, js_obj, name, &js_val); + +done: + jsj_exit_js(cx, jsj_env, &saved_state); + return NS_OK; +} + + +/** + * set member of a Native JSObject for a given index. + * + * @param jEnv - JNIEnv on which the call is being made. + * @param obj - A Native JS Object. + * @param index - Index of a member. + * @param jobj - Value to set. If this is a basic data type, it is converted + * using standard JNI calls but if it is a wrapper to a JSObject + * then a internal mapping is consulted to convert to a NJSObject. + */ +NS_METHOD +nsCLiveconnect::SetSlot(JNIEnv *jEnv, jsobject obj, int slot, jobject java_obj) +{ + JSContext *cx = NULL; + JSJavaThreadState *jsj_env = NULL; + JSObject *js_obj = (JSObject *)obj; + nsresult err = NS_OK; + jsval js_val = NULL; + JavaToJSSavedState saved_state = {NULL,NULL}; + + if(jEnv == NULL) + { + return NS_ERROR_FAILURE; + } + jsj_env = jsj_enter_js(jEnv, NULL, &cx, NULL, &saved_state); + if (!jsj_env) + return NS_ERROR_FAILURE; + + if (!jsj_ConvertJavaObjectToJSValue(cx, jEnv, java_obj, &js_val)) + goto done; + JS_SetElement(cx, js_obj, slot, &js_val); + +done: + jsj_exit_js(cx, jsj_env, &saved_state); + return NS_OK; +} + + +/** + * remove member of a Native JSObject for a given name. + * + * @param jEnv - JNIEnv on which the call is being made. + * @param obj - A Native JS Object. + * @param name - Name of a member. + */ +NS_METHOD +nsCLiveconnect::RemoveMember(JNIEnv *jEnv, jsobject obj, const char *name) +{ + JSContext *cx = NULL; + JSJavaThreadState *jsj_env = NULL; + JSObject *js_obj = (JSObject *)obj; + nsresult err = NS_OK; + jsval js_val = NULL; + JavaToJSSavedState saved_state = {NULL,NULL}; + + if(jEnv == NULL) + { + return NS_ERROR_FAILURE; + } + jsj_env = jsj_enter_js(jEnv, NULL, &cx, NULL, &saved_state); + if (!jsj_env) + return NS_ERROR_FAILURE; + + if (!name) { + JS_ReportError(cx, "illegal null member name"); + goto done; + } + JS_DeleteProperty2(cx, js_obj, name, &js_val); + +done: + jsj_exit_js(cx, jsj_env, &saved_state); + return NS_OK; +} + + +/** + * call a method of Native JSObject. + * + * @param jEnv - JNIEnv on which the call is being made. + * @param obj - A Native JS Object. + * @param name - Name of a method. + * @param jobjArr - Array of jobjects representing parameters of method being caled. + * @param pjobj - return value. + */ +NS_METHOD +nsCLiveconnect::Call(JNIEnv *jEnv, jsobject obj, const char *name, jobjectArray java_args, jobject *pjobj) +{ + int i = 0; + int argc = 0; + int arg_num = 0; + jsval *argv = 0; + JSContext *cx = NULL; + JSJavaThreadState *jsj_env = NULL; + JSObject *js_obj = (JSObject *)obj; + nsresult err = NS_OK; + jobject member = NULL; + jsval js_val = NULL; + jsval function_val = NULL; + int dummy_cost = 0; + JSBool dummy_bool = PR_FALSE; + JavaToJSSavedState saved_state = {NULL,NULL}; + jobject result = NULL; + + if(jEnv == NULL) + { + return NS_ERROR_FAILURE; + } + jsj_env = jsj_enter_js(jEnv, NULL, &cx, NULL, &saved_state); + if (!jsj_env) + return NS_ERROR_FAILURE; + + result = NULL; + if (!name) { + JS_ReportError(cx, "illegal null JavaScript function name"); + goto done; + } + + + /* FIXME: What about security stuff ? Don't principals need to be set here ? */ + + /* Allocate space for JS arguments */ + if (java_args) { + argc = jEnv->GetArrayLength(java_args); + argv = (jsval*)JS_malloc(cx, argc * sizeof(jsval)); + } else { + argc = 0; + argv = 0; + } + + /* Convert arguments from Java to JS values */ + for (arg_num = 0; arg_num < argc; arg_num++) { + jobject arg = jEnv->GetObjectArrayElement(java_args, arg_num); + + if (!jsj_ConvertJavaObjectToJSValue(cx, jEnv, arg, &argv[arg_num])) + goto cleanup_argv; + JS_AddRoot(cx, &argv[arg_num]); + } + + if (!JS_GetProperty(cx, js_obj, name, &function_val)) + goto cleanup_argv; + + if (!JS_CallFunctionValue(cx, js_obj, function_val, argc, argv, &js_val)) + goto cleanup_argv; + + jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv), + &dummy_cost, &result, &dummy_bool); + +cleanup_argv: + if (argv) { + for (i = 0; i < arg_num; i++) + JS_RemoveRoot(cx, &argv[i]); + JS_free(cx, argv); + } + +done: + if (!jsj_exit_js(cx, jsj_env, &saved_state)) + return NS_ERROR_FAILURE; + + *pjobj = result; + + return NS_OK; +} + + +/** + * Evaluate a script with a Native JS Object representing scope. + * + * @param jEnv - JNIEnv on which the call is being made. + * @param obj - A Native JS Object. + * @param pNSIPrincipaArray - Array of principals to be used to compare privileges. + * @param numPrincipals - Number of principals being passed. + * @param script - Script to be executed. + * @param pjobj - return value. + */ +NS_METHOD +nsCLiveconnect::Eval(JNIEnv *jEnv, jsobject obj, const char *script, jobject *pjobj) +{ + JSContext *cx = NULL; + JSJavaThreadState *jsj_env = NULL; + JSObject *js_obj = (JSObject *)obj; + nsresult err = NS_OK; + jobject member = NULL; + jsval js_val = NULL; + jsval function_val = NULL; + int dummy_cost = 0; + JSBool dummy_bool = PR_FALSE; + JavaToJSSavedState saved_state = {NULL,NULL}; + jobject result = NULL; + const char *codebase = NULL; + JSPrincipals *principals = NULL; + JSBool eval_succeeded = PR_FALSE; + + if(jEnv == NULL) + { + return NS_ERROR_FAILURE; + } + jsj_env = jsj_enter_js(jEnv, NULL, &cx, NULL, &saved_state); + if (!jsj_env) + return NULL; + + result = NULL; + if (!script) { + JS_ReportError(cx, "illegal null string eval argument"); + goto done; + } + + + /* Set up security stuff */ + principals = NULL; + if (JSJ_callbacks->get_JSPrincipals_from_java_caller) + principals = JSJ_callbacks->get_JSPrincipals_from_java_caller(jEnv, cx); + codebase = principals ? principals->codebase : NULL; + + /* Have the JS engine evaluate the unicode string */ + eval_succeeded = JS_EvaluateScriptForPrincipals(cx, js_obj, principals, + script, strlen(script), + codebase, 0, &js_val); + if (!eval_succeeded) + goto done; + + /* Convert result to a subclass of java.lang.Object */ + jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv), + &dummy_cost, &result, &dummy_bool); + +done: + if (!jsj_exit_js(cx, jsj_env, &saved_state)) + return NULL; + + *pjobj = result; + return NS_OK; +} + + +/** + * Get the window object for a plugin instance. + * + * @param jEnv - JNIEnv on which the call is being made. + * @param pJavaObject - Either a jobject or a pointer to a plugin instance + * representing the java object. + * @param pjobj - return value. This is a native js object + * representing the window object of a frame + * in which a applet/bean resides. + */ +NS_METHOD +nsCLiveconnect::GetWindow(JNIEnv *jEnv, void *pJavaObject, jsobject *pobj) +{ + char *err_msg = NULL; + JSContext *cx = NULL; + JSObject *js_obj = NULL; + jsval js_val = NULL; + int dummy_cost = 0; + JSBool dummy_bool = PR_FALSE; + JavaToJSSavedState saved_state = {NULL,NULL}; + jobject java_obj = NULL; + JSJavaThreadState *jsj_env = NULL; + + if(jEnv == NULL) + { + return NS_ERROR_FAILURE; + } + jsj_env = jsj_enter_js(jEnv, NULL, &cx, NULL, &saved_state); + if (!jsj_env) + return NULL; + + err_msg = NULL; + java_obj = NULL; + js_obj = JSJ_callbacks->map_java_object_to_js_object(jEnv, pJavaObject, &err_msg); + if (!js_obj) { + if (err_msg) { + JS_ReportError(cx, err_msg); + free(err_msg); + } + goto done; + } +#if 0 + js_val = OBJECT_TO_JSVAL(js_obj); + jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv), + &dummy_cost, &java_obj, &dummy_bool); +#endif +done: + if (!jsj_exit_js(cx, jsj_env, &saved_state)) + return NULL; + + //*pjobj = java_obj; + *pobj = (jint)js_obj; + return NS_OK; +} + +/** + * Get the window object for a plugin instance. + * + * @param jEnv - JNIEnv on which the call is being made. + * @param obj - A Native JS Object. + */ +NS_METHOD +nsCLiveconnect::FinalizeJSObject(JNIEnv *jEnv, jsobject obj) +{ + JSContext *cx = NULL; + JavaToJSSavedState saved_state = {NULL,NULL}; + JSJavaThreadState *jsj_env = NULL; + JSObject *js_obj = (JSObject *)obj; + + if(jEnv == NULL) + { + return NS_ERROR_FAILURE; + } + jsj_env = jsj_enter_js(jEnv, NULL, &cx, NULL, &saved_state); + if (!jsj_env) /* Note: memory leak if we exit here */ + return NS_ERROR_FAILURE; +#ifdef PRESERVE_JSOBJECT_IDENTITY + jsj_remove_js_obj_reflection_from_hashtable(cx, js_obj); +#endif /* PRESERVE_JSOBJECT_IDENTITY */ + jsj_exit_js(cx, jsj_env, &saved_state); + return NS_OK; +} + + + +//////////////////////////////////////////////////////////////////////////// +// from nsCLiveconnect: + +nsCLiveconnect::nsCLiveconnect(nsISupports *aOuter) +{ + NS_INIT_AGGREGATED(aOuter); + jsj_init_js_obj_reflections_table(); +} + +nsCLiveconnect::~nsCLiveconnect() +{ +} + diff --git a/js/src/liveconnect/nsCLiveconnect.h b/js/src/liveconnect/nsCLiveconnect.h new file mode 100644 index 000000000000..9f5c5759b5bd --- /dev/null +++ b/js/src/liveconnect/nsCLiveconnect.h @@ -0,0 +1,167 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +/* + * This file is part of the Java-vendor-neutral implementation of LiveConnect + * + * It contains class definition implementing the public interface. + * + */ +/* + * This file is part of the Java-vendor-neutral implementation of LiveConnect + * + * It contains the class definition to implement nsILiveconnect XP-COM interface. + * + */ + + +#ifndef nsCLiveconnect_h___ +#define nsCLiveconnect_h___ + +#include "nsILiveconnect.h" +#include "nsIPluginManager.h" +#include "nsAgg.h" + + +/** + * nsCLiveconnect implements nsILiveconnect interface for navigator. + * This is used by a JVM to implement netscape.javascript.JSObject functionality. + */ +class nsCLiveconnect :public nsILiveconnect { +public: + //////////////////////////////////////////////////////////////////////////// + // from nsISupports and AggregatedQueryInterface: + + NS_DECL_AGGREGATED + + //////////////////////////////////////////////////////////////////////////// + // from nsILiveconnect: + + /** + * get member of a Native JSObject for a given name. + * + * @param obj - A Native JS Object. + * @param name - Name of a member. + * @param pjobj - return parameter as a java object representing + * the member. If it is a basic data type it is converted to + * a corresponding java type. If it is a NJSObject, then it is + * wrapped up as java wrapper netscape.javascript.JSObject. + */ + NS_IMETHOD + GetMember(JNIEnv *jEnv, jsobject obj, const char *name, jobject *pjobj); + + /** + * get member of a Native JSObject for a given index. + * + * @param obj - A Native JS Object. + * @param index - Index of a member. + * @param pjobj - return parameter as a java object representing + * the member. + */ + NS_IMETHOD + GetSlot(JNIEnv *jEnv, jsobject obj, int index, jobject *pjobj); + + /** + * set member of a Native JSObject for a given name. + * + * @param obj - A Native JS Object. + * @param name - Name of a member. + * @param jobj - Value to set. If this is a basic data type, it is converted + * using standard JNI calls but if it is a wrapper to a JSObject + * then a internal mapping is consulted to convert to a NJSObject. + */ + NS_IMETHOD + SetMember(JNIEnv *jEnv, jsobject obj, const char *name, jobject jobj); + + /** + * set member of a Native JSObject for a given index. + * + * @param obj - A Native JS Object. + * @param index - Index of a member. + * @param jobj - Value to set. If this is a basic data type, it is converted + * using standard JNI calls but if it is a wrapper to a JSObject + * then a internal mapping is consulted to convert to a NJSObject. + */ + NS_IMETHOD + SetSlot(JNIEnv *jEnv, jsobject obj, int slot, jobject jobj); + + /** + * remove member of a Native JSObject for a given name. + * + * @param obj - A Native JS Object. + * @param name - Name of a member. + */ + NS_IMETHOD + RemoveMember(JNIEnv *jEnv, jsobject obj, const char *name); + + /** + * call a method of Native JSObject. + * + * @param obj - A Native JS Object. + * @param name - Name of a method. + * @param jobjArr - Array of jobjects representing parameters of method being caled. + * @param pjobj - return value. + */ + NS_IMETHOD + Call(JNIEnv *jEnv, jsobject obj, const char *name, jobjectArray jobjArr, jobject *pjobj); + + /** + * Evaluate a script with a Native JS Object representing scope. + * + * @param obj - A Native JS Object. + * @param pNSIPrincipaArray - Array of principals to be used to compare privileges. + * @param numPrincipals - Number of principals being passed. + * @param script - Script to be executed. + * @param pjobj - return value. + */ + NS_IMETHOD + //Eval(JNIEnv *jEnv, jsobject obj, nsIPrincipal **pNSIPrincipaArray, PRInt32 numPrincipals, const char *script, jobject *pjobj); + Eval(JNIEnv *jEnv, jsobject obj, const char *script, jobject *pjobj); + + /** + * Get the window object for a plugin instance. + * + * @param pJavaObject - Either a jobject or a pointer to a plugin instance + * representing the java object. + * @param pjobj - return value. This is a native js object + * representing the window object of a frame + * in which a applet/bean resides. + */ + NS_IMETHOD + GetWindow(JNIEnv *jEnv, void *pJavaObject, jsobject *pobj); + + /** + * Get the window object for a plugin instance. + * + * @param jEnv - JNIEnv on which the call is being made. + * @param obj - A Native JS Object. + */ + NS_IMETHOD + FinalizeJSObject(JNIEnv *jEnv, jsobject obj); + + + //////////////////////////////////////////////////////////////////////////// + // from nsCLiveconnect: + + nsCLiveconnect(nsISupports *aOuter); + virtual ~nsCLiveconnect(void); + +protected: +}; + +#endif // nsCLiveconnect_h___ diff --git a/js/src/liveconnect/nsCLiveconnectFactory.cpp b/js/src/liveconnect/nsCLiveconnectFactory.cpp new file mode 100644 index 000000000000..8734d8d6951d --- /dev/null +++ b/js/src/liveconnect/nsCLiveconnectFactory.cpp @@ -0,0 +1,168 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ +/* + * This file is part of the Java-vendor-neutral implementation of LiveConnect + * + * It contains the implementation providing nsILiveconnect XP-COM interface. + * + */ +#include "prtypes.h" +#include "nspr.h" +#include "prmem.h" +#include "prmon.h" +#include "prlog.h" + +#include "nsCLiveconnect.h" +#include "nsCLiveconnectFactory.h" +#include "nsRepository.h" + +static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); +static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); +static NS_DEFINE_CID(kCLiveconnectCID, NS_CLIVECONNECT_CID); +static NS_DEFINE_IID(kILiveconnectIID, NS_ILIVECONNECT_IID); + +nsIFactory *nsCLiveconnectFactory::m_pNSIFactory = NULL; +nsCLiveconnect *nsCLiveconnectFactory::m_pNSCLiveconnect = NULL; + + + +/*+++++++++++++++++++++++++++++++++++++++++++++++++ + * NSGetFactory: + * Provides entry point to liveconnect dll. + +++++++++++++++++++++++++++++++++++++++++++++++++*/ + +extern "C" NS_EXPORT nsresult +NSGetFactory(const nsCID &aClass, nsIFactory **aFactory) +{ + + if (!aClass.Equals(kCLiveconnectCID)) { + return NS_ERROR_FACTORY_NOT_LOADED; // XXX right error? + } + nsCLiveconnectFactory* pCLiveConnectFactory = new nsCLiveconnectFactory(); + if (pCLiveConnectFactory == NULL) + return NS_ERROR_OUT_OF_MEMORY; + pCLiveConnectFactory->AddRef(); + *aFactory = pCLiveConnectFactory; + return NS_OK; +} + +extern "C" NS_EXPORT PRBool +NSCanUnload(void) +{ + return PR_FALSE; +} + + + + + + + +//////////////////////////////////////////////////////////////////////////// +// from nsISupports + +NS_METHOD +nsCLiveconnectFactory::QueryInterface(const nsIID& aIID, void** aInstancePtr) +{ + PR_ASSERT(NULL != aInstancePtr); + if (NULL == aInstancePtr) { + return NS_ERROR_NULL_POINTER; + } + if (aIID.Equals(kIFactoryIID) || + aIID.Equals(kISupportsIID)) { + *aInstancePtr = (void*) this; + AddRef(); + return NS_OK; + } + return NS_NOINTERFACE; +} + +NS_IMPL_ADDREF(nsCLiveconnectFactory) +NS_IMPL_RELEASE(nsCLiveconnectFactory) + + +//////////////////////////////////////////////////////////////////////////// +// from nsIFactory: + +NS_METHOD +nsCLiveconnectFactory::CreateInstance(nsISupports *aOuter, REFNSIID aIID, void **aResult) +{ + nsCLiveconnect *pNSCLiveconnect = NULL; + *aResult = NULL; + + if (aOuter && !aIID.Equals(kISupportsIID)) + return NS_NOINTERFACE; // XXX right error? + if (m_pNSCLiveconnect == NULL) + { + m_pNSCLiveconnect = new nsCLiveconnect(aOuter); + } + if (m_pNSCLiveconnect == NULL) + { + return NS_ERROR_FAILURE; + } + if (m_pNSCLiveconnect->QueryInterface(aIID, + (void**)aResult) != NS_OK) { + // then we're trying get a interface other than nsISupports and + // nsICapsManager + return NS_ERROR_FAILURE; + } + return NS_OK; +} + +NS_METHOD +nsCLiveconnectFactory::LockFactory(PRBool aLock) +{ + return NS_OK; +} + + + +//////////////////////////////////////////////////////////////////////////// +// from nsCLiveconnectFactory: + +nsCLiveconnectFactory::nsCLiveconnectFactory(void) +{ + if( m_pNSIFactory != NULL) + { + return; + } + + NS_INIT_REFCNT(); + nsresult err = NS_OK; + NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); + + err = this->QueryInterface(kIFactoryIID, (void**)&m_pNSIFactory); + if ( (err == NS_OK) && (m_pNSIFactory != NULL) ) + { + NS_DEFINE_CID(kCLiveconnectCID, NS_CLIVECONNECT_CID); + nsRepository::RegisterFactory(kCLiveconnectCID, m_pNSIFactory, + PR_FALSE); + } +} + +nsCLiveconnectFactory::~nsCLiveconnectFactory() +{ + if(mRefCnt == 0) + { + NS_DEFINE_CID(kCLiveconnectCID, NS_CLIVECONNECT_CID); + nsRepository::UnregisterFactory(kCLiveconnectCID, (nsIFactory *)m_pNSIFactory); + + } +} + + diff --git a/js/src/liveconnect/nsCLiveconnectFactory.h b/js/src/liveconnect/nsCLiveconnectFactory.h new file mode 100644 index 000000000000..4f5ea932dcd9 --- /dev/null +++ b/js/src/liveconnect/nsCLiveconnectFactory.h @@ -0,0 +1,59 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ +/* + * This file is part of the Java-vendor-neutral implementation of LiveConnect + * + * It contains the class definition to implement nsIFactory XP-COM interface. + * + */ + +#ifndef nsCLiveconnectFactory_h___ +#define nsCLiveconnectFactory_h___ + +#include "nsISupports.h" +#include "nsIFactory.h" + +class nsCLiveconnectFactory : public nsIFactory { +public: + //////////////////////////////////////////////////////////////////////////// + // from nsISupports and AggregatedQueryInterface: + + NS_DECL_ISUPPORTS + + //////////////////////////////////////////////////////////////////////////// + // from nsIFactory: + + NS_IMETHOD + CreateInstance(nsISupports *aOuter, REFNSIID aIID, void **aResult); + + NS_IMETHOD + LockFactory(PRBool aLock); + + + //////////////////////////////////////////////////////////////////////////// + // from nsCLiveconnectFactory: + + nsCLiveconnectFactory(void); + virtual ~nsCLiveconnectFactory(void); + +protected: + static nsIFactory *m_pNSIFactory; + static nsCLiveconnect *m_pNSCLiveconnect; +}; + +#endif // nsCLiveconnectFactory_h___ diff --git a/js/src/liveconnect/nsILiveconnect.h b/js/src/liveconnect/nsILiveconnect.h new file mode 100644 index 000000000000..63b07e6864d9 --- /dev/null +++ b/js/src/liveconnect/nsILiveconnect.h @@ -0,0 +1,158 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ +/* + * This file is part of the Java-vendor-neutral implementation of LiveConnect + * + * It contains the public XP-COM based interface for java to javascript communication. + * + */ + +#ifndef nsILiveconnect_h___ +#define nsILiveconnect_h___ + +#include "nsISupports.h" +#include "nsIFactory.h" +#include "nsIPrincipal.h" +#include "jni.h" + + +typedef jint jsobject; + +class nsILiveconnect : public nsISupports { +public: + /** + * get member of a Native JSObject for a given name. + * + * @param obj - A Native JS Object. + * @param name - Name of a member. + * @param pjobj - return parameter as a java object representing + * the member. If it is a basic data type it is converted to + * a corresponding java type. If it is a NJSObject, then it is + * wrapped up as java wrapper netscape.javascript.JSObject. + */ + NS_IMETHOD + GetMember(JNIEnv *jEnv, jsobject obj, const char *name, jobject *pjobj) = 0; + + /** + * get member of a Native JSObject for a given index. + * + * @param obj - A Native JS Object. + * @param index - Index of a member. + * @param pjobj - return parameter as a java object representing + * the member. + */ + NS_IMETHOD + GetSlot(JNIEnv *jEnv, jsobject obj, int index, jobject *pjobj) = 0; + + /** + * set member of a Native JSObject for a given name. + * + * @param obj - A Native JS Object. + * @param name - Name of a member. + * @param jobj - Value to set. If this is a basic data type, it is converted + * using standard JNI calls but if it is a wrapper to a JSObject + * then a internal mapping is consulted to convert to a NJSObject. + */ + NS_IMETHOD + SetMember(JNIEnv *jEnv, jsobject obj, const char *name, jobject jobj) = 0; + + /** + * set member of a Native JSObject for a given index. + * + * @param obj - A Native JS Object. + * @param index - Index of a member. + * @param jobj - Value to set. If this is a basic data type, it is converted + * using standard JNI calls but if it is a wrapper to a JSObject + * then a internal mapping is consulted to convert to a NJSObject. + */ + NS_IMETHOD + SetSlot(JNIEnv *jEnv, jsobject obj, int slot, jobject jobj) = 0; + + /** + * remove member of a Native JSObject for a given name. + * + * @param obj - A Native JS Object. + * @param name - Name of a member. + */ + NS_IMETHOD + RemoveMember(JNIEnv *jEnv, jsobject obj, const char *name) = 0; + + /** + * call a method of Native JSObject. + * + * @param obj - A Native JS Object. + * @param name - Name of a method. + * @param jobjArr - Array of jobjects representing parameters of method being caled. + * @param pjobj - return value. + */ + NS_IMETHOD + Call(JNIEnv *jEnv, jsobject obj, const char *name, jobjectArray jobjArr, jobject *pjobj) = 0; + + /** + * Evaluate a script with a Native JS Object representing scope. + * + * @param obj - A Native JS Object. + * @param pNSIPrincipaArray - Array of principals to be used to compare privileges. + * @param numPrincipals - Number of principals being passed. + * @param script - Script to be executed. + * @param pjobj - return value. + */ + NS_IMETHOD + //Eval(jsobject obj, nsIPrincipal **pNSIPrincipaArray, PRInt32 numPrincipals, const char *script, jobject *pjobj) = 0; + Eval(JNIEnv *jEnv, jsobject obj, const char *script, jobject *pjobj) = 0; + + /** + * Get the window object for a plugin instance. + * + * @param pJavaObject - Either a jobject or a pointer to a plugin instance + * representing the java object. + * @param pjobj - return value. This is a native js object + * representing the window object of a frame + * in which a applet/bean resides. + */ + NS_IMETHOD + GetWindow(JNIEnv *jEnv, void *pJavaObject, jsobject *pobj) = 0; + + /** + * Get the window object for a plugin instance. + * + * @param jEnv - JNIEnv on which the call is being made. + * @param obj - A Native JS Object. + */ + NS_IMETHOD + FinalizeJSObject(JNIEnv *jEnv, jsobject obj) = 0; + +}; + +#define NS_ILIVECONNECT_IID \ +{ /* 68190910-3318-11d2-97f0-00805f8a28d0 */ \ + 0x68190910, \ + 0x3318, \ + 0x11d2, \ + {0x97, 0xf0, 0x00, 0x80, 0x5f, 0x8a, 0x28, 0xd0} \ +}; + +#define NS_CLIVECONNECT_CID \ +{ /* b8f0cef0-3931-11d2-97f0-00805f8a28d0 */ \ + 0xb8f0cef0, \ + 0x3931, \ + 0x11d2, \ + {0x97, 0xf0, 0x00, 0x80, 0x5f, 0x8a, 0x28, 0xd0} \ +}; + +#endif // nsILiveconnect_h___