📄 jni_jsobject.mm
字号:
ExecState* exec = rootObject->globalObject()->globalExec(); JSLock lock(false); PutPropertySlot slot; _imp->put(exec, Identifier(exec, JavaString(memberName)), convertJObjectToValue(exec, value), slot);}void JavaJSObject::removeMember(jstring memberName) const{ JS_LOG ("memberName = %s\n", JavaString(memberName).UTF8String()); RootObject* rootObject = this->rootObject(); if (!rootObject) return; ExecState* exec = rootObject->globalObject()->globalExec(); JSLock lock(false); _imp->deleteProperty(exec, Identifier(exec, JavaString(memberName)));}jobject JavaJSObject::getSlot(jint index) const{#ifdef __LP64__ JS_LOG ("index = %d\n", index);#else JS_LOG ("index = %ld\n", index);#endif RootObject* rootObject = this->rootObject(); if (!rootObject) return 0; ExecState* exec = rootObject->globalObject()->globalExec(); JSLock lock(false); JSValuePtr result = _imp->get(exec, index); return convertValueToJObject(result);}void JavaJSObject::setSlot(jint index, jobject value) const{#ifdef __LP64__ JS_LOG ("index = %d, value = %p\n", index, value);#else JS_LOG ("index = %ld, value = %p\n", index, value);#endif RootObject* rootObject = this->rootObject(); if (!rootObject) return; ExecState* exec = rootObject->globalObject()->globalExec(); JSLock lock(false); _imp->put(exec, (unsigned)index, convertJObjectToValue(exec, value));}jstring JavaJSObject::toString() const{ JS_LOG ("\n"); RootObject* rootObject = this->rootObject(); if (!rootObject) return 0; JSLock lock(false); JSObject *thisObj = const_cast<JSObject*>(_imp); ExecState* exec = rootObject->globalObject()->globalExec(); return (jstring)convertValueToJValue (exec, thisObj, object_type, "java.lang.String").l;}void JavaJSObject::finalize() const{ if (RootObject* rootObject = this->rootObject()) rootObject->gcUnprotect(_imp);}static PassRefPtr<RootObject> createRootObject(void* nativeHandle){ Frame* frame = 0; for (NSView *view = (NSView *)nativeHandle; view; view = [view superview]) { if ([view conformsToProtocol:@protocol(WebCoreFrameView)]) { NSView<WebCoreFrameView> *webCoreFrameView = static_cast<NSView<WebCoreFrameView>*>(view); frame = [webCoreFrameView _web_frame]; break; } } if (!frame) return 0; return frame->script()->createRootObject(nativeHandle);}// We're either creating a 'Root' object (via a call to JavaJSObject.getWindow()), or// another JavaJSObject.jlong JavaJSObject::createNative(jlong nativeHandle){ JS_LOG ("nativeHandle = %d\n", (int)nativeHandle); if (nativeHandle == UndefinedHandle) return nativeHandle; if (findProtectingRootObject(jlong_to_impptr(nativeHandle))) return nativeHandle; RefPtr<RootObject> rootObject = createRootObject(jlong_to_ptr(nativeHandle)); // If rootObject is !NULL We must have been called via netscape.javascript.JavaJSObject.getWindow(), // otherwise we are being called after creating a JavaJSObject in // JavaJSObject::convertValueToJObject(). if (rootObject) { JSObject* globalObject = rootObject->globalObject(); // We call gcProtect here to get the object into the root object's "protect set" which // is used to test if a native handle is valid as well as getting the root object given the handle. rootObject->gcProtect(globalObject); return ptr_to_jlong(globalObject); } return nativeHandle;}jobject JavaJSObject::convertValueToJObject(JSValuePtr value) const{ JSLock lock(false); RootObject* rootObject = this->rootObject(); if (!rootObject) return 0; ExecState* exec = rootObject->globalObject()->globalExec(); JNIEnv *env = getJNIEnv(); jobject result = 0; // See section 22.7 of 'JavaScript: The Definitive Guide, 4th Edition', // figure 22-5. // number -> java.lang.Double // string -> java.lang.String // boolean -> java.lang.Boolean // Java instance -> Java instance // Everything else -> JavaJSObject if (value.isNumber()) { jclass JSObjectClass = env->FindClass ("java/lang/Double"); jmethodID constructorID = env->GetMethodID (JSObjectClass, "<init>", "(D)V"); if (constructorID != NULL) { result = env->NewObject (JSObjectClass, constructorID, (jdouble)value.toNumber(exec)); } } else if (value.isString()) { UString stringValue = value.toString(exec); JNIEnv *env = getJNIEnv(); result = env->NewString ((const jchar *)stringValue.data(), stringValue.size()); } else if (value.isBoolean()) { jclass JSObjectClass = env->FindClass ("java/lang/Boolean"); jmethodID constructorID = env->GetMethodID (JSObjectClass, "<init>", "(Z)V"); if (constructorID != NULL) { result = env->NewObject (JSObjectClass, constructorID, (jboolean)value.toBoolean(exec)); } } else { // Create a JavaJSObject. jlong nativeHandle; if (value.isObject()) { JSObject* imp = asObject(value); // We either have a wrapper around a Java instance or a JavaScript // object. If we have a wrapper around a Java instance, return that // instance, otherwise create a new Java JavaJSObject with the JSObject* // as it's nativeHandle. if (imp->classInfo() && strcmp(imp->classInfo()->className, "RuntimeObject") == 0) { RuntimeObjectImp* runtimeImp = static_cast<RuntimeObjectImp*>(imp); JavaInstance *runtimeInstance = static_cast<JavaInstance *>(runtimeImp->getInternalInstance()); if (!runtimeInstance) return 0; return runtimeInstance->javaInstance(); } else { nativeHandle = ptr_to_jlong(imp); rootObject->gcProtect(imp); } } // All other types will result in an undefined object. else { nativeHandle = UndefinedHandle; } // Now create the Java JavaJSObject. Look for the JavaJSObject in it's new (Tiger) // location and in the original Java 1.4.2 location. jclass JSObjectClass; JSObjectClass = env->FindClass ("sun/plugin/javascript/webkit/JSObject"); if (!JSObjectClass) { env->ExceptionDescribe(); env->ExceptionClear(); JSObjectClass = env->FindClass ("apple/applet/JSObject"); } jmethodID constructorID = env->GetMethodID (JSObjectClass, "<init>", "(J)V"); if (constructorID != NULL) { result = env->NewObject (JSObjectClass, constructorID, nativeHandle); } } return result;}JSValuePtr JavaJSObject::convertJObjectToValue(ExecState* exec, jobject theObject) const{ // Instances of netscape.javascript.JSObject get converted back to // JavaScript objects. All other objects are wrapped. It's not // possible to pass primitive types from the Java to JavaScript. // See section 22.7 of 'JavaScript: The Definitive Guide, 4th Edition', // figure 22-4. jobject classOfInstance = callJNIMethod<jobject>(theObject, "getClass", "()Ljava/lang/Class;"); jstring className = (jstring)callJNIMethod<jobject>(classOfInstance, "getName", "()Ljava/lang/String;"); // Only the sun.plugin.javascript.webkit.JSObject has a member called nativeJSObject. This class is // created above to wrap internal browser objects. The constructor of this class takes the native // pointer and stores it in this object, so that it can be retrieved below. if (strcmp(JavaString(className).UTF8String(), "sun.plugin.javascript.webkit.JSObject") == 0) { // Pull the nativeJSObject value from the Java instance. This is a // pointer to the JSObject. JNIEnv *env = getJNIEnv(); jfieldID fieldID = env->GetFieldID((jclass)classOfInstance, "nativeJSObject", "J"); if (fieldID == NULL) { return jsUndefined(); } jlong nativeHandle = env->GetLongField(theObject, fieldID); if (nativeHandle == UndefinedHandle) { return jsUndefined(); } JSObject *imp = static_cast<JSObject*>(jlong_to_impptr(nativeHandle)); return imp; } JSLock lock(false); return JavaInstance::create(theObject, _rootObject)->createRuntimeObject(exec);}void JavaJSObject::getListFromJArray(ExecState* exec, jobjectArray jArray, ArgList& list) const{ JNIEnv *env = getJNIEnv(); int numObjects = jArray ? env->GetArrayLength(jArray) : 0; for (int i = 0; i < numObjects; i++) { jobject anObject = env->GetObjectArrayElement ((jobjectArray)jArray, i); if (anObject) { list.append(convertJObjectToValue(exec, anObject)); env->DeleteLocalRef (anObject); } else { env->ExceptionDescribe(); env->ExceptionClear(); } }}extern "C" {jlong KJS_JSCreateNativeJSObject (JNIEnv*, jclass, jstring, jlong nativeHandle, jboolean){ JSObjectCallContext context; context.type = CreateNative; context.nativeHandle = nativeHandle; return JavaJSObject::invoke (&context).j;}void KJS_JSObject_JSFinalize (JNIEnv*, jclass, jlong nativeHandle){ JSObjectCallContext context; context.type = Finalize; context.nativeHandle = nativeHandle; JavaJSObject::invoke (&context);}jobject KJS_JSObject_JSObjectCall (JNIEnv*, jclass, jlong nativeHandle, jstring, jstring methodName, jobjectArray args, jboolean){ JSObjectCallContext context; context.type = Call; context.nativeHandle = nativeHandle; context.string = methodName; context.args = args; return JavaJSObject::invoke (&context).l;}jobject KJS_JSObject_JSObjectEval (JNIEnv*, jclass, jlong nativeHandle, jstring, jstring jscript, jboolean){ JSObjectCallContext context; context.type = Eval; context.nativeHandle = nativeHandle; context.string = jscript; return JavaJSObject::invoke (&context).l;}jobject KJS_JSObject_JSObjectGetMember (JNIEnv*, jclass, jlong nativeHandle, jstring, jstring jname, jboolean){ JSObjectCallContext context; context.type = GetMember; context.nativeHandle = nativeHandle; context.string = jname; return JavaJSObject::invoke (&context).l;}void KJS_JSObject_JSObjectSetMember (JNIEnv*, jclass, jlong nativeHandle, jstring, jstring jname, jobject value, jboolean){ JSObjectCallContext context; context.type = SetMember; context.nativeHandle = nativeHandle; context.string = jname; context.value = value; JavaJSObject::invoke (&context);}void KJS_JSObject_JSObjectRemoveMember (JNIEnv*, jclass, jlong nativeHandle, jstring, jstring jname, jboolean){ JSObjectCallContext context; context.type = RemoveMember; context.nativeHandle = nativeHandle; context.string = jname; JavaJSObject::invoke (&context);}jobject KJS_JSObject_JSObjectGetSlot (JNIEnv*, jclass, jlong nativeHandle, jstring, jint jindex, jboolean){ JSObjectCallContext context; context.type = GetSlot; context.nativeHandle = nativeHandle; context.index = jindex; return JavaJSObject::invoke (&context).l;}void KJS_JSObject_JSObjectSetSlot (JNIEnv*, jclass, jlong nativeHandle, jstring, jint jindex, jobject value, jboolean){ JSObjectCallContext context; context.type = SetSlot; context.nativeHandle = nativeHandle; context.index = jindex; context.value = value; JavaJSObject::invoke (&context);}jstring KJS_JSObject_JSObjectToString (JNIEnv*, jclass, jlong nativeHandle){ JSObjectCallContext context; context.type = ToString; context.nativeHandle = nativeHandle; return (jstring)JavaJSObject::invoke (&context).l;}}#endif // ENABLE(MAC_JAVA_BRIDGE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -