⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nscliveconnect.cpp

📁 caffeine-monkey java实现的js模拟引擎
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/** * 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, lcjsobject obj, jint slot, jobject java_obj,  void* principalsArray[],                      int numPrincipals, nsISupports *securitySupports){    if(jEnv == NULL || obj == 0)    {       return NS_ERROR_FAILURE;    }    JSJavaThreadState *jsj_env        = NULL;    JSObjectHandle    *handle         = (JSObjectHandle*)obj;    JSObject          *js_obj         = handle->js_obj;    JSContext         *cx             = NULL;    jsval              js_val;    JSErrorReporter    saved_state    = NULL;    jsj_env = jsj_enter_js(jEnv, mJavaClient, NULL, &cx, NULL, &saved_state, principalsArray, numPrincipals, securitySupports);    if (!jsj_env)        return NS_ERROR_FAILURE;    AutoPushJSContext autopush(securitySupports, cx);    if (NS_FAILED(autopush.ResultOfPush()))        goto done;        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, lcjsobject obj, const jchar *name, jsize length,  void* principalsArray[],                              int numPrincipals, nsISupports *securitySupports){    if(jEnv == NULL || obj == 0)    {       return NS_ERROR_FAILURE;    }    JSJavaThreadState *jsj_env        = NULL;    JSObjectHandle    *handle         = (JSObjectHandle*)obj;    JSObject          *js_obj         = handle->js_obj;    JSContext         *cx             = NULL;    jsval              js_val;    JSErrorReporter    saved_state    = NULL;    jsj_env = jsj_enter_js(jEnv, mJavaClient, NULL, &cx, NULL, &saved_state, principalsArray, numPrincipals, securitySupports);    if (!jsj_env)        return NS_ERROR_FAILURE;    AutoPushJSContext autopush(securitySupports, cx);    if (NS_FAILED(autopush.ResultOfPush()))        goto done;        if (!name) {        JS_ReportError(cx, "illegal null member name");        goto done;    }    JS_DeleteUCProperty2(cx, js_obj, name, length, &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, lcjsobject obj, const jchar *name, jsize length, jobjectArray java_args, void* principalsArray[],                      int numPrincipals, nsISupports *securitySupports, jobject *pjobj){    if(jEnv == NULL || obj == 0)    {       return NS_ERROR_FAILURE;    }    int                i              = 0;    int                argc           = 0;    int                arg_num        = 0;    jsval             *argv           = 0;    JSJavaThreadState *jsj_env        = NULL;    JSObjectHandle    *handle         = (JSObjectHandle*)obj;    JSObject          *js_obj         = handle->js_obj;    JSContext         *cx             = NULL;    jsval              js_val;    jsval              function_val   = 0;    int                dummy_cost     = 0;    JSBool             dummy_bool     = PR_FALSE;    JSErrorReporter    saved_state    = NULL;    jobject            result         = NULL;    jsj_env = jsj_enter_js(jEnv, mJavaClient, NULL, &cx, NULL, &saved_state, principalsArray, numPrincipals, securitySupports);    if (!jsj_env)        return NS_ERROR_FAILURE;    result = NULL;    AutoPushJSContext autopush(securitySupports, cx);    if (NS_FAILED(autopush.ResultOfPush()))        goto done;        if (!name) {        JS_ReportError(cx, "illegal null JavaScript function name");        goto done;    }    /* Allocate space for JS arguments */    argc = java_args ? jEnv->GetArrayLength(java_args) : 0;    if (argc) {        argv = (jsval*)JS_malloc(cx, argc * sizeof(jsval));        if (!argv)            goto done;    } else {        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);        JSBool ret = jsj_ConvertJavaObjectToJSValue(cx, jEnv, arg, &argv[arg_num]);		        jEnv->DeleteLocalRef(arg);        if (!ret)            goto cleanup_argv;        JS_AddRoot(cx, &argv[arg_num]);    }    if (!JS_GetUCProperty(cx, js_obj, name, length, &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;}NS_METHOD	nsCLiveconnect::Eval(JNIEnv *jEnv, lcjsobject obj, const jchar *script, jsize length, void* principalsArray[],                      int numPrincipals, nsISupports *securitySupports, jobject *pjobj){    if(jEnv == NULL || obj == 0)    {       return NS_ERROR_FAILURE;    }    JSJavaThreadState *jsj_env        = NULL;    JSObjectHandle    *handle         = (JSObjectHandle*)obj;    JSObject          *js_obj         = handle->js_obj;    JSContext         *cx             = NULL;    jsval              js_val;    int                dummy_cost     = 0;    JSBool             dummy_bool     = PR_FALSE;    JSErrorReporter    saved_state    = NULL;    jobject            result         = NULL;	const char		  *codebase       = NULL;    JSPrincipals      *principals     = NULL;    JSBool             eval_succeeded = PR_FALSE;    jsj_env = jsj_enter_js(jEnv, mJavaClient, NULL, &cx, NULL, &saved_state, principalsArray, numPrincipals, securitySupports);    if (!jsj_env)       return NS_ERROR_FAILURE;    result = NULL;    AutoPushJSContext autopush(securitySupports, cx);    if (NS_FAILED(autopush.ResultOfPush()))        goto done;        if (!script) {        JS_ReportError(cx, "illegal null string eval argument");        goto done;    }    /* Set up security stuff */    if (JSJ_callbacks && JSJ_callbacks->get_JSPrincipals_from_java_caller)        principals = JSJ_callbacks->get_JSPrincipals_from_java_caller(jEnv, cx, principalsArray, numPrincipals, securitySupports);    codebase = principals ? principals->codebase : NULL;    /* Have the JS engine evaluate the unicode string */    eval_succeeded = JS_EvaluateUCScriptForPrincipals(cx, js_obj, principals,                                                      script, length,                                                      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 (principals)        JSPRINCIPALS_DROP(cx, principals);    if (!jsj_exit_js(cx, jsj_env, saved_state))       return NS_ERROR_FAILURE;        *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,  void* principalsArray[],                      int numPrincipals, nsISupports *securitySupports, lcjsobject *pobj){    if(jEnv == NULL || JSJ_callbacks == NULL)    {       return NS_ERROR_FAILURE;    }    // associate this Java client with this LiveConnect connection.    mJavaClient = pJavaObject;    char              *err_msg        = NULL;    JSContext         *cx             = NULL;    JSObject          *js_obj         = NULL;    JSErrorReporter    saved_state    = NULL;    JSJavaThreadState *jsj_env        = NULL;    JSObjectHandle    *handle         = NULL;    jsj_env = jsj_enter_js(jEnv, mJavaClient, NULL, &cx, NULL, &saved_state, principalsArray, numPrincipals, securitySupports);    if (!jsj_env)       return NS_ERROR_FAILURE;    err_msg = NULL;    AutoPushJSContext autopush(securitySupports, cx);    if (NS_FAILED(autopush.ResultOfPush()))        goto done;        js_obj = JSJ_callbacks->map_java_object_to_js_object(jEnv, mJavaClient, &err_msg);    if (!js_obj) {        if (err_msg) {            JS_ReportError(cx, err_msg);            free(err_msg);        }        goto done;    }#ifdef PRESERVE_JSOBJECT_IDENTITY    *pobj = (jint)js_obj;#else	/* FIXME:  to handle PRESERVE_JSOBJECT_IDENTITY case, this needs to    just return a raw JSObject reference. FIXME !!! */    /* Create a tiny stub object to act as the GC root that points to the       JSObject from its netscape.javascript.JSObject counterpart. */    handle = (JSObjectHandle*)JS_malloc(cx, sizeof(JSObjectHandle));    if (handle != NULL)    {      handle->js_obj = js_obj;      handle->rt = JS_GetRuntime(cx);    }    *pobj = (lcjsobject)handle;    /* FIXME:  what if the window is explicitly disposed of, how do we       notify Java? */#endifdone:    if (!jsj_exit_js(cx, jsj_env, saved_state))       return NS_ERROR_FAILURE;    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, lcjsobject obj){    if(jEnv == NULL || obj == 0)    {       return NS_ERROR_FAILURE;    }    JSObjectHandle    *handle         = (JSObjectHandle *)obj;        if (!handle)        return NS_ERROR_NULL_POINTER;    JS_RemoveRootRT(handle->rt, &handle->js_obj);    free(handle);    return NS_OK;}NS_METHOD	nsCLiveconnect::ToString(JNIEnv *jEnv, lcjsobject obj, jstring *pjstring){    if(jEnv == NULL || obj == 0)    {       return NS_ERROR_FAILURE;    }    JSJavaThreadState *jsj_env        = NULL;    JSObjectHandle    *handle         = (JSObjectHandle*)obj;    JSObject          *js_obj         = handle->js_obj;    JSContext         *cx             = NULL;    JSErrorReporter    saved_state    = NULL;    jstring            result         = NULL;    JSString          *jsstr          = NULL;    jsj_env = jsj_enter_js(jEnv, mJavaClient, NULL, &cx, NULL, &saved_state, NULL, 0, NULL );    if (!jsj_env)       return NS_ERROR_FAILURE;    result = NULL;    AutoPushJSContext autopush(nsnull, cx);    if (NS_FAILED(autopush.ResultOfPush()))        return NS_ERROR_FAILURE;    jsstr = JS_ValueToString(cx, OBJECT_TO_JSVAL(js_obj));    if (jsstr)        result = jsj_ConvertJSStringToJavaString(cx, jEnv, jsstr);    if (!result)        result = jEnv->NewStringUTF("*JavaObject*");    if (!jsj_exit_js(cx, jsj_env, saved_state))        return NS_ERROR_FAILURE;    *pjstring = result;         return NS_OK;}////////////////////////////////////////////////////////////////////////////// from nsCLiveconnect:nsCLiveconnect::nsCLiveconnect(nsISupports *aOuter)    :   mJavaClient(NULL){    NS_INIT_AGGREGATED(aOuter);#ifdef PRESERVE_JSOBJECT_IDENTITY    jsj_init_js_obj_reflections_table();#endif}nsCLiveconnect::~nsCLiveconnect(){}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -