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

📄 jni_jsobject.mm

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 MM
📖 第 1 页 / 共 2 页
字号:
    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 + -