[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.19-706-ge5415e9
barraclough at apple.com
barraclough at apple.com
Thu Feb 4 21:28:19 UTC 2010
The following commit has been merged in the webkit-1.1 branch:
commit 50845780e79a5c2f8bd71889c240f3bf71e74513
Author: barraclough at apple.com <barraclough at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Tue Jan 26 22:00:38 2010 +0000
<<<<<<< .mine
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@53865 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 97828fb..1639cee 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,28 @@
+<<<<<<< .mine
+2010-01-25 Gavin Barraclough <barraclough at apple.com>
+
+ Reviewed by Anders Carlsson.
+
+ Some methods in JSC JNI bridge need more error checking of results from JNI.
+ https://bugs.webkit.org/show_bug.cgi?id=34149
+
+ In JNIUtility.h, callJNIMethodV<jobject> might return null (from CallObjectMethodV, via
+ JNICaller<jobject>::callV) if an exception is thrown. All clients of callJNIMethodV<jobject>
+ that are calling methods on the returned object should null check first.
+
+ * bridge/jni/JNIBridge.cpp:
+ (JavaField::JavaField):
+ (JavaMethod::JavaMethod):
+ * bridge/jni/JNIUtility.h:
+ (JSC::Bindings::):
+ * bridge/jni/jni_jsobject.mm:
+ (JavaJSObject::convertJObjectToValue):
+ * bridge/jni/jsc/JavaClassJSC.cpp:
+ (JavaClass::JavaClass):
+ * bridge/jni/jsc/JavaInstanceJSC.cpp:
+ (JavaInstance::stringValue):
+
+=======
2010-01-26 Steve Falkenburg <sfalken at apple.com>
Reviewed by Oliver Hunt.
@@ -340,6 +365,7 @@
(WebCore::XMLTokenizer::XMLTokenizer):
(WebCore::parseXMLDocumentFragment):
+>>>>>>> .r53864
2010-01-22 Jeremy Orlow <jorlow at chromium.org>
Reviewed by Darin Adler.
diff --git a/WebCore/bridge/jni/JNIBridge.cpp b/WebCore/bridge/jni/JNIBridge.cpp
index 4810e5f..3329ba8 100644
--- a/WebCore/bridge/jni/JNIBridge.cpp
+++ b/WebCore/bridge/jni/JNIBridge.cpp
@@ -55,32 +55,44 @@ JavaParameter::JavaParameter(JNIEnv* env, jstring type)
JavaMethod::JavaMethod(JNIEnv* env, jobject aMethod)
{
- // Get return type
- jobject returnType = callJNIMethod<jobject>(aMethod, "getReturnType", "()Ljava/lang/Class;");
- jstring returnTypeName = static_cast<jstring>(callJNIMethod<jobject>(returnType, "getName", "()Ljava/lang/String;"));
+ // Get return type name
+ jstring returnTypeName = 0;
+ if (jobject returnType = callJNIMethod<jobject>(aMethod, "getReturnType", "()Ljava/lang/Class;")) {
+ returnTypeName = static_cast<jstring>(callJNIMethod<jobject>(returnType, "getName", "()Ljava/lang/String;"));
+ if (!returnTypeName)
+ returnTypeName = env->NewStringUTF("<Unknown>");
+ env->DeleteLocalRef(returnType);
+ }
m_returnType = JavaString(env, returnTypeName);
m_JNIReturnType = JNITypeFromClassName(m_returnType.UTF8String());
- env->DeleteLocalRef(returnType);
env->DeleteLocalRef(returnTypeName);
// Get method name
jstring methodName = static_cast<jstring>(callJNIMethod<jobject>(aMethod, "getName", "()Ljava/lang/String;"));
+ if (!returnTypeName)
+ returnTypeName = env->NewStringUTF("<Unknown>");
m_name = JavaString(env, methodName);
env->DeleteLocalRef(methodName);
// Get parameters
- jarray jparameters = static_cast<jarray>(callJNIMethod<jobject>(aMethod, "getParameterTypes", "()[Ljava/lang/Class;"));
- m_numParameters = env->GetArrayLength(jparameters);
- m_parameters = new JavaParameter[m_numParameters];
-
- for (int i = 0; i < m_numParameters; i++) {
- jobject aParameter = env->GetObjectArrayElement(static_cast<jobjectArray>(jparameters), i);
- jstring parameterName = static_cast<jstring>(callJNIMethod<jobject>(aParameter, "getName", "()Ljava/lang/String;"));
- m_parameters[i] = JavaParameter(env, parameterName);
- env->DeleteLocalRef(aParameter);
- env->DeleteLocalRef(parameterName);
+ if (jarray jparameters = static_cast<jarray>(callJNIMethod<jobject>(aMethod, "getParameterTypes", "()[Ljava/lang/Class;"))) {
+ m_numParameters = env->GetArrayLength(jparameters);
+ m_parameters = new JavaParameter[m_numParameters];
+
+ for (int i = 0; i < m_numParameters; i++) {
+ jobject aParameter = env->GetObjectArrayElement(static_cast<jobjectArray>(jparameters), i);
+ jstring parameterName = static_cast<jstring>(callJNIMethod<jobject>(aParameter, "getName", "()Ljava/lang/String;"));
+ if (!parameterName)
+ parameterName = env->NewStringUTF("<Unknown>");
+ m_parameters[i] = JavaParameter(env, parameterName);
+ env->DeleteLocalRef(aParameter);
+ env->DeleteLocalRef(parameterName);
+ }
+ env->DeleteLocalRef(jparameters);
+ } else {
+ m_numParameters = 0;
+ m_parameters = 0;
}
- env->DeleteLocalRef(jparameters);
// Created lazily.
m_signature = 0;
diff --git a/WebCore/bridge/jni/JNIUtility.h b/WebCore/bridge/jni/JNIUtility.h
index 85c3533..c832ef3 100644
--- a/WebCore/bridge/jni/JNIUtility.h
+++ b/WebCore/bridge/jni/JNIUtility.h
@@ -81,11 +81,11 @@ template <typename T> struct JNICaller;
template<> struct JNICaller<void> {
static void callA(jobject obj, jmethodID mid, jvalue* args)
{
- return getJNIEnv()->CallVoidMethodA(obj, mid, args);
+ getJNIEnv()->CallVoidMethodA(obj, mid, args);
}
static void callV(jobject obj, jmethodID mid, va_list args)
{
- return getJNIEnv()->CallVoidMethodV(obj, mid, args);
+ getJNIEnv()->CallVoidMethodV(obj, mid, args);
}
};
diff --git a/WebCore/bridge/jni/jni_jsobject.mm b/WebCore/bridge/jni/jni_jsobject.mm
index de67711..603624f 100644
--- a/WebCore/bridge/jni/jni_jsobject.mm
+++ b/WebCore/bridge/jni/jni_jsobject.mm
@@ -128,7 +128,7 @@ static void dispatchToJavaScriptThread(JSObjectCallContext *context)
completionSource = CFRunLoopSourceCreate(NULL, 0, &sourceContext);
CFRunLoopAddSource(currentRunLoop, completionSource, kCFRunLoopDefaultMode);
- // Wakeup JavaScript access thread and make it do it's work.
+ // Wakeup JavaScript access thread and make it do its work.
CFRunLoopSourceSignal(_performJavaScriptSource);
if (CFRunLoopIsWaiting(_performJavaScriptRunLoop))
CFRunLoopWakeUp(_performJavaScriptRunLoop);
@@ -533,7 +533,7 @@ jobject JavaJSObject::convertValueToJObject(JSValue value) const
// 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.
+ // as its nativeHandle.
if (imp->classInfo() && strcmp(imp->classInfo()->className, "RuntimeObject") == 0) {
RuntimeObjectImp* runtimeImp = static_cast<RuntimeObjectImp*>(imp);
JavaInstance *runtimeInstance = static_cast<JavaInstance *>(runtimeImp->getInternalInstance());
@@ -552,7 +552,7 @@ jobject JavaJSObject::convertValueToJObject(JSValue value) const
nativeHandle = UndefinedHandle;
}
- // Now create the Java JavaJSObject. Look for the JavaJSObject in it's new (Tiger)
+ // Now create the Java JavaJSObject. Look for the JavaJSObject in its new (Tiger)
// location and in the original Java 1.4.2 location.
jclass JSObjectClass;
@@ -580,30 +580,31 @@ JSValue JavaJSObject::convertJObjectToValue(ExecState* exec, jobject theObject)
// 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;");
-
+ if (!classOfInstance) {
+ JSLock lock(SilenceAssertionsOnly);
+ return JavaInstance::create(theObject, _rootObject)->createRuntimeObject(exec);
+ }
+
// 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;
+ jstring className = (jstring)callJNIMethod<jobject>(classOfInstance, "getName", "()Ljava/lang/String;");
+ if (!className || (strcmp(JavaString(className).UTF8String(), "sun.plugin.javascript.webkit.JSObject") != 0)) {
+ JSLock lock(SilenceAssertionsOnly);
+ return JavaInstance::create(theObject, _rootObject)->createRuntimeObject(exec);
}
- JSLock lock(SilenceAssertionsOnly);
-
- return JavaInstance::create(theObject, _rootObject)->createRuntimeObject(exec);
+ // 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;
}
void JavaJSObject::getListFromJArray(ExecState* exec, jobjectArray jArray, MarkedArgumentBuffer& list) const
diff --git a/WebCore/bridge/jni/jsc/JNIBridgeJSC.cpp b/WebCore/bridge/jni/jsc/JNIBridgeJSC.cpp
index 4bc6c47..4e1b0d2 100644
--- a/WebCore/bridge/jni/jsc/JNIBridgeJSC.cpp
+++ b/WebCore/bridge/jni/jsc/JNIBridgeJSC.cpp
@@ -49,14 +49,20 @@ using namespace JSC::Bindings;
JavaField::JavaField(JNIEnv* env, jobject aField)
{
- // Get field type
- jobject fieldType = callJNIMethod<jobject>(aField, "getType", "()Ljava/lang/Class;");
- jstring fieldTypeName = static_cast<jstring>(callJNIMethod<jobject>(fieldType, "getName", "()Ljava/lang/String;"));
+ // Get field type name
+ jstring fieldTypeName = 0;
+ if (jobject fieldType = callJNIMethod<jobject>(aField, "getType", "()Ljava/lang/Class;"))
+ fieldTypeName = static_cast<jstring>(callJNIMethod<jobject>(fieldType, "getName", "()Ljava/lang/String;"));
+ if (!fieldTypeName)
+ fieldTypeName = env->NewStringUTF("<Unknown>");
m_type = JavaString(env, fieldTypeName);
+
m_JNIType = JNITypeFromClassName(m_type.UTF8String());
// Get field name
jstring fieldName = static_cast<jstring>(callJNIMethod<jobject>(aField, "getName", "()Ljava/lang/String;"));
+ if (!fieldName)
+ fieldName = env->NewStringUTF("<Unknown>");
m_name = JavaString(env, fieldName);
m_field = new JObjectWrapper(aField);
diff --git a/WebCore/bridge/jni/jsc/JavaClassJSC.cpp b/WebCore/bridge/jni/jsc/JavaClassJSC.cpp
index 350c8ae..bbe3871 100644
--- a/WebCore/bridge/jni/jsc/JavaClassJSC.cpp
+++ b/WebCore/bridge/jni/jsc/JavaClassJSC.cpp
@@ -41,52 +41,57 @@ JavaClass::JavaClass(jobject anInstance)
if (!aClass) {
fprintf(stderr, "%s: unable to call getClass on instance %p\n", __PRETTY_FUNCTION__, anInstance);
+ m_name = strdup("<Unknown>");
return;
}
- jstring className = (jstring)callJNIMethod<jobject>(aClass, "getName", "()Ljava/lang/String;");
- const char* classNameC = getCharactersFromJString(className);
- m_name = strdup(classNameC);
- releaseCharactersForJString(className, classNameC);
+ if (jstring className = (jstring)callJNIMethod<jobject>(aClass, "getName", "()Ljava/lang/String;")) {
+ const char* classNameC = getCharactersFromJString(className);
+ m_name = strdup(classNameC);
+ releaseCharactersForJString(className, classNameC);
+ } else
+ m_name = strdup("<Unknown>");
int i;
JNIEnv* env = getJNIEnv();
// Get the fields
- jarray fields = (jarray)callJNIMethod<jobject>(aClass, "getFields", "()[Ljava/lang/reflect/Field;");
- int numFields = env->GetArrayLength(fields);
- for (i = 0; i < numFields; i++) {
- jobject aJField = env->GetObjectArrayElement((jobjectArray)fields, i);
- JavaField* aField = new JavaField(env, aJField); // deleted in the JavaClass destructor
- {
- JSLock lock(SilenceAssertionsOnly);
- m_fields.set(((UString)aField->name()).rep(), aField);
+ if (jarray fields = (jarray)callJNIMethod<jobject>(aClass, "getFields", "()[Ljava/lang/reflect/Field;")) {
+ int numFields = env->GetArrayLength(fields);
+ for (i = 0; i < numFields; i++) {
+ jobject aJField = env->GetObjectArrayElement((jobjectArray)fields, i);
+ JavaField* aField = new JavaField(env, aJField); // deleted in the JavaClass destructor
+ {
+ JSLock lock(SilenceAssertionsOnly);
+ m_fields.set(((UString)aField->name()).rep(), aField);
+ }
+ env->DeleteLocalRef(aJField);
}
- env->DeleteLocalRef(aJField);
+ env->DeleteLocalRef(fields);
}
// Get the methods
- jarray methods = (jarray)callJNIMethod<jobject>(aClass, "getMethods", "()[Ljava/lang/reflect/Method;");
- int numMethods = env->GetArrayLength(methods);
- for (i = 0; i < numMethods; i++) {
- jobject aJMethod = env->GetObjectArrayElement((jobjectArray)methods, i);
- JavaMethod* aMethod = new JavaMethod(env, aJMethod); // deleted in the JavaClass destructor
- MethodList* methodList;
- {
- JSLock lock(SilenceAssertionsOnly);
-
- methodList = m_methods.get(((UString)aMethod->name()).rep());
- if (!methodList) {
- methodList = new MethodList();
- m_methods.set(((UString)aMethod->name()).rep(), methodList);
+ if (jarray methods = (jarray)callJNIMethod<jobject>(aClass, "getMethods", "()[Ljava/lang/reflect/Method;")) {
+ int numMethods = env->GetArrayLength(methods);
+ for (i = 0; i < numMethods; i++) {
+ jobject aJMethod = env->GetObjectArrayElement((jobjectArray)methods, i);
+ JavaMethod* aMethod = new JavaMethod(env, aJMethod); // deleted in the JavaClass destructor
+ MethodList* methodList;
+ {
+ JSLock lock(SilenceAssertionsOnly);
+
+ methodList = m_methods.get(((UString)aMethod->name()).rep());
+ if (!methodList) {
+ methodList = new MethodList();
+ m_methods.set(((UString)aMethod->name()).rep(), methodList);
+ }
}
+ methodList->append(aMethod);
+ env->DeleteLocalRef(aJMethod);
}
- methodList->append(aMethod);
- env->DeleteLocalRef(aJMethod);
+ env->DeleteLocalRef(methods);
}
- env->DeleteLocalRef(fields);
- env->DeleteLocalRef(methods);
env->DeleteLocalRef(aClass);
}
diff --git a/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp b/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp
index aab0d5c..aaa79b8 100644
--- a/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp
+++ b/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp
@@ -90,6 +90,11 @@ JSValue JavaInstance::stringValue(ExecState* exec) const
JSLock lock(SilenceAssertionsOnly);
jstring stringValue = (jstring)callJNIMethod<jobject>(m_instance->m_instance, "toString", "()Ljava/lang/String;");
+
+ // Should throw a JS exception, rather than returning ""? - but better than a null dereference.
+ if (!stringValue)
+ return jsString(exec, UString());
+
JNIEnv* env = getJNIEnv();
const jchar* c = getUCharactersFromJStringInEnv(env, stringValue);
UString u((const UChar*)c, (int)env->GetStringLength(stringValue));
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list